Memcached
Memcached 是高性能的分布式内存缓存服务器 它通过缓存数据库查询结果,减少数据库的访问次数,以提高动态Web的访问速度,提高扩展性。Memcached的API使用32位的循环冗余校验计算机键值后,将资料分散到不同的服务器上,当表格满了以后,接下来新增的资料以LRU机制替换掉,Memached基于一个存储键/值对的hashmap。其守护进程是用c写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
Memcached分布式算法
A 余数哈希 根据服务器余数的台数进行哈希,求得键的哈希值,再处理服务器的台数,根据余数选择服务器。
缺点 ;当添加或者移除服务器时,缓存重组的代价太大
B 一致性哈希:一致性哈希是将整个哈希值空间组织在一个虚拟的圆环上,如假设某哈希值是0-(2^32-1)(即哈希值是一个32位的无符号整型),这个哈希空间为环,然后让每台继器上占一个扇形空间,
Consistent Hashing算法
Consistent Hashing算法描述如下:首先求出memcached服务器节点的哈希值,并将其分配到0~2^32的圆上,这个圆我们可以把它叫做值域,然后用同样的方法求出存储数据键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上,如果超过0~2^32仍找不到,就会保存在第一台memcached服务器上:

memcachd基本原理
再抛出上面的问题,如果新添加或移除一台机器,在consistent Hashing算法下会有什么影响。上图中假设有四个节点,我们再添加一个节点叫node5:

添加了node节点之后
node5被放在了node4与node2之间,本来映射到node2和node4之间的区域都会找到node4,当有node5的时候,node5和node4之间的还是找到node4,而node5和node2之间的此时会找到node5,因此当添加一台服务器的时候受影响的仅仅是node5和node2区间。
- 1. Memcached的数据清除算法?
LRU。每个slab会维护一个队列,刚插入的数据在队头,经常get的数据也会移动到队头,这样较老或者访问较少的数据相对都留在队尾。该算法从队尾开始淘汰。当slab分配不到足够的内存时,首先会检查队尾是否有过期数据。如果有的话会直接将其覆盖为新的对象,如果没有,会开始淘汰队尾的对象。
Slab是一个内存块,它是memcached一次申请内存的最小单位。Slab的大小固定为1M(1048576 Byte),一个slab由若干个大小相等的chunk组成。每个chunk中都保存了一个item结构体、一对key和value。

Memcached工作流程
先检查客户端的请求是否在memcached中,如有,直接把请求数据返回,不再对数据库进行操作,如果请求数据不在memcached中,就去数据库中查,把从数据库中获取的数据返回客户端,同时把数据缓存一份到Memcached中;每次更新数据库时同时更新memcached的数据,保持一致性,当分配给memcached内存空间用完后,会使用LRU算法加上到期失效策略,失效数据首先被替换,然后是替换最近未使用的数据。
Memcached和Redis的区别
1 Redis不仅仅支持简单的k/v类型的数据,同时还提供string list set zest hash等数据结构的存储。memcache支持简单的数据类型 String
2 Redis支持数据的备份,即master-salver模式的数据备份
3 Redis支持数据的持久化,可以将内存中的数据保存到磁盘中,重启的时候可以再次加载使用,而Memcached把数据全部缓存到内存之中
4 redis的速度要比memcached快的多
5 Memcached是多线程,非阻塞IO复用的网络 Redis使用单线程的IO复用模型。
小结:,有持久化需求或者对数据结构和处理有高级要求的应用,选择redis,其他简单的key/value存储,选择memcached。对于两者的选择需要要看具体的应用场景,如果需要缓存的数据只是key-value这样简单的结构时,则还是采用memcache,它也足够的稳定可靠。如果涉及到存储,排序等一系列复杂的操作时,毫无疑问选择redis。
浙公网安备 33010602011771号