一、redis事物及锁应用
MULTI、EXEC、DISCARD和WATCH命令是Redis事务功能的基础。Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项:
1、Redis会将一个事务中的所有命令序列化,然后按顺序执行。Redis不可能在一个Redis事务的执行过程中插入执行另一个客户端发出的请求。这样便能保证Redis将这些命令作为一个单独的隔离操作执行。2、在一个Redis事务中,Redis要么执行其中的所有命令,要么什么都不执行,这种特性保证了其原子性。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby wang 100
QUEUED
127.0.0.1:6379> incrby zhao 100
QUEUED
127.0.0.1:6379> exec
1) (integer) 600
2) (integer) 300
- Redis事物不支持回滚, 对于队列中的指令,只能检查语法错误(语法错误则直接取消执行),不能发现逻辑错误,并且对于之前的指令,执行了不能回滚,虽然在multi中可以执行discard清空执行队列,但是一旦执行,不支持回滚操作。
PS:由于Redis官网无法正常访问,只能使用其他汉化手册(redis参考手册)
Redis使用的是乐观锁,只是监视事物变化,一旦变化,则视为异常,阻止事物的执行
//使用锁正常时
127.0.0.1:6379> set ticket 1
OK
127.0.0.1:6379> watch ticket
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decr ticket
QUEUED
127.0.0.1:6379> decrby lisi 100
QUEUED
127.0.0.1:6379> exec
1) (integer) 0
2) (integer) 400
//使用锁异常时
127.0.0.1:6379> set ticket 1
OK
127.0.0.1:6379> watch ticket
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decr ticket
QUEUED
127.0.0.1:6379> decrby lisi 100
QUEUED
127.0.0.1:6379> exec
(nil)
二、消息发布与订阅
- 消息发布
127.0.0.1:6379> publish news "Hello World!"
(integer) 0
127.0.0.1:6379> publish news "Hello World!"
(integer) 1
- 监听(监听端口可以加入通配符等,来一次监听多个端口)
127.0.0.1:6379> subscribe news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
1) "message"
2) "news"
3) "Hello World!"
- 使用pubsub channels命令可以查看有哪些端口被监听
网友评论