cache类

需求:
1. 能够根据不同的规则,hash缓存项。以便异常情况下,做完全的物理隔离。
2. 每个cache group,非单点
3. 增加cache group,不会造成雪崩效应
存储内容:
1. session,不允许flush,与在线用户量相关
2. appinfo等配置信息,不允许flush,热点数据(每个request都需要访问),与uclogin功能发展、挂接产品线数量相关,基本保持线性增长
3. acct等用户信息,允许flush,与活跃用户量相关

 

监控与系统参数:
1. 各group cache 内存使用占比、命中率、读写次数

 

memcached与memcached 区别:
http://hily.me/blog/2010/05/php-memcache-vs-memcached/
http://hi.baidu.com/tony_wd/item/605e959241f87c8c59146164
key的hash算法:
http://tech.idv2.com/2008/07/24/memcached-004/
https://www.surfchen.org/archives/348
http://www.php.net/manual/zh/memcache.addserver.php
memcache扩展的add_server方法,是lazy connect的。故添加多个memcached实例,并不会带来额外的开销(存储配置信息不计)。
但get/set时,memcache会利用memcache.hash_strategy和memcache.hash_function配置做hash,选择某一个实例使用。
这就涉及到,这两个参数的配置,据传consistent+crc32在增加cache实例时,在命中率方面有较好的表现。
即使用addserver方法,相当于把cache分组的工作交给memcache扩展来做了。
但是这样,我们没法知道一个key具体落在哪个分组上。
我们当前的cache方式为:
master:多node,addserver
slave:多node,addserver
写时,写master+slave,都成功才算成功
读时,先读master,若失败再读slave

做小修改:
group1:多node,addserver
group2:多node,addserver
写时,写group1+group2,返回两者的写结果,调用者可根据一致性强度,自行决定是否成功
读时,随机选择一个group,若失败再读下一个group
==========memcached替换memcache================
且使用memcached extension替换memcache,以支持更多的memcached协议,例如mutilget等。
Memcached::addServer()增加指定服务器到服务器池中。此时不会建立与服务端的连接, 但是,如果你使用一致性key分布选项(Memcached::DISTRIBUTION_CONSISTENT或 Memcached::OPT_LIBKETAMA_COMPATIBLE),一些内部的数据结构将会被更新。 因此,如果你需要增加多台服务器,更好的方式是使用 Memcached::addServers() 以确保这种更新只发生一次。

Memcached::addByKey — 在指定服务器上的一个新的key下增加一个元素。可利用该类方法,对数据所属的server进行分组。例如,要将某用户的session信息与userinfo信息 cache到同一组memcached上,则可以指定相同的server_key。
memcached还引入了乐观锁的概念,来保证强一致性。
CAS(Check and Set)协议解决这种并发修改问题。有线程试图修改当前key-value对的value时,先由gets方法得到item的版本号,操作完成提交数据时,使用cas方法谨慎变更,如果在本地对item操作过程中这个key-value对在Memcached server端被其它线程更改过,就放弃此次修改(乐观锁概念)。

可以利用getResultCode()来获取上一次操作的code码:http://www.php.net/manual/zh/memcached.getresultcode.php,getResultMessage 获取描述信息。

Leave a Reply