欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

PHP Memcached客户端memcache,memcached比较

程序员文章站 2022-05-13 10:07:45
...

author: selfimpr blog: http://blog.csdn.net/lgg201 mail: lgg860911@yahoo.com.cn 1. 系统级锁定支持: memcache客户端不支持锁相关的功能,而服务端又支持并发,这样其实就会带来数据混乱的问题,我们之前的做法是实现一个应用层的锁: ?php/** * author:

author: selfimpr

blog: http://blog.csdn.net/lgg201

mail: lgg860911@yahoo.com.cn

1. 系统级锁定支持:

memcache客户端不支持锁相关的功能,而服务端又支持并发,这样其实就会带来数据混乱的问题,我们之前的做法是实现一个应用层的锁:

上面的方式构建锁定与解锁方法,然后在需要锁定的地方,get前加锁,set后解锁。

上面的解决方法,会降低并发导致的数据混乱问题,但不能根治,因为我们在lock的时候可能会是并发的,同时拿到了锁。。

后来,考虑过应用层实现的乐观锁机制,不过没有应用起来,也就不了了之了。。

最近换了Memcached客户端,发现其中支持cas这个方法,其实就是一个系统层的乐观锁。

get的时候,传一个$cas参数,Memcached::get这个方法在定义的时候,$cas是一个引用参数,执行完后,$cas这个名字已经被修改为memcached服务端返回的一个唯一标识了。

当我们set这个key的时候,带上这个cas值,以cas接口设置过去,服务端就能根据cas值判断该key对应的值是否被修改过,如果被修改过,说明是脏数据,向客户端发送错误消息。

由于这个锁定的验证机制是memcached的服务端提供的,因此,我们可以相信它的正确性。

2. 获取Memcached中的所有的key

这个在memcache扩展中支持,Memcached扩展中反而不支持。

使用的方法是Memcache::getExtendedStats(....),三个参数,这个这里就不写了,php-memcache文档翻译的时候,我会加进去。

顺便提下,有精力有时间的朋友请参与支持:http://code.google.com/p/phpdoc-zh/,PHP官方文档翻译,公益项目

3. 持久化连接问题

Memcache客户端是支持持久化连接的,而Memcached客户端不支持持久化连接,并且Memcached客户端在释放连接的时候本身可能有bug,在高并发的情况下会导致Memcached服务端大量的连接处于time_wait状态无法释放。。这样就会导致一部分请求失败。。

我们使用的是memcache作为session的handler,因为这个问题导致我们的session无法取到,客户端丢失连接,问题是比较严重的。

最终从网上找到了解决方案就是修改Memcached服务端的socket释放相关的配置,我们进行的是如下修改:

修改文件:/etc/sysctl.cnf,加入或修改下面两个配置

net.ipv4.tcp_tw_recycle=1 //回收time_wait状态的socket

net.ipv4.tcp_fin_timeout=3 //认为的超时时间

然后/sbin/sysctl -p把这个文件reload一下

这个配置的修改,在网上有一位朋友使用apache的ab做过并发测试

1000000请求30000并发,没有出现Memcached的连接失败问题。

呵呵,这几天了解到的就这么多,有不足之处或错误的地方,还望指正。

谢谢