将 Redis 存储库与 Redis 集群结合使用时,请熟悉如何在集群上运行 Redis 存储库。 |
使用 Redis 集群时不要依赖密钥空间事件,因为密钥空间事件不会跨分片复制。 Pub/Sub 订阅一个随机集群节点,该节点仅接收来自单个分片的密钥空间事件。 使用单节点 Redis 避免密钥空间事件丢失。 |
将 Redis 存储库与 Redis 集群结合使用时,请熟悉如何在集群上运行 Redis 存储库。 |
使用 Redis 集群时不要依赖密钥空间事件,因为密钥空间事件不会跨分片复制。 Pub/Sub 订阅一个随机集群节点,该节点仅接收来自单个分片的密钥空间事件。 使用单节点 Redis 避免密钥空间事件丢失。 |
使用 Redis 集群连接
Redis 集群的行为不同于单节点 Redis,甚至不同于 Sentinel 监控的主副本环境。
这是因为自动分片将密钥映射到其中一个插槽,这些插槽分布在节点上。
因此,涉及多个键的命令必须断言所有键映射到完全相同的插槽,以避免跨插槽错误。
单个群集节点仅提供一组专用密钥。
对一个特定服务器发出的命令仅返回该服务器提供的那些密钥的结果。
作为一个简单的示例,请考虑该命令。
当发出到群集环境中的服务器时,它仅返回请求发送到的节点提供的密钥,而不一定返回群集中的所有密钥。
因此,要获取集群环境中的所有密钥,您必须从所有已知的主节点读取密钥。16384
KEYS
虽然将特定键重定向到相应的插槽服务节点由驱动程序库处理,但更高级别的功能(例如跨节点收集信息或向群集中的所有节点发送命令)由 .
从前面的密钥示例中获取,这意味着该方法选取集群中的每个主节点,并同时在每个主节点上运行命令,同时获取结果并返回累积的密钥集。
仅请求单个节点的密钥会为这些方法提供重载(例如,)。RedisClusterConnection
keys(pattern)
KEYS
RedisClusterConnection
keys(node, pattern)
A 可以从主机和端口或节点 ID 中获取,也可以通过使用主机和端口或节点 ID 来构造。RedisClusterNode
RedisClusterConnection.clusterGetNodes
以下示例显示了在群集中运行的一组命令:
[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-20242 (2)
164888... 127.0.0.1:7381 master - 0 1449730618304 3 connected 10923-20243 (3)
b8b5ee... 127.0.0.1:7382 slave 6b38bb... 0 1449730618304 25 connected (4)
RedisClusterConnection connection = connectionFactory.getClusterConnnection();
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
[email protected]:7379 > cluster nodes
6b38bb... 127.0.0.1:7379 master - 0 0 25 connected 0-5460 (1)
7bb...
RedisClusterConnection connection = connectionFactory.getClusterConnnection();
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 |
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] |
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 |
使用 和RedisTemplate
ClusterOperations
有关 的一般用途、配置和用法的信息,请参阅通过 RedisTemplate 处理对象部分。RedisTemplate
使用任何 JSON 进行设置时要小心,因为更改 JSON 结构会立即影响哈希槽计算。RedisTemplate#keySerializer RedisSerializers |
RedisTemplate
通过接口提供对特定于集群的操作的访问,该接口可从 获取。
这样,您就可以在群集中的单个节点上显式运行命令,同时保留为模板配置的序列化和反序列化功能。
它还提供管理命令(如 )或更高级的操作(例如,重新分片)。ClusterOperations
RedisTemplate.opsForCluster()
CLUSTER MEET
以下示例演示如何使用 :RedisClusterConnection
RedisTemplate
RedisClusterConnection
RedisTemplate
ClusterOperations clusterOps = redisTemplate.opsForCluster();
clusterOps.shutdown(NODE_7379); (1)
1 | 关闭 7379 处的节点并交叉手指,有一个可以接管的副本。 |
Redis 集群流水线目前仅支持通过 Lettuce 驱动程序,使用跨槽键时以下命令除外:、、、
完全支持同插槽密钥。rename renameNX sort bLPop bRPop rPopLPush bRPopLPush info sMove sInter sInterStore sUnion sUnionStore sDiff sDiffStore |
使用任何 JSON 进行设置时要小心,因为更改 JSON 结构会立即影响哈希槽计算。RedisTemplate#keySerializer RedisSerializers |
1 | 关闭 7379 处的节点并交叉手指,有一个可以接管的副本。 |
Redis 集群流水线目前仅支持通过 Lettuce 驱动程序,使用跨槽键时以下命令除外:、、、
完全支持同插槽密钥。rename renameNX sort bLPop bRPop rPopLPush bRPopLPush info sMove sInter sInterStore sUnion sUnionStore sDiff sDiffStore |