我们都知道,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是否存在了。
分享到:
相关推荐
MSM--memcached session manager是一个高可用的Tomcat session共享解决方案,除了可以从本机内存快速读取Session信息(仅针对黏性Session)外,同时可使用memcached存取Session,以实现高可用。对于非黏性Session,...
Memcached是一种高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。Python-memcached库则为Python开发者提供了一个简单易用的接口,能够方便地将数据存储和检索到...
安装php-memcached扩展 https://github.com/php-memcached-dev/php-memcached tar -zxvf ...
ssm3-mybatis2-memcached 使用了 simple-spring-memcached 。因为 mybatis-memcached 不支持 MyBatis2(iBatis),只能用在 MyBatis3 里。但是因为有的项目还跑在 MyBatis2 版本上,所以也做一个例子。 mm-mybatis3-...
这里`check_command`指定的是插件命令,`check_memcached`是插件名称,`localhost`是Memcached服务器地址,`-w`和`-c`分别设置警告和临界阈值。 4. **测试插件**:在Nagios服务器上,可以先手动运行插件检查...
java-memcached-2.6.6.jar
cas-client-support-distributed-memcached-3.2.0.jar
<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是一种高性能、分布式内存对象缓存系统,用于减少数据库负载,通过在内存中存储数据来加速网络应用。这个`python-memcached-latest.tar`压缩包包含了最新的Python绑定版本,即`python-memcached-1.53`。 *...
Simple-Spring-Memcached(SSM)是将Memcached缓存系统与Spring框架紧密结合的一个优秀项目,它提供了一种优雅的方式来实现基于注解的缓存管理,极大地简化了Java开发者在Spring应用中使用Memcached的过程。...
`memcached`是一款高性能、分布式的内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库负载,提高数据访问速度。它通过将数据存储在内存中,实现快速读取,避免了频繁的磁盘I/O操作。本文将详细介绍`memcached-...
这个包是最高版本了,google code是1.22,但是这个版本是基础班的1.5版本.是github上源代码经过我打包出来的jar
在JAVA中使用Memcached进行行缓存是比较复杂的。Simple-Spring-Memcachd(SSM)企图通过实现几个基础的使用项来简化Memcached的使用。 该项在java-memcached客户端的基础上使用java5的注解和Sping/AspectJ的AOP,使...
在实际应用中,Python-Memcached常被用于减轻数据库的压力,比如在高并发环境下,先从缓存中读取数据,如果缓存中没有再查询数据库,这一过程称为“缓存穿透”。此外,它还可以用于缓存计算结果,避免重复计算,提高...
`hibernate-memcached-1.1.0-sources.zip`提供的源码实现了一个Hibernate二级缓存提供者,它将Hibernate的查询结果缓存在Memcached中,当再次进行相同查询时,可以直接从缓存中获取数据,避免了重复的数据库查询。...
1. 连接Memcached服务器:使用`new Memcache()`创建一个连接实例,然后用`connect()`或`pconnect()`方法连接到指定的服务器。 2. 存储数据:通过`set()`方法可以将键值对存入缓存,例如`$memcache->set('key', '...
memcached的基本设置: -p 监听的端口 -l 连接的IP地址, 默认是本机 -d start 启动memcached服务 -d restart 重起memcached服务 -d stop|shutdown 关闭正在运行的memcached服务 -d install 安装memcached服务 -d ...
资源分类:Python库 所属语言:Python 资源全名:python-binary-memcached-0.24.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
在本文中,我们将深入探讨Laravel开发中的一个关键组件——`laravel-memcached-plus`扩展。这个扩展针对Laravel5的内置Memcached缓存驱动进行了增强,为开发者提供了更全面的功能,包括持久连接、SASL认证以及自定义...