memcache高并发
2016-04-20 00:00
411 查看
memcached的原子性操作
memcached是原子的吗?当然!好吧,让我们来明确一下:
所有的被发送到memcached的单个命令是完全原子的。如果您针对同一份数据同时发送了一个set命令和一个get命令,它们不会影响对方。它们将被串行化、先后执行。即使在多线程模式,所有的命令都是原子的,除非程序有bug:)
命令序列不是原子的。如果您通过get命令获取了一个item,修改了它,然后想把它set回memcached,我们不保证这个item没有被其他进程(process,未必是操作系统中的进程)操作过。在并发的情况下,您也可能覆写了一个被其他进程set的item。
memcached 1.2.5以及更高版本,提供了gets和cas命令,它们可以解决上面的问题。如果您使用gets命令查询某个key的item,memcached会 给您返回该item当前值的唯一标识。如果您覆写了这个item并想把它写回到memcached中,您可以通过cas命令把那个唯一标识一起发送给 memcached。如果该item存放在memcached中的唯一标识与您提供的一致,您的写操作将会成功。如果另一个进程在这期间也修改了这个 item,那么该item存放在memcached中的唯一标识将会改变,您的写操作就会失败。
根据这篇文章,在php手册找到了memcache的cas方法,实现原子性的操作。http://php.net/manual/zh/memcached.cas.php
其中的例子:
$m =new Memcached(); $m->addServer('localhost', 11211); do { /* 获取ip列表以及它的标记 */ $ips =$m->get('ip_block', null, $cas); /* 如果列表不存在, 创建并进行一个原子添加(如果其他客户端已经添加, 这里就返回false)*/ if ($m->getResultCode() == Memcached::RES_NOTFOUND) { $ips =array($_SERVER['REMOTE_ADDR']); $m->add('ip_block',$ips); /* 其他情况下,添加ip到列表中, 并以cas方式去存储, 这样当其他客户端修改过, 则返回false */ }else { $ips[] = $_SERVER['REMOTE_ADDR']; $m->cas($cas,'ip_block',$ips); } }while ($m->getResultCode() != Memcached::RES_SUCCESS);
相关文章推荐
- Redis与Memcached的区别
- Memcache-Java-Client-Release源码阅读(之三)
- memcached 基本操作
- memcached基本操作和语法
- memcache 命令行操作
- memcached
- 自动检测memcached进程,不存在则自动重启(脚本)
- Java测试Memcached
- Linux中Memcached的安装和配置方法
- memcached-session-manager配置
- 云数据库memcached之热点key问题解决方案
- memcache与redis的区别
- MemCache深度解读
- 史上最全互联网分布式缓存技术视频教程(redis、memcached、ssdb)
- yii2 memcache 跨平台交互 键和值不一样
- Memcache-Java-Client-Release源码阅读(之二)
- 通过telnet连接查看memcache服务器
- Redis与Memcached的区别
- 从源码角度理清memcache缓存服务
- windows环境安装memcached以及telnet登陆memcached