`
ScotTina
  • 浏览: 9715 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

另辟蹊径-检查memcached中指定的key是否存在

阅读更多

    我们都知道,memcached的协议中是没有任何一个协议提供给我们检查某个key是否存在的。但是我们可能会有这样的需求。

 

    一些开源的客户端提供了KeyExists()这样的方法,但是其实现原理是调用了memcached的get协议,以此来达到判断某个key是否存在的目的:能取到表示这个key存在,取不到则不存在。这样的效率是比较低的,特别是当数据包比较大的情况下。

 

    在不读取memcached的数据的情况下,如何高效的判断某个key是否存在呢?

 

    大家都知道memcached的cas(check and set)协议吧,该协议在写memcached时先判断是否有人在你之前更新过数据,如果有更新过,则此次写memcached失败。

 

    那我们来看一下cas的语法:

 

    cas key flag exptime bytes version\r\n

 

    其中的version是memcached内部维护的一个版本号,是个uint64_t的值,这个值是调用memcached的gets协议获得的,version从1开始,memcached刚启动的时候,节点数为0,从存储第一个节点开始,version不断累加。因此,version是不可能出现0这个情况,这点很重要,是达到我们的目的的一个关键点。

 

    好了,我们已经知道了cas的用法,根据它的特性可以实现我们检查一个key是否存在的目的,聪明的读者可能已经知道该怎么做了吧。

 

    比如要检查foo这个key是否存在,可以构造这样的命令

   

    cas foo 0 0 1 0\r\n

 

    这里构造一个字节的数据包,将version字段设置成0,尝试写memcached。

 

    如果foo已经存在,因为它的version不可能等于0,所以memcached提示EXISTS

    如果foo不存在,memcached提示NOT_FOUND

 

------------------------------------------

    set foo 0 0 3                # 先写入
    bar
    STORED
    cas foo 0 0 1 0             # 判断foo是否存在,系统提示EXISTS
    a
    EXISTS
    delete foo                     # 将foo删除
    DELETED
    cas foo 0 0 1 0             # 判断foo是否存在,系统提示NOT_FOUND
    a
    NOT_FOUND

------------------------------------------

 

    这样,我们就知道foo这个key是否存在了。

分享到:
评论
1 楼 malphi 2010-06-07  
的确另辟蹊径。不过貌似找key的需求非常少

相关推荐

    MSM--memcached session manager(memcached+tomcat7共享session所需jar包)

    MSM--memcached session manager是一个高可用的Tomcat session共享解决方案,除了可以从本机内存快速读取Session信息(仅针对黏性Session)外,同时可使用memcached存取Session,以实现高可用。对于非黏性Session,...

    python-memcached python-memcached

    Memcached是一种高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。Python-memcached库则为Python开发者提供了一个简单易用的接口,能够方便地将数据存储和检索到...

    php-memcached-3.1.3.tar.gz

    安装php-memcached扩展 https://github.com/php-memcached-dev/php-memcached tar -zxvf ...

    spring-mybatis-memcached.zip_Memcached java_annotation_mybatis_m

    ssm3-mybatis2-memcached 使用了 simple-spring-memcached 。因为 mybatis-memcached 不支持 MyBatis2(iBatis),只能用在 MyBatis3 里。但是因为有的项目还跑在 MyBatis2 版本上,所以也做一个例子。 mm-mybatis3-...

    Nagios-Plugins-Memcached-0.02.tar.gz

    这里`check_command`指定的是插件命令,`check_memcached`是插件名称,`localhost`是Memcached服务器地址,`-w`和`-c`分别设置警告和临界阈值。 4. **测试插件**:在Nagios服务器上,可以先手动运行插件检查...

    java-memcached-2.6.6.jar

    java-memcached-2.6.6.jar

    cas-client-support-distributed-memcached-3.2.0.jar

    cas-client-support-distributed-memcached-3.2.0.jar

    simple-spring-memcached集成memcache

    <artifactId>spring-data-keyvalue <version>2.2.4.RELEASE <groupId>net.sf.ssm</groupId> <artifactId>simple-spring-memcached <version>3.7.1 ``` 2. **配置Memcached服务器**:在应用的配置文件...

    hibernate-memcached包

    **hibernate-memcached包** 是一个专为Hibernate框架设计的扩展,目的是将流行的分布式内存缓存系统Memcached整合到Hibernate中,作为其二级缓存解决方案。在大型分布式应用中,缓存技术是提高性能的关键,特别是...

    python-memcached-latest.tar

    Memcached是一种高性能、分布式内存对象缓存系统,用于减少数据库负载,通过在内存中存储数据来加速网络应用。这个`python-memcached-latest.tar`压缩包包含了最新的Python绑定版本,即`python-memcached-1.53`。 *...

    simple-spring-memcached

    Simple-Spring-Memcached(SSM)是将Memcached缓存系统与Spring框架紧密结合的一个优秀项目,它提供了一种优雅的方式来实现基于注解的缓存管理,极大地简化了Java开发者在Spring应用中使用Memcached的过程。...

    memcached-1.5.4

    `memcached`是一款高性能、分布式的内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库负载,提高数据访问速度。它通过将数据存储在内存中,实现快速读取,避免了频繁的磁盘I/O操作。本文将详细介绍`memcached-...

    hibernate-memcached-1.5.jar

    这个包是最高版本了,google code是1.22,但是这个版本是基础班的1.5版本.是github上源代码经过我打包出来的jar

    Simple-Spring-Memcached

    在JAVA中使用Memcached进行行缓存是比较复杂的。Simple-Spring-Memcachd(SSM)企图通过实现几个基础的使用项来简化Memcached的使用。 该项在java-memcached客户端的基础上使用java5的注解和Sping/AspectJ的AOP,使...

    python-memcached

    在实际应用中,Python-Memcached常被用于减轻数据库的压力,比如在高并发环境下,先从缓存中读取数据,如果缓存中没有再查询数据库,这一过程称为“缓存穿透”。此外,它还可以用于缓存计算结果,避免重复计算,提高...

    hibernate-memcached-1.1.0-sources.zip

    `hibernate-memcached-1.1.0-sources.zip`提供的源码实现了一个Hibernate二级缓存提供者,它将Hibernate的查询结果缓存在Memcached中,当再次进行相同查询时,可以直接从缓存中获取数据,避免了重复的数据库查询。...

    php-memcached-demo.tar.gz

    1. 连接Memcached服务器:使用`new Memcache()`创建一个连接实例,然后用`connect()`或`pconnect()`方法连接到指定的服务器。 2. 存储数据:通过`set()`方法可以将键值对存入缓存,例如`$memcache->set('key', '...

    memcached-win-32/64-1.4.4-14

    memcached的基本设置: -p 监听的端口 -l 连接的IP地址, 默认是本机 -d start 启动memcached服务 -d restart 重起memcached服务 -d stop|shutdown 关闭正在运行的memcached服务 -d install 安装memcached服务 -d ...

    Python库 | python-binary-memcached-0.24.1.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:python-binary-memcached-0.24.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Laravel开发-laravel-memcached-plus

    在本文中,我们将深入探讨Laravel开发中的一个关键组件——`laravel-memcached-plus`扩展。这个扩展针对Laravel5的内置Memcached缓存驱动进行了增强,为开发者提供了更全面的功能,包括持久连接、SASL认证以及自定义...

Global site tag (gtag.js) - Google Analytics