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

来源:互联网 发布:手机太阳系模拟软件 编辑:程序博客网 时间:2024/06/15 15:16

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

(2013-05-30 11:32:55)
转载
标签:

redis

cluster

命令处理

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

情景一:MULTI/EXEC事务中的所有命令均操作相同的主键,且该主键就在当前连接的Redis节点上
[root@compute-09-00 ~]# /usr/local/redis/bin/redis-cli
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> set hello world
QUEUED
redis 127.0.0.1:6379> set hello earth
QUEUED
redis 127.0.0.1:6379> set hello china
QUEUED
redis 127.0.0.1:6379> exec
1) OK
2) OK
3) OK
执行结果:事务中的每条命令都可以正确执行!

情景二:MULTI/EXEC事务中的所有命令均操作相同的主键,但该主键不在当前连接的Redis节点上
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> get foo
(error) MOVED 12182 192.168.32.4:6379
redis 127.0.0.1:6379> set foo bar
(error) MOVED 12182 192.168.32.4:6379
redis 127.0.0.1:6379> exec
(empty list or set)
执行结果:事务中的任何命令都无法执行,对于每条命令均返回MOVED信息!

情景三:MULTI/EXEC事务中的所有命令操作不同的主键,且某些主键不在当前连接的Redis节点上
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> set hello america
QUEUED
redis 127.0.0.1:6379> set foo rab
(error) MOVED 12182 192.168.32.4:6379
redis 127.0.0.1:6379> exec
1) OK
redis 127.0.0.1:6379> get hello
"america"
执行结果:主键在当前连接的Redis节点上的命令可以正确执行,主键不在当前连接的Redis节点上的命令返回MOVED信息!

情景四:MULTI/EXEC事务中的所有命令操作不同的主键,且所有主键均在当前连接的Redis节点上
redis 192.168.32.3:6379> multi
OK
redis 192.168.32.3:6379> set id 10003
QUEUED
redis 192.168.32.3:6379> set number 20004
QUEUED
redis 192.168.32.3:6379> set student30098
QUEUED
redis 192.168.32.3:6379> exec
1) OK
2) OK
3) OK
执行结果:事务中的所有命令均可以成功执行!

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

情景六:Multiple主键命令包含了多个相同的主键,且该主键在当前连接的Redis节点上
redis 192.168.32.3:6379> mset id 10004 id 20005id 30099
OK
redis 192.168.32.3:6379> mget id id id
1) "30099"
2) "30099"
3) "30099"
执行结果:命令有效,成功执行!

情景七:Multiple主键命令包含了多个相同的主键,但该主键不在当前连接的Redis节点上
redis 192.168.32.3:6379> mset hello world helloearth hello universe
(error) MOVED 866 192.168.32.2:6379
redis 192.168.32.3:6379> mget hello hellohello
(error) MOVED 866 192.168.32.2:6379
执行结果:命令有效,返回MOVED信息!

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

原创粉丝点击