Redis学习笔记06Redis命令之(5)事务

1.1.1. multi

开始一个新事务。

redis.coe2coe.me:6379> multi

OK

执行此命令后,后面执行的set等命令将被缓存,直到被discard命令取消,或者被exec命令提交执行。

一旦执行了multi,再执行的命令,将被缓存到一个执行队列中,而不是立即执行。因此这些命令的执行的结果,再其它客户端连接中是看不到的。

比如:

在连接1中:

redis.coe2coe.me:6379> select 0

OK

redis.coe2coe.me:6379> keys *

1) "port"

2) "host"

redis.coe2coe.me:6379> multi

OK

redis.coe2coe.me:6379> set a 1

QUEUED

返回值QUEUED表示当前命令并未执行,只是缓存到了执行队列中。因此键a在其它连接中不可见。

redis.coe2coe.me:6379> get a

QUEUED

redis.coe2coe.me:6379> get host

QUEUED

在连接2中:

redis.coe2coe.me:6379> select 0

OK

redis.coe2coe.me:6379> keys *

1) "port"

2) "host"

redis.coe2coe.me:6379> get a

(nil)

在连接1执行exec提交执行之前,键a是不可见的。

redis.coe2coe.me:6379> get host

"redis.coe2coe.me"

查询事务开始之前已经存在的键,是可以成功的。

1.1.2. discard

discard命令取消从最近的multi命令到discard之间的所有命令,这些命令将不会被执行,数据也不会被修改。

redis.coe2coe.me:6379> keys *

1) "port"

2) "host"

redis.coe2coe.me:6379> get host

"redis.coe2coe.me"

redis.coe2coe.me:6379> get port

"6379"

redis.coe2coe.me:6379> multi

OK

开启事务成功。

redis.coe2coe.me:6379> set a 1

QUEUED

这个命令暂时未执行,而是被加到队列中。

redis.coe2coe.me:6379> set b 1

QUEUED

redis.coe2coe.me:6379> set c 1

QUEUED

redis.coe2coe.me:6379> discard

OK

取消所有命令,清空执行队列。

redis.coe2coe.me:6379> keys *

1) "port"

2) "host"

再次检查键的集合,发现键a,b,c并没有增加到数据库中。

如果没有执行MULTI就执行DISCARD,则报错。

redis.coe2coe.me:6379> discard

(error) ERR DISCARD without MULTI

1.1.3. exec

将multi到exec之间的所有命令提交执行。

redis.coe2coe.me:6379> multi

OK

redis.coe2coe.me:6379> set host redis101.coe2coe.me

QUEUED

redis.coe2coe.me:6379> set a 1

QUEUED

redis.coe2coe.me:6379> set b 1

QUEUED

redis.coe2coe.me:6379> exec

1) OK

2) OK

3) OK

redis.coe2coe.me:6379> keys *

1) "port"

2) "b"

3) "a"

4) "host"

发现增加了a,b两个键。

redis.coe2coe.me:6379> get host

"redis101.coe2coe.me"

发现host这个键的值被修改了。

Redis事务的特点:

(1)原子性。

在执行exec命令时,multi和exec之间的命令将被顺序执行,而且是当做一个命令整体执行的,在这些命令执行过程中,Redis确保不会穿插执行其它客户端连接发送的命令。

这些命令要么全部被执行,要么一个也不执行。

(2)出错则取消

如果有一个命令格式不正确,则稍后执行exec时将取消所有命令,即使其中包含一些正确的可执行命令。

redis.coe2coe.me:6379> multi

OK

redis.coe2coe.me:6379> set a,3,4

(error) ERR wrong number of arguments for ‘set‘ command

redis.coe2coe.me:6379> set b 4

QUEUED

redis.coe2coe.me:6379> exec

(error) EXECABORT Transaction discarded because of previous errors.

1.1.4. watch

观察一个键的值,检测是否被其它客户端连接修改了。

连接1:

redis.coe2coe.me:6379> set a 1

OK

redis.coe2coe.me:6379> get a

"1"

redis.coe2coe.me:6379> watch a

OK

redis.coe2coe.me:6379> multi

OK

redis.coe2coe.me:6379> set b 1

QUEUED

此时,在连接2中执行如下命令:

redis.coe2coe.me:6379> set a 2

OK

此时,再到连接1中执行如下命令:

redis.coe2coe.me:6379> exec

(nil)

返回值nil表明事务执行出错了,即所有语句都没执行。

redis.coe2coe.me:6379> get a

"2"

redis.coe2coe.me:6379> get b

(nil)

在multi和exec或discard之间执行watch会导致出错。

redis.coe2coe.me:6379> multi

OK

redis.coe2coe.me:6379> watch a

(error) ERR WATCH inside MULTI is not allowed

1.1.5. unwatch

取消对所有被观察的键的观察。

执行exec和discard将自动执行unwatch,即自动取消对所有被观察的键的观察。

当执行了watch的连接断开之后,自动unwatch。

redis.coe2coe.me:6379> unwatch

OK

时间: 2024-10-24 14:41:51

Redis学习笔记06Redis命令之(5)事务的相关文章

Redis学习笔记04Redis命令之(3)服务器操作

1.1.1. client list 列出所有客户端连接信息. 每个连接使用一个id=xxx的行表示. redis.coe2coe.me:6379> client list id=8 addr=192.168.197.101:42247 fd=6 name= age=169 idle=169 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=command id=9 addr

Redis学习笔记~常用命令总结

回到目录 客户端redis-cli常用的命令总结 连接到服务器 redis-cli -h 127.0.0.1 -p 6379 --连接指定的redis服务器 发布/订阅, pub/sub模式运行在redis进程中,不会被持久化过,进程挂了,信息丢失 SUBSCRIBE Lind --订阅一个管道 PUBLISH Lind "你好,大叔!" --发布一个管道 键操作,redis数据都是由key/value组件,对key操作是所有操作的基础 DEL lind --删除键 Exist lin

Redis学习笔记07Redis命令之(6) 发布订阅

1.1.1. subscribe 订阅一个或多个频道.当所订阅的频道上发布了消息时,本客户端连接将收到这个消息. redis.coe2coe.me:6379> subscribe abc Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "abc" 3) (integer) 1 成功订阅了一个频道. 也可以一次订阅多个频道: redis.coe2coe.me:6379> subscr

Redis学习笔记05Redis命令之(4)配置和统计

1.1. 配置 1.1.1. config get 获取指定的配置信息,这些配置在redis.conf文件中指定,或者通过config set指定.config get 支持模糊匹配方式查询. redis.coe2coe.me:6379> config get log* 1) "logfile" 2) "./logs/redis.log" 3) "loglevel" 4) "debug" 1.1.2. config se

(转)redis 学习笔记(1)-编译、启动、停止

redis 学习笔记(1)-编译.启动.停止 一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先到这里下载Stable稳定版,目前最新版本是2.8.17 1.2 上传到linux,然后运行以下命令解压 tar xzf redis-2.8.17.tar.gz 1.3 编译 cd redis-2.8.17make 注:make命令需要linux上安装gcc,若机器上未安装gcc,redhat环境下,如

Redis学习笔记

Redis学习笔记:Redis是什么?redis是开源BSD许可高级的key-vlue存储系统可以用来存储字符串哈希结构链表.结构.集合,因此常用来提供数据结构服务. redis和memcache相比的独特之处:1.redis可以用来做存储,而memcache是用来做缓存 这个特点主要因为其有"持久化"的功能.2.存储的数据有"结构",对于memcache来说,存储的数据只有1种类型"字符串"而 redis则可以存储字符串.链表.哈希机构.集合.

Redis学习笔记4-Redis配置具体解释

在Redis中直接启动redis-server服务时, 採用的是默认的配置文件.採用redis-server   xxx.conf 这种方式能够依照指定的配置文件来执行Redis服务. 依照本Redis学习笔记中Redis的依照方式依照后,Redis的配置文件是/etc/redis/6379.conf.以下是Redis2.8.9的配置文件各项的中文解释. #daemonize no 默认情况下, redis 不是在后台运行的.假设须要在后台运行,把该项的值更改为 yes daemonize ye

Redis学习笔记7--Redis管道(pipeline)

redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client.基本的通信过程如下: Client: INCR X Server: 1 Client: INCR X Server: 2 Client: INCR X Server: 3 Client: INCR X Server: 4

Redis学习笔记(简单了解与运行)

Redis学习笔记(简单了解与运行) 开源的非关系型数据库 是REmote Dictionary Server(远程字典服务器)的缩写,以字典结构存储数据 允许其他应用通过TCP协议读写字典中的内容. Redis支持存储的键值数据类型 字符串类型 散列类型 列表类型 集合类型 有序集合类型 Redis的特性 通过一个列子看出Mysql和Redis的存储区别 例如: (存储一篇文章,文章包括:标题(title),正文(content),阅读量(views),标签(tags)) 需求: 把数据存储在