1、为什么要分区?
分区可以把redis的数据保存在不同的redis实例上,可以使用多台机器的内存存储数据,同时可以利用多台机器的处理能力处理请求。
2、分区的几种算法?
-
根据key的范围分区。当key是数字时,我们可以把不同范围的key保存到不同的机器上。这种方式需要维护一张映射表,不推荐。
-
取余法。使用一种hash算法得到key的hash值,假设有n台redis实例,则使用key的hash值对n-1取余,得到的余数就是数据要保存的那台redis实例。
-
一致性hash。这种算法相对比较高级,而且一些客户端或redis代理都已经实现了这种算法。
3、分区的不同实现方式
分区可以被系统中的不同组件来实现。
-
客户端实现分区,客户端直接对key进行处理得到要保存或者要读取的redis实例地址。
-
代理实现分区,客户端把请求发送到代理,代理对key进行处理得到目标redis实例地址,然后返回给客户端,客户端再重定向到这个实例地址。
-
redis实例实现分区,客户端把请求发送到redis实例,redis实例对key进行处理得到目标redis实例地址,然后返回给客户端,客户端再重定向到这个实例地址。redis集群就是这种实现方式,推荐使用redis集群实现分区。
4、分区的弊端
- 通常不支持包含多个key的操作,比如如果两个set集合存储在不同的redis实例上,如果要执行两个set集合的交集操作是不支持的。
- 不支持包含多个key的事务
-
数据处理更麻烦,例如对于数据备份操作,要聚合不同机器上的多个AOF/RDB文件。
-
增加或减少redis实例会更麻烦,虽然redis cluster支持在增加或减少实例后重新分配实例数据,但是其它的分区实现方式比如客户端实现分区或代理实现分区不支持。