Redis高级篇
-
分区
为什么分区?
Redis中的分区主要有两个目的:
- 允许用多台机器的内存存放更大的数据集。如果没有分区,那么你只能存放单台机器内存的最大值的数据集。
- 允许用多核和多台机器提高计算能力和网络带宽。
分区简单了解
分区方法
假设有4个Redis实例(服务器)R0,R1,R2,R3,代表user的许多keys如user:1,user:2..等,那么就有多种方法实现将给定的key映射到对应的Redis服务器上。
最简单的方式之一是用range partitioning,即将一个范围内的object映射到具体的Redis实例中。例如,将ID从0到1000放到实例R0上,从1001到2000放到R1上。实践中也在用这种方法,然而,它的缺点是映射表,因为Redis中的每个object都需要该表,所以效率低下。
另一种分区方式是hash partitioning。这种方式不要求key的形式必须是object_name:
分区缺点
- 多个keys的操作例如交集不支持。
- 多个keys的事务不能用。
- 分区粒度
- 增加了数据处理的复杂度,比如数据的添加与删除等操作。
存储数据 or 缓存数据
如果Redis用来缓存数据,那么用一致性hash是比较容易实现扩展的。
如果Redis用来存储数据,那么key常对应固定的Redis实例,所以节点必须是固定的并且不能改变。
使用Redis实现多重复制应注意如下问题:
- 在新server中启动Redis服务
- 移动数据并配置新的实例作为集群的slaves节点
- 停止clients
- 更新移动的实例和新Server的Ip地址
- 在新的slave节点上执行SLAVEOF NO ONE命令
- 重启Clients
- 最后关闭不再使用的实例
Redis分区的实现
Redis Cluster
Redis Cluster提供自动分片和高可用性的首选方案。
详情了解Cluster tutorial
Twemproxy
Twemproxy是twitter为Memcached和Redis开发的代理。它是单线程的,用c语言编写,运行较快。它支持在多个Redis实例中自动分区,和可选的节点选举方案。
Twemproxy基本上是一个处于client和Redis实例中的之间层,负责分区的处理。
详情了解in this antirez blog post
Clients supporting consistent hashing
另外一种Twemporxy的实现方式是用一个client实现client端的分区通过一致性hash或类似算法。比较著名的有 Redis-rb and Predis.