3.2 Redis和Memcached的集群实现机制对比html
Memcached是全内存的数据缓冲系统,Redis虽然支持数据的持久化,可是全内存毕竟才是其高性能的本质。做为基于内存的存储系统来讲,机器物理内存的大小就是系统可以容纳的最大数据量。若是须要处理的数据量超过了单台机器的物理内存大小,就须要构建分布式集群来扩展存储能力。算法
3.2.1 Memcached的分布式存储缓存
Memcached自己并不支持分布式,所以只能在客户端经过像一致性哈希这样的分布式算法来实现Memcached的分布式存储。图6 给出了Memcached的分布式存储实现架构。当客户端向Memcached集群发送数据以前,首先会经过内置的分布式算法计算出该条数据的目标节点,而后数据会直接发送到该节点上存储。但客户端查询数据时,一样要计算出查询数据所在的节点,而后直接向该节点发送查询请求以获取数据。服务器
图6 Memcached客户端分布式存储实现网络
3.2.2 Redis的分布式存储数据结构
相较于Memcached只能采用客户端实现分布式存储,Redis更偏向于在服务器端构建分布式存储。尽管Redis当前已经发布的稳定版本尚未添加分布式存储功能,但Redis开发版中已经具有了Redis Cluster的基本功能。预计在2.6版本以后,Redis就会发布彻底支持分布式的稳定版本,时间不晚于2012年末。下面咱们会根据开发版中的实现,简单介绍一下Redis Cluster的核心思想。架构
Redis Cluster是一个实现了分布式且容许单点故障的Redis高级版本,它没有中心节点,具备线性可伸缩的功能。图7给出Redis Cluster的分布式存储架构,其中节点与节点之间经过二进制协议进行通讯,节点与客户端之间经过ascii协议进行通讯。在数据的放置策略上,Redis Cluster将整个key的数值域分红4096个哈希槽,每一个节点上能够存储一个或多个哈希槽,也就是说当前Redis Cluster支持的最大节点数就是4096。Redis Cluster使用的分布式算法也很简单:crc16( key ) % HASH_SLOTS_NUMBER。分布式
图7 Redis分布式架构ide
为了保证单点故障下的数据可用性,Redis Cluster引入了Master节点和Slave节点。如图4所示,在Redis Cluster中,每一个Master节点都会有对应的两个用于冗余的Slave节点。这样在整个集群中,任意两个节点的宕机都不会致使数据的不可用。当Master节点退出后,集群会自动选择一个Slave节点成为新的Master节点。性能
图8 Redis Cluster中的Master节点和Slave节点
3.3 Redis和Memcached总体对比
Redis的做者Salvatore Sanfilippo曾经对这两种基于内存的数据存储系统进行过比较,整体来看仍是比较客观的,现总结以下:
1)性能对比:因为Redis只使用单核,而Memcached可使用多核,因此平均每个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,可是比起Memcached,仍是稍有逊色。
2)内存使用效率对比:使用简单的key-value存储的话,Memcached的内存利用率更高,而若是Redis采用hash结构来作key-value存储,因为其组合式的压缩,其内存利用率会高于Memcached。
3)Redis支持服务器端的数据操做:Redis相比Memcached来讲,拥有更多的数据结构和并支持更丰富的数据操做,一般在Memcached里,你须要将数据拿到客户端来进行相似的修改再set回去。这大大增长了网络IO的次数和数据体积。在Redis中,这些复杂的操做一般和通常的GET/SET同样高效。因此,若是须要缓存可以支持更复杂的结构和操做,那么Redis会是不错的选择。