Redis
Redis 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。
发布和订阅
什么是发布和订阅
Redis发布订阅(pub/sub)是一种消息通信模式:发布者发布消息,订阅者接收消息。
客户端可以订阅任意数量的频道。客户端发送消息需要指定消息频道和内容,订阅者根据频道接收消息,一个频道可被多个客户端订阅。
发布订阅命令
1、打开一个客户端订阅channel1
subscribe channel1
输出以下信息并保持连接
127.0.0.1:6379> subscribe channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
2、打开另一个客户端,给channel1发布消息hello
publish channel1 hello
3、在第一个客户端看到消息输出
127.0.0.1:6379> subscribe channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"
2) "channel1"
3) "hello"
注意:发布的消息没有持久化,订阅的客户端只能收到订阅后发布的消息,就好比看不了打开手机之前的直播内容,如果做了持久化就可以,类似于看直播的回放。
Redis事务
1、简介
Redis事务是一个独立隔离独操作,可以一次性执行多个命令,事务中的所有命令都会序列化且按顺序进行,主要有以下三个保证:
- 批量操作执行前命令被放入队列缓存
- 收到EXEC执行命令后进入事务,事务中的任意命令执行失败,其他的命令依然会执行
- 事务在执行的过程中,客户端提交的其他命令请求不会被插入到事务执行命令序列中
一个事务从开始执行会经历三个阶段:
- 开始事务
- 命令入队
- 执行事务
2、事务命令Multi、Exec、Discard
从输入Multi命令后,后面输入的命令都会一次进入命令队列中,但不会执行,直到输入Exec后,Redis会吧命令队列中的命令依次执行。组队过程中可以通过Discard来放弃组队。
3、正常执行
(1)事务正常执行
127.0.0.1:6379> set name marry
QUEUED
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> set sex 1
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
(2)取消组队
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name marry
QUEUED
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> set sex 1
QUEUED
127.0.0.1:6379> discard
OK
4、事务的错误处理
(1)组队时报错,所有命令都不会执行
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name marry
QUEUED
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> set sex
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
(2)执行阶段报错,只有报错的命令不执行,其他命令会被执行,不会回滚
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name marry
QUEUED
127.0.0.1:6379> incr name
QUEUED
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
5、watch和unwatch
用watch监听key,被监听的key如果在事务开启后被修改了值,则执行失败
打开两个客户端,新加一个String类型数据,key为num,value为200,然后在客户端1监听num。
客户端1:
127.0.0.1:6379> set num 200
OK
127.0.0.1:6379> keys *
1) "num"
127.0.0.1:6379> watch num
OK
客户端2:
127.0.0.1:6379> keys *
1) "num"
然后在客户端1中开启事务,并加入命令不执行,在客户端2中修改num的值
客户端1:
127.0.0.1:6379> set num 200
OK
127.0.0.1:6379> keys *
1) "num"
127.0.0.1:6379> watch num
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incrby num 20
QUEUED
在客户端2中修改num的值:
127.0.0.1:6379> keys *
1) "num"
127.0.0.1:6379> incr num
(integer) 201
然后在客户端1中执行事务,则不成功。
127.0.0.1:6379> exec
(nil)
用unwatch命令可以取消监听。

被折叠的 条评论
为什么被折叠?



