分片是将数据拆分至多个 Redis 实例中的过程,因此每个 Redis 实例将会仅包含 keys 的子集。

分片的不同实现

实现数据分片的方式有很多种,例如 范围分片哈希分片一致性哈希 是一种高级形式的哈希分片,被应用于一些 Redis 的客户端和代理中。

在软件架构上,Redis 中的数据分片可以由不同的模块来实现:

  • 客户端侧分片:对于给定的 key,客户端会直接选择正确的 Redis 节点来进行读写操作。许多 Redis 客户端都实现了这种策略,例如 Jedis 中的 ShardedJedis 类;
  • 代理侧分片:客户端会将请求发送给 Redis 代理,由代理来选择正确的 Redis 节点。twemproxy 是一款 Redis 和 Memcached 的代理,它实现了这种策略;
  • 查询路由:客户端可以将请求发送给任意一台 Redis 节点,该节点会将请求重定向至正确的 Redis 节点。Redis Cluster 在和客户端的配合下,实现了这种策略。Jedis 中的 JedisCluster 类支持 Redis Cluster。

分片的优点

在 Redis 中进行数据分片主要有两个目的:

  • 使用多个机器的内存总和,来创建一个更大的数据库;
  • 将计算能力扩展到多个内核和多个机器,将网络带宽扩展到多个机器和网络适配器。

分片的缺点

Redis 的一些特性在进行数据分片时,不能很好的工作:

  • 通常不支持涉及多个 key 的操作;
  • 不支持涉及多个 key 的 Redis 事务;
  • 分片的粒度是 key,因此没有办法对单个非常大的 key 进行分片;
  • 当使用分片时,数据处理会变得更加复杂;
  • 在集群中扩容和缩容会变得更加复杂。

参考资料