Memcache知识点系统总结

NoSQL

之前有用过Memcache,但一直没有详细的深入了解。最近系统的把Memcache学习了一遍,并对Memcache知识点进行总结。Memcache作为缓存还是用得比较多的。下面PHP程序员雷雪松系统的总结下Memcache知识点。

1、Windows/Linux下安装Memcache以及启动参数详解
(注意:Linux下依赖库libevent,虚拟机下时间不对)

2、telnet下测试Memcache常用命令
stats:状态
flush all:清除所有数据

Set:添加一个新条目到Memcached或是用新的数据替换替换掉已存在的条目
Add:当KEY不存在的情况下,它向Memcached存数据,否则,返回NOT_STORED响应
Cas:改变一个存在的KEY值 ,但它还带了检查的功能
Append:在这个值后面插入新值
Prepend:在这个值前面插入新值

Get:取单个值 ,从缓存中返回数据时,将在第一行得到KEY的名字,flag的值和返回的value长度,真正的数据在第二行,最后返回END,如KEY不存在,第一行就直接返回END
Get_multi:一次性取多个值

Delete
改:
Replace:当KEY存在的情况下,它才会向Memcached存数据,否则返回NOT_STORED响应
incr:增(只针对整型存储的)
decr:减(只针对整型存储的)

3、php对Memcache的支持
PHP Memcache扩展安装PHP设置session用Memcache来存储

4、Memcached的缓存策略
Memcached的缓存策略是LRU(最近最少使用)加上到期失效策略。当你在memcached内存储数据项时,你有可能会指定它在缓存的失效时间,默认为永久。当memcached服务器用完分配的内时,失效的数据被首先替换,然后也是最近未使用的数据。在LRU中,Memcached使用的是一种Lazy Expiration策略,自己不会监控存入的key/vlue对是否过期,而是在获取key值时查看记录的时间戳,检查key/value对空间是否过期,这样可减轻服务器的负载。

5、Memcache分布式的了解及运用
Memcached分布式缓存策略不是由服务器端至支持的,多台服务器之间并不知道彼此的存在。分布式的实现是由客户端代码(Memcached.ClientLibrary)通过缓存key-server映射来实现的,基本原理就是对缓存key求hash值,用hash值对服务器数量进行模运算,该key值被分配到模运算结果为索引的那台server上。
1:计算的分布尽量平均
2:如果新增/减少了服务器,
对于其他服务器的影响要尽量小.
5.1、对键取模求余
要点:
a.对key值hash,PHP crc32()配合printf;
b.用数组存储memcache服务器,数组下标是他的编号,
c.存取value时,先计算判断key取模后对应memcache服务器的编号
5.2、一致性哈希算法
要点:
a.对key值hash,PHP crc32()配合sprintf
b.对服务器也进行hash,为了效果更好,每个机器更均匀,对每个服务器虚拟多个hash。

6、Memcache常见一些问题
6.1、Memcache缓存雪崩的现象
原因1:一般是由于某个节点实效,导致其他节点命中率下降,缓冲中缺失的数据又去数据库查找,在短时间内造成数据库服务器奔溃。
原因2:缓冲周期性实效,比如6小时,那么每6小时就有一个缓冲峰值,严重的甚至会使DB崩溃。
解决思路:
1.失效尽量放在晚上或者访问量人少的时候
2.失效时间尽量分散,不一起失效,数据量比较大时,尽量人为分散失效时间
6.2、永久数据被踢出
Memcached的缓存策略是LRU(最近最少使用)加上到期失效策略。
解决思路:
官方建议永久数据和零时数据分开放
6.3、Memcache的安全
因为Memcache没有验证,任何一个知道ip和端口就可以直接访问操作
解决思路:
1、通过防火墙设置外网访问规则
2、不开放外网,只开放内网
3、更改Memcache默认端口
6.4、Memcache的multiget hole(无底洞)
6.5、Memcache分布式,当获取某个用户的信息时,因为分散缓存在多个服务器上,需要访问多个服务器获取,节点越多,数据就越分散,这样连接数就会越多。
解决思路:
1、将关联性比较强的数据缓存在一起,对一组key共同部分进行hash散列。
2、把缓存数据复制一份到另一个Memcache集群上,一个集群负责读一半的 keys;

7、Memcache的实战,例如:秒杀,抢购,对数据库的数据缓存,降低数据库压力

来源:Memcache知识点系统总结

发表评论

电子邮件地址不会被公开。 必填项已用*标注