Memcache整理
memcached
是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HASH
表,该表以Key-value
对的方式存在内存中。
Memcached流程:
- 检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作。
- 如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现)。
- 每次更新数据库的同时更新memcached中的数据,保证一致性。
- 当分配给memcached内存空间用完之后,会使用
LRU
(Least Recently Used
,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。
Memcached特征:
- 协议简单
它是基于文本行的协议,直接通过
telnet
在memcached服务器上可进行存取数据操作
- 基于
libevent
事件处理
Libevent
是一套利用C开发的程序库,它将BSD系统
的kqueue
,Linux系统的epoll
等事件处理功能封装成一个接口,与传统的select相比,提高了性能。
- 内置的内存管理方式
所有数据都保存在内存中,存取数据比硬盘快,当内存满后,通过LRU算法自动删除不使用的缓存,但没有考虑数据的容灾问题,重启服务,所有数据会丢失。
- 分布式
各个memcached服务器之间互不通信,各自独立存取数据,不共享任何信息。服务器并不具有分布式功能,分布式部署取决于
memcache
客户端。
Memcached的缓存策略:
memcached的缓存策略是LRU
(最近最少使用)加上到期失效策略。当你在memcached内存储数据项时,你有可能会指定它在缓存的失效时间,默认为永久。当memcached服务器用完分配的内时,失效的数据被首先替换,然后也是最近未使用的数据。在LRU
中,memcached使用的是一种Lazy Expiration
策略,自己不会监控存入的key/vlue
对是否过期,而是在获取key值时查看记录的时间戳,检查key/value
对空间是否过期,这样可减轻服务器的负载。
Memcached的分布式算法:
当向memcached集群存入/取key/value
时,memcached客户端程序根据一定的算法计算存入哪台服务器,然后再把key/value
值存到此服务器中。
选择服务器算法有两种,一种是根据余数来计算分布,另一种是根据散列算法来计算分布。
- 余数算法:
先求得键的整数散列值,再除以服务器台数,根据余数确定存取服务器,这种方法计算简单,高效,但在memcached服务器增加或减少时,几乎所有的缓存都会失效。
- 散列算法:
先算出memcached服务器的散列值,并将其分布到0到
2的32次方
的圆上,然后用同样的方法算出存储数据的键的散列值并映射至圆上,最后从数据映射到的位置开始顺时针查找,将数据保存到查找到的第一个服务器上,如果超过2的32次方,依然找不到服务器,就将数据保存到第一台memcached服务器上。如果添加了一台memcached服务器,只在圆上增加服务器的逆时针方向的第一台服务器上的键会受到影响。