精英联盟总队 缓存框架Redis、Memcached技术选型,「微服务」( 四 )


RedisRedisCluster是一个实现了分布式且允许单点故障的Redis高级版本 , 它没有中心节点 , 具有线性可伸缩的功能 。 RedisCluster的分布式存储架构 , 节点与节点之间通过二进制协议进行通信 , 节点与客户端之间通过ascii协议进行通信 。 在数据的放置策略上 , RedisCluster将整个key的数值域分成4096个哈希槽 , 每个节点上可以存储一个或多个哈希槽 , 也就是说当前RedisCluster支持的最大节点数就是4096 。 RedisCluster使用的分布式算法也很简单:crc16(key)%HASH_SLOTS_NUMBER 。
为了保证单点故障下的数据可用性 , RedisCluster引入了Master节点和Slave节点 。 在RedisCluster中 , 每个Master节点都会有对应的两个用于冗余的Slave节点 。
这样在整个集群中 , 任意两个节点的宕机都不会导致数据的不可用 。 当Master节点退出后 , 集群会自动选择一个Slave节点成为新的Master节点 。
小结Memcached当缓存相对较小和使用静态的数据时候 , 比如HTML代码片段 , Memcached可能更为可取 。
Memcached内部的内存管理在最简单的用例中更为有效 , 因为它的元数据消耗相对更少的内存资源 。
当数据尺寸是动态的时候 , Memcached的内存管理效率下降的很快 , 此时Memcached的内存会变成碎片 。 而且 , 大的数据集经常牵扯到数据序列化 , 总是需要更多的空间来存储 。 如果你使用Memcached , 数据会随着重启动而丢失 , 重建缓存是个代价高昂的过程 。
Memcached比Redis更具优势的另一个场景在伸缩性 。 因为Memcached是多线程的 , 所以你可以通过给它更多计算资源让它轻松扩展 。 Redis是单线程的 , 可以通过集群无损水平扩展 。 集群是一个有效的扩展方案 , 但是相对来说配置、操作复杂 。 Memcached不支持复制功能(数据从一台机器自动复制到另外一台) 。
Memcached非常适合处理高流量的网站 。 它可以一次性读取大量的信息 , 并在优秀的反应时间内返回 。 Redis不但能处理高流量的读 , 还能处理繁重的写入 。
RedisRedis有五种主要的数据结构可以选择 。 通过对缓存数据智能化的缓存和处理 , 它为应用程序开发人员打开了存在各种可能的新世界 。 由于其数据结构(使用多种格式存储数据:列表、数组、集合、有序集合)特性 , Redis作为缓存系统提供了更多的能力和总体上更好的效率 。 缓存使用一种称为“数据回收”的机制 , 通过从内存中删除旧数据为新数据腾出空间 。 Memcached的数据回收机制使用了LRU(LeastRecentlyUsed-最近最少使用)算法 , 但回收与新数据近似大小的数据时有点随意性 。
Redis允许对回收进行细粒度的控制 , 让你选择六种不同的回收策略 。 Redis同时支持惰性(被动)和主动回收 , 只有在需要更多空间或主动激活时才回收数据 。 另一方面 , Memcached只支持惰性回收 。
以下是redis提供的一些功能 , 可以用于“真实”数据存储 , 而不仅仅是缓存 。
强大的数据类型和可利用它们的强大命令支持 。 哈希、有序集合、列表等 。 默认的磁盘持久化支持使用乐观锁的事务支持(WATCH/MULTI/EXEC)发布/订阅功能 , 速度极快高达512MB的键值尺寸上限(Memcached每个键值限于1MB大小)Lua脚本支持(2.6及以上版本)内置集群支持(3.0及以上版本)一切都极快强大的数据类型尤为重要 。 它们允许Redis提供一个出色的共享队列(list) , 一个很棒的消息传递解决方案(pub/sub) , 一个存储会话信息(hashes)的好地方 , 还有一个引人注目的高分值追踪区域(sortedsets) 。 它们仅仅是简单探讨就能得到的使用样例 。


推荐阅读