柠檬墨绿色 发表于 2016/10/15 13:37

Memcache知识点系统总结

来自:PHP程序员雷雪松的博客
作者:雷雪松
链接:http://www.9ask.cn/suzhou/(点击尾部阅读原文前往)
已获转载授权

之前有用过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默认端口
页: [1]
查看完整版本: Memcache知识点系统总结