redis watch multi exec 关系

EXEC

执行所有事务块内的命令。

假如某个(或某些) key 正处于 WATCH 命令的监视之下,且事务块中有和这个(或这些) key 相关的命令,那么EXEC 命令只在这个(或这些) key 没有被其他命令所改动的情况下执行并生效,否则该事务被打断(abort)。

返回值:

事务块内所有命令的返回值,按命令执行的先后顺序排列。

当操作被打断时,返回空值 nil 。


# 监视 key ,且事务成功执行
127.0.0.1:6379> get key"111"127.0.0.1:6379> watch keyOK127.0.0.1:6379> multiOK127.0.0.1:6379> set key 222QUEUED127.0.0.1:6379> exec1) OK127.0.0.1:6379> get key"222"127.0.0.1:6379> 

# 监视 key ,且事务被打断

127.0.0.1:6379> set key 222QUEUED127.0.0.1:6379> exec1) OK127.0.0.1:6379> get key"222"127.0.0.1:6379> watch keyOK127.0.0.1:6379> set key 333OK127.0.0.1:6379> multiOK127.0.0.1:6379> set key 444QUEUED127.0.0.1:6379> exec(nil)127.0.0.1:6379> get key "333"------------------在同一个客户端下 只要在watch之后,multi执行之前改变key的值,则将以改变后的值为当前的key值,之后事务中执行关于改变key值的操作将不再生效.在不同客户端下,例如在a客户端执行watch key 然后执行multi .这时在b客户端下重新set key 值,再回到a客户端,也重新设置另一个set key 值,这时exec后将返回为空值,最终key值为b客户端下设定的值.理论上来说将会以a客户端在事务中最后设置的值为最终值,但是a客户端会认为b客户端在multi之前执行的值,此后a客户端执行便返回为空.
时间: 2024-10-12 15:32:12

redis watch multi exec 关系的相关文章

用Redis实现微博关注关系

用Redis实现微博关注关系的分析 关注关系产生的四种关系状态 关注 粉丝 双向关注(互粉) 无关系 需求分析 在微博中,每一个用户都会有一个关注列表,一个粉丝列表.用户可以查看自己的关注,粉丝列表,也可以查看别人的关注,粉丝列表.并且,要展示列表里每个人与当前查看者的关注状态.状态的可能性就是上面讲到得四种关系状态. 问题可以分两种情况来看: 看自己的关注,粉丝列表 看别人的关注,粉丝列表 看自己的关注,粉丝列表: 这种情况相对简单一点.比如看自己的关注列表,列表里的人的与自己的关系状态不可能

Redis(1)-用redis存储商品-用户关系

package com.lipeng; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import

redis中multi和pipeline区别以及效率(推荐使用pipeline)

手册得知 pipeline 只是把多个redis指令一起发出去,redis并没有保证这些指定的执行是原子的:multi相当于一个redis的transaction的,保证整个操作的原子性,避免由于中途出错而导致最后产生的数据不一致.通过测试得知,pipeline方式执行效率要比其他方式高10倍左右的速度,启用multi写入要比没有开启慢一点. 上代码,望高手指点. <?php set_time_limit(0); ini_set('memory_limit','1024M'); $redis =

RedisTemplate 事务处理方法 watch multi exec 的使用

@Autowired RedisTemplate<String,String> redisTemplate; redisTemplate.execute(new SessionCallback<Object>(){ @Override public <K, V> Object execute(RedisOperations<K, V> operations) throws DataAccessException { //开启事务 operations.mul

Redis和Memcache的关系

转自: http://blog.163.com/sun_jian_zhang/blog/static/187804041201310795917333/ 1. Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别. 2. Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储. 3. Redis支持数据的备份,即master-slave模式的数据备份. 4. Redis支持数据的持久化,可以将内存中的数据保持在磁

linux redis哨兵 mysql主从关系 等等

centos7 安装 mariadb 1 yum 源  -- 配置阿里的 (da) 2 rmp 方式 3 源码编译方式  -- 专业DBA 虚拟环境 不影响 Redis/ mariadb rmp  -q  mariadb  检测有没装  只能检测通过yum安装的 先workon 虚拟环境, 在这个里面打开项目 配置 官方源 1 引入 yum 仓 /etc/yum.repos.d/目录下 手动创建一个 mariadb.repo 写入如下内容 [mariadb] name = MariaDB bas

Redis面试总结

Redis port:6379 简介 redis3.0以上支持redis cluster redis :remote dictionary server 远程字典服务 nosql非关系型数据库:redis/memcached/mongoDB/hbase redis和memcached区别 1)redis支持存储多种数据结构 redis不仅仅支持简单的K/V数据类型的存储,同时还提供string(字符串).list(列表).set(集合).zset(有序集合),hash(哈希数据)等数据结构的存储

Redis源代码分析(十七)--- multi事务操作

redis作为一非关系型数据库,居然相同拥有与RDBMS的事务操作,不免让我认为比較吃惊.在redis就专门有文件就是运行事务的相关操作的.也能够让我们领略一下.在Redis的代码中是怎样实现事务操作.首先亮出mulic.c以下的一些API. /* ================================ MULTI/EXEC ============================== */ void initClientMultiState(redisClient *c) /* 初始

Redis源码分析(十七)--- multi事务操作

redis作为一非关系型数据库,竟然同样拥有与RDBMS的事务操作,不免让我觉得比较惊讶.在redis就专门有文件就是执行事务的相关操作的.也可以让我们领略一下,在Redis的代码中是如何实现事务操作.首先亮出mulic.c下面的一些API. /* ================================ MULTI/EXEC ============================== */ void initClientMultiState(redisClient *c) /* 初始