1. Memcached是用c/c++语言写的服务器程序,在linux下安装后可以用作daemon服务,这一点跟mysql很像
2. Memcached提供了一套通信协议,Memcached客户端通过这个协议与Memcached服务器进行交互。这个协议是开放的,只要遵循这个协议,任何人可以用任何语言写一个客户端
3. 系统方面
a.Memcached就是用来占内存的,所以机器的内存越充裕越好。
b.如果内存存取“慢”了,Memcached就会非常慢。所以,如果你的Linux用上了虚拟内存开始swap了,你的Memcached就会很弱
c.对CPU的压力不大
d.为了避免给网络带来压力,你的缓存项最好都是小数据
4. Memcached集群
a.多个memcached实例一起使用即构成集群。集群的前面并没有前置任何负载均衡或者其它管理集群的东西,集群的结点之间也不会互相通信。
b.结点之间不会复制数据,一个缓存entry只存一台机器;所以取entry时,客户端自己要知道该去哪台机取
c.客户端存取缓存项前一般会根据key值决定去哪个结点,这个函数 node = f(key) 称为hashing函数。 最简单的策略是 node = hash(key)/size-of-node,即简单哈希后再用结点数取模
d.基于结点数取模的寻址策略有个缺点,即在结点数增加时,几乎所有key的hashing值都会变化; 如果增加结点前某个缓存项存在A结点上,增加结点后,由于hashing值的变化,客户端可能会去到B结点读取这个缓存项,结果没读到,缓存的命中率下降。 解决办法是使用Consistent Hashing算法,使用了这种算法后,在遇到增减结点时,只有少部分key的hashing值会变化
e.客户端还可以自己实现“权重”,即有的机器多收一点缓存,有的少收一点
5. 高级操作
a. 支持add操作,即当key相同的缓存项不存在时,才会将客户端提交的缓存项保存
b. 支持cas操作(Check And Set),即乐观锁。应用这种机制时,如果你上次访问某缓存后有它人更新了些缓存,那你再更新缓存就会失败