一、为什么要做 Redis 分区


Redis 是单线程的,想要提高多核 CPU 的利用率的话,可以在同一个服务器部署多个Redis 的实例,并把他们当作不同的服务器来使用。但在某些时候,一个服务器无论如何也是不够的, 所以,如果你想使用多个 CPU,你可以考虑一下分片(shard):

  • 分区可以让 Redis 管理更大的内存,Redis 将可以使用所有机器的内存;
  • 如果没有分区,你最多只能使用一台机器的内存;
  • 分区使 Redis 的计算能力通过简单地增加计算机得到成倍提升,Redis 的网络带宽也会随着计算机和网卡的增加而成倍增长;

二、Redis分区实现方案


1、客户端分区

客户端分区就是在客户端就已经决定数据会被存储到哪个 Redis 节点或者从哪个 Redis 节点读取,大多数客户端已经实现了客户端分区。

2、代理分区

代理分区意味着客户端将请求发送给代理,然后代理决定去哪个节点写数据或者读数据。代理根据分区规则决定请求哪些 Redis 实例,然后根据 Redis 的响应结果返回给客户端。

Redis 和 Memcached 的一种代理实现就是 Twemproxy。

3、查询路由

查询路由(Query routing)的意思是客户端随机地请求任意一个 Redis 实例,然后由 Redis 将请求转发给正确的 Redis 节点。Redis Cluster 实现了一种混合形式的查询路由,但并不是直接将请求从一个 Redis 节点转发到另一个 Redis 节点,而是在客户端的帮助下直接 Redirected 到正确的 Redis 节点。


三、Redis分区缺点


  • 涉及多个 key 的操作通常不会被支持。例如你不能对两个集合求交集,因为他们可能被存储到不同的 Redis 实例(实际上这种情况也有办法,但是不能直接使用交集指令)。
  • 同时操作多个 key,则不能使用 Redis 事务.
  • 分区使用的粒度是 key,不能使用一个非常长的排序 key 存储一个数据集。
  • 当使用分区的时候,数据处理会非常复杂,例如为了备份你必须从不同的 Redis 实例和主机同时收集 RDB / AOF 文件。
  • 分区时动态扩容或缩容可能非常复杂。Redis 集群在运行时增加或者删除 Redis 节点,能做到最大程度对用户透明地数据再平衡,但其他一些客户端分区或者代理分区方法则不支持这种特性。然而,有一种预分片的技术也可以较好的解决这个问题。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐