在重新分片 Redis Enterprise 数据库之前需要检查什么?
上次更新时间:2024 年 4 月 18 日
问题
在重新分片 Redis Enterprise 数据库之前需要检查什么?
回答
在分片 Redis Enterprise 数据库中支持对多重密钥的操作(例如 MSET 和 MGET(以及其他可变命令)),但不能保证原子性,代理会管理不同分片间的可变命令),但对于同时为多密钥命令和跨插槽命令的操作存在限制。
当 Redis Enterprise 数据库未分片时,不会强制执行此类约束
redis-12730.cluster.local:12730> MULTI
OK
redis-12730.cluster.local:12730(TX)> SET user:1 "John Smith"
QUEUED
redis-12730.cluster.local:12730(TX)> SET user:1:books "56456,656565,55555"
QUEUED
redis-12730.cluster.local:12730(TX)> EXEC
1) OK
2) OK
然而,当数据库分片时,不会允许受影响密钥位于不同插槽中的命令:跨插槽命令需要协调跨分片操作,但为了更简单和更高性能而通过设计不支持此类命令。在此示例中,在集群数据库中运行相同 Redis 事务
redis-12730.cluster.local:12730> MULTI
OK
redis-12730.cluster.local:12730(TX)> SET user:1 "John Smith, London"
QUEUED
redis-12730.cluster.local:12730(TX)> SET user:1:books "56456,656565,55555,6666"
(error) CROSSSLOT Keys in request don't hash to the same slot (context='within MULTI', command='SET', original-slot='10778', wrong-slot='3197', first-key='user:1', violating-key='user:1:books')
总结
- 应在同一插槽中的密钥上执行
WATCH/MULTI/EXEC
代码块内的操作。 - 只有当所有受影响的密钥均位于同一插槽中时,才可以使用
SDIFF
或ZUNION
等多密钥命令。此类命令的示例有:BITOP, BLPOP, BRPOP, BRPOPLPUSH, MSETNX, RPOPLPUSH, SDIFF, SDIFFSTORE, SINTER, SINTERSTORE, SMOVE, SORT, SUNION, ZINTER, ZINTERSTORE, ZUNION, ZUNIONSTORE, ZDIFF, ZDIFFSTORE
- 同样,Lua 脚本和 Redis 函数必须针对同一插槽中的密钥进行操作
可以用 INFO COMMANDSTATS 来审核在 Redis 中执行的命令,并验证在数据库上执行的命令是否是“群集安全的”。
请注意,重新分片操作在不中断服务的情况下执行,但在进程完成之前会产生一定延迟。
参考
参阅文档了解更多信息多键操作。