Redis Cluster处理MULTI/EXEC事务以及Multiple主键命令时的限制

在上一篇博文中,本博主介绍了Redis Cluster的搭建方法,从中可以看出其使用方法与单机版Redis确实存在着不小的差异。实际上,除了搭建配置方法以外,Redis Cluster还具有一些其他方面的不同,譬如它不支持多个数据库,不支持select命令等等,但其中最大的不同还是Redis Cluster不支持复杂的多主键操作。关于这一点,Redis Cluster的官方文档有这样一段描述,现摘录如下:Commands performing complex multi key operations like Set type unions or intersections are not implemented, and in general all the operations where in theory keys are not available in the same node are not implemented。由这段描述可知,在Redis Cluster中任何跨节点的命令都是不允许的,但是落实到具体的系统实现中,Redis Cluster又是如何去处理这些命令的呢?我们不妨通过两种典型的命令来验证一下,其中一种是MULTI/EXEC事务命令,该命令可以将多条Redis命令一次执行,所以这类命令可能同时操作多个主键,另外一种是本身就支持多主键的命令如mset和mget等。下面,本博主就在之前搭建的Redis Cluster上,分别尝试了以上两类命令的不同执行场景,以此来感性地认识Redis Cluster的反应!

情景一:MULTI/EXEC事务中的所有命令均操作相同的主键,且该主键就在当前连接的Redis节点上
  1. [root@compute-09-00 ~]# /usr/local/redis/bin/redis-cli
  2. redis 127.0.0.1:6379> multi
  3. OK
  4. redis 127.0.0.1:6379> set hello world
  5. QUEUED
  6. redis 127.0.0.1:6379> set hello earth
  7. QUEUED
  8. redis 127.0.0.1:6379> set hello china
  9. QUEUED
  10. redis 127.0.0.1:6379> exec
  11. 1) OK
  12. 2) OK
  13. 3) OK
复制代码


执行结果:事务中的每条命令都可以正确执行!

情景二:MULTI/EXEC事务中的所有命令均操作相同的主键,但该主键不在当前连接的Redis节点上
  1. redis 127.0.0.1:6379> multi
  2. OK
  3. redis 127.0.0.1:6379> get foo
  4. (error) MOVED 12182 192.168.32.4:6379
  5. redis 127.0.0.1:6379> set foo bar
  6. (error) MOVED 12182 192.168.32.4:6379
  7. redis 127.0.0.1:6379> exec
  8. (empty list or set)
复制代码


执行结果:事务中的任何命令都无法执行,对于每条命令均返回MOVED信息!


情景三:MULTI/EXEC事务中的所有命令操作不同的主键,且某些主键不在当前连接的Redis节点上
  1. redis 127.0.0.1:6379> multi
  2. OK
  3. redis 127.0.0.1:6379> set hello america
  4. QUEUED
  5. redis 127.0.0.1:6379> set foo rab
  6. (error) MOVED 12182 192.168.32.4:6379
  7. redis 127.0.0.1:6379> exec
  8. 1) OK
  9. redis 127.0.0.1:6379> get hello
  10. "america"
复制代码


执行结果:主键在当前连接的Redis节点上的命令可以正确执行,主键不在当前连接的Redis节点上的命令返回MOVED信息!

情景四:MULTI/EXEC事务中的所有命令操作不同的主键,且所有主键均在当前连接的Redis节点上
  1. redis 192.168.32.3:6379> multi
  2. OK
  3. redis 192.168.32.3:6379> set id 10003
  4. QUEUED
  5. redis 192.168.32.3:6379> set number 20004
  6. QUEUED
  7. redis 192.168.32.3:6379> set student 30098
  8. QUEUED
  9. redis 192.168.32.3:6379> exec
  10. 1) OK
  11. 2) OK
  12. 3) OK
复制代码


执行结果:事务中的所有命令均可以成功执行!

情景五:Multiple主键命令包含了不同的主键,且所有主键均在当前连接的Redis节点上
redis 192.168.32.3:6379> mset id 10004 number 20005 student 30099
(error) ERR Multi keys request invalid in cluster
redis 192.168.32.3:6379> mget id number student
(error) ERR Multi keys request invalid in cluster
执行结果:命令无效,无法执行!

情景六:Multiple主键命令包含了多个相同的主键,且该主键在当前连接的Redis节点上
  1. redis 192.168.32.3:6379> mset id 10004 id 20005 id 30099
  2. OK
  3. redis 192.168.32.3:6379> mget id id id
  4. 1) "30099"
  5. 2) "30099"
  6. 3) "30099"
复制代码


执行结果:命令有效,成功执行!


情景七:Multiple主键命令包含了多个相同的主键,但该主键不在当前连接的Redis节点上
  1. redis 192.168.32.3:6379> mset hello world hello earth hello universe
  2. (error) MOVED 866 192.168.32.2:6379
  3. redis 192.168.32.3:6379> mget hello hello hello
  4. (error) MOVED 866 192.168.32.2:6379
复制代码


执行结果:命令有效,返回MOVED信息!


   基于以上执行结果,我们可以知道对于MULTI/EXEC事务来说,执行效果与逐条处理单个命令一样,被事务包裹的Redis命令连接节点能够处理就处理,无法处理的就返回MOVED信息。但是对于Multiple主键的命令来说,只要在命令中包含了多个不同的主键,那么无论这些主键能不能被连接节点所处理,命令都是无效的!当然,以上只是通过一些具体的命令执行实例来看Redis Cluster的执行效果,如果想对Redis Cluster的命令处理有更详细的了解,那么推荐的方法还是去看源码中的cluster.c文件。

你可能感兴趣的:(数据库)