Chinaunix首页 | 论坛 | 博客
  • 博客访问: 110811
  • 博文数量: 21
  • 博客积分: 1657
  • 博客等级: 上尉
  • 技术积分: 245
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-10 16:20
文章分类

全部博文(21)

文章存档

2017年(1)

2014年(3)

2013年(1)

2012年(1)

2011年(9)

2010年(1)

2009年(1)

2008年(3)

2006年(1)

分类: 服务器与存储

2011-10-10 09:08:39

刚接触”memcache”时,一直被”memcache”的正确写法究竟是”memcache”还是”memcached”所困扰。今天在查如何配置session保存到”memcache”时,又遇到了各种版本困扰的问题,于是整体整理一下,如下:

首先,无论memcache还是memcached,所指的系统都是。

至于,为什么有memcache,这得从PHP的扩展说起,memcached是一个开源的系统,最初在PECL中出现的是一个叫的PHP扩展(04年),按照memcached的接口实现的。

在09年某月某日的时候,PECL中又出现了一个叫的PHP扩展,很好,这下有3个概念了。

1. 服务器跑的进程是memcached系统

2. 实现memcached接口的PHP扩展之PECL/memcache

3. 实现memcached接口的PHP扩展之PECL/memcached

无论使用哪种PHP扩展,在服务器安装都需要先安装memcached,最新的版本为1.4.5(安装文档可参考该篇文章

而PECL/memcache和PECL/memcached则也有各自的版本(与memcached系统的版本号无关)

PECL/memcache 2.*系列的版本最新stable版为2.2.6(这也是在phpinfo中查看的memcache扩展的版本号),PECL/memcache 3.*版本最新为3.0.5beta版

PECL/memcached 1.*系列的版本最新stable版为1.0.2,2011-03-13则提交了2.0.0b1版

有这两个扩展的对比表,简单翻译如下:

这两个扩展都支持最基本的操作,比如多组服务器,读写值,值的增减以及获取服务器的统计信息。

这里是一些更为高级的特性和信息。

首次发布日期 2004-06-08 2009-01-29 (beta)
活跃发展? Yes Yes
依赖的外部组件 None
特性
key的自动修正1 Yes No
追加/预置Prepend No(注:从3.0.0开始已增加对Append/Prepend的支持) Yes
自动序列化2 Yes Yes
二进制协议 No(注:从3.0.0开始已增加对二进制协议的支持) Optional
CAS3 No(注:从3.0.0开始已增加对CAS的支持) Yes
压缩 Yes Yes
通信超时 Connect Only Various Options
Consistent Hashing4 Yes Yes
延迟获取 No Yes
一次获取多值Multi-Get Yes Yes
支持Session Yes Yes
读写到指定的一个服务器 No Yes
存储数值 Converted to Strings Yes
  1. pecl/memcache会自动转换无效的key为有效。pecl/memcached则会返回false。
  2. 你无须对对象、数组进行序列化,这两个客户端都会自动完成序列化的过程。
  3. CAS:Memcached于1.2.4版本新增CAS(Check and Set)协议类同于Java并发的CAS(Compare and Swap)原子操作,处理同一item被多个线程更改过程的并发问题。
    在Memcached中,每个key关联有一个64-bit长度的long型惟一数值,表示该key对应value的版本号。这个数值由 Memcached server产生,从1开始,且同一Memcached server不会重复。在两种情况下这个版本数值会加1:1、新增一个key-value对;2、对某已有key对应的value值更新成功。删除 item版本值不会减小。参考:http://langyu.javaeye.com/blog/680052
  4. Consistent Hashing:Memcached分布式的一种策略,比余数策略要好很多,具体原理可以,在pecl/memcache 3.0.0之前,默认的策略为stardard,即余数策略,在3.0.0之后则默认为consistent。可以通过php.ini里修改memcache.hash_strategy = consistent来指定。

从pecl/memcache的3.0.0开始,对原先许多不支持的特性进行支持,具体可以参考,对二进制协议的支持可以通过memcache.protocol = {ascii, binary}来设置,并且修改了默认的设置:

memcache.hash_strategy = consistent(在3.0.0之前默认是stardard,即余数策略)

memcache.chunk_size = 32768(在3.0.0之前默认是8192,说明中也提到这个参数指数据传输块大小,这个值越小网络I/O次数越多,如果发现莫名的速度降低, 可以尝试将此值调至32768,所以在3.0.0中干脆直接默认值就是32768了)

当然pecl/memcache 3.0.*还没有stable版本发布,所以相比较而言,pecl/memcached 1.0.2 stable版就比pecl/memcache 2.2.6 stable版功能要强大些(二进制协议和CAS的支持),但是pecl/memcached 1.0.2 stable版也有一些不支持的功能,比如不支持发生错误时(对用户)透明的转移到其他服务器(即memcache.allow_failover ),也不支持持久连接等等。

在社区看到有人讨论,pecl/memcached有项功能getServerByKey,可以返回key所映射的服务器,这对于调试很是方便。

现在在pecl/memcache 3.0.5 的changelog中也加入了类似的功能MemcachePool::findServer(key)

目前我们用的是pecl/memcache 2.2.5,期待3.0系列的stable版!

最后,回到今天的问题上来,如何保存session到memcached中

对于pecl/memcache设置如下:

session.save_handler = memcache

session.save_path = "tcp://host1:11211, tcp://host2:11211"

(注:每个url可以包含参数,这些参数于方法的参数相同。比如: “tcp://host1:11211?persistent=1&weight=1&timeout=1&retry_interval=15″

对于pecl/memcached设置如下:

session.save_handler = memcached

session.save_path = "host1:11211, host2:11211"

注意:无tcp协议标识符

阅读(2428) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~