此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Data Redis 3.5.3spring-doc.cadn.net.cn

Redis 集群

使用 Redis 集群需要 Redis Server 版本 3.0+。 有关更多信息,请参阅集群教程spring-doc.cadn.net.cn

Redis 存储库与 Redis 集群一起使用时,请熟悉如何在集群上运行 Redis 存储库
使用 Redis 集群时,不要依赖密钥空间事件,因为密钥空间事件不会跨分片复制。 Pub/Sub 订阅一个随机集群节点,该节点仅从单个分片接收密钥空间事件。 使用单节点 Redis 来避免密钥空间事件丢失。

使用 Redis 集群连接

Redis Cluster 的行为与单节点 Redis 甚至 Sentinel 监控的主副本环境不同。 这是因为自动分片将键映射到16384插槽,分布在节点上。 因此,涉及多个键的命令必须断言所有键映射到完全相同的插槽,以避免跨插槽错误。 单个集群节点仅提供一组专用密钥。 针对一个特定服务器发出的命令仅返回该服务器提供的密钥的结果。 举个简单的例子,请考虑KEYS命令。 当颁发到集群环境中的服务器时,它仅返回请求发送到的节点提供的密钥,而不一定返回集群中的所有密钥。 因此,要获取集群环境中的所有密钥,您必须从所有已知的主节点读取密钥。spring-doc.cadn.net.cn

虽然将特定键重定向到相应的插槽服务节点由驱动程序库处理,但更高级别的功能(例如跨节点收集信息或向群集中的所有节点发送命令)由RedisClusterConnection. 从前面的键示例中挑选,这意味着keys(pattern)方法会选取集群中的每个主节点,并同时运行KEYS命令,同时获取结果并返回累积的键集。 仅请求单个节点的密钥RedisClusterConnection为这些方法提供重载(例如,keys(node, pattern)).spring-doc.cadn.net.cn

一个RedisClusterNode可从RedisClusterConnection.clusterGetNodes或者可以使用主机和端口或节点 ID 来构造它。spring-doc.cadn.net.cn

以下示例显示了在集群中运行的一组命令:spring-doc.cadn.net.cn

示例 1.跨集群运行命令的示例
[email protected]:7379 > cluster nodes

6b38bb... 127.0.0.1:7379 master - 0 0 25 connected 0-5460                      (1)
7bb78c... 127.0.0.1:7380 master - 0 1449730618304 2 connected 5461-20252       (2)
164888... 127.0.0.1:7381 master - 0 1449730618304 3 connected 10923-20253      (3)
b8b5ee... 127.0.0.1:7382 slave 6b38bb... 0 1449730618304 25 connected          (4)
RedisClusterConnection connection = connectionFactory.getClusterConnection();

connection.set("thing1", value);                                               (5)
connection.set("thing2", value);                                               (6)

connection.keys("*");                                                          (7)

connection.keys(NODE_7379, "*");                                               (8)
connection.keys(NODE_7380, "*");                                               (9)
connection.keys(NODE_7381, "*");                                               (10)
connection.keys(NODE_7382, "*");                                               (11)
1 服务插槽 0 到 5460 的主节点复制到 7382 的副本
2 服务插槽 5461 至 10922 的主节点
3 主节点服务插槽 10923 至 16383
4 在 7379 处保存主服务器副本的副本节点
5 请求路由到 7381 服务插槽 12182 的节点
6 请求路由到 7379 服务插槽 5061 的节点
7 请求路由到 7379、7380、7381 → [thing1, thing2] 的节点
8 请求路由到 7379 → 的节点 [thing2]
9 请求路由到 7380 节点→ []
10 请求路由到 7381 → [thing1] 的节点
11 请求路由到 7382 → [thing2] 的节点

当所有键映射到同一槽时,本机驱动程序库会自动提供跨槽请求,例如MGET. 然而,一旦不是这种情况,RedisClusterConnection运行多个并行GET命令,并再次返回累积结果。 这比单时隙方法性能差,因此应谨慎使用。 如有疑问,请考虑通过在大括号中提供前缀(例如{my-prefix}.thing1{my-prefix}.thing2,它们都将映射到相同的插槽号。 以下示例显示了跨槽请求处理:spring-doc.cadn.net.cn

示例 2.跨时隙请求处理示例
[email protected]:7379 > cluster nodes

6b38bb... 127.0.0.1:7379 master - 0 0 25 connected 0-5460                      (1)
7bb...
RedisClusterConnection connection = connectionFactory.getClusterConnection();

connection.set("thing1", value);           // slot: 12182
connection.set("{thing1}.thing2", value);  // slot: 12182
connection.set("thing2", value);           // slot:  5461

connection.mGet("thing1", "{thing1}.thing2");                                  (2)

connection.mGet("thing1", "thing2");                                           (3)
1 配置与之前的示例相同。
2 键映射到同一插槽 → 127.0.0.1:7381 MGET thing1 {thing1}.thing2
3 键映射到不同的插槽,并被拆分为路由到相应节点的单个插槽
→ 127.0.0.1:7379 GET thing2
→ 127.0.0.1:7381 GET thing1
前面的示例演示了 Spring Data Redis 遵循的一般策略。 请注意,某些作可能需要将大量数据加载到内存中才能计算所需的命令。 此外,并非所有跨时隙请求都可以安全地移植到多个单时隙请求,如果被误用则出错(例如,PFCOUNT).

使用RedisTemplateClusterOperations

有关 RedisTemplate 的常规用途、配置和用法的信息,请参阅通过 RedisTemplate 处理对象部分RedisTemplate.spring-doc.cadn.net.cn

设置时要小心RedisTemplate#keySerializer使用任何 JSONRedisSerializers,因为更改 JSON 结构会直接影响哈希槽的计算。

RedisTemplate通过ClusterOperations接口,可以从RedisTemplate.opsForCluster(). 这允许您在集群中的单个节点上显式运行命令,同时保留为模板配置的序列化和反序列化功能。 它还提供管理命令(例如CLUSTER MEET)或更高级的作(例如,重新分片)。spring-doc.cadn.net.cn

以下示例演示如何访问RedisClusterConnectionRedisTemplate:spring-doc.cadn.net.cn

示例 3.访问RedisClusterConnectionRedisTemplate
ClusterOperations clusterOps = redisTemplate.opsForCluster();
clusterOps.shutdown(NODE_7379);                                              (1)
1 在 7379 处关闭节点并交叉手指,有一个可以接管的副本。
Redis Cluster 流水线目前仅支持通过 Lettuce 驱动程序,但使用跨槽键时的以下命令除外:rename,renameNX,sort,bLPop,bRPop,rPopLPush,bRPopLPush,info,sMove,sInter,sInterStore,sUnion,sUnionStore,sDiff,sDiffStore. 完全支持同槽键。