Redis支持简单的事物,但是没有mysql的Innodb支持的那么的完善
我们接下来看一下Redis和Mysql的事物的一个对比:
MySQL | Redis | |
开启 | start transaction | multi |
语句 | 普通的SQL | 普通的命令 |
失败 | rollback 回滚 | discard 取消 |
成功 | commit | exec |
注:
在MySQL和Redis中,如果已经成功的执行了2条语句,但到第3条语句出错
那我们rollback后,前2条语句的影响消失,discard只是结束本次事物,但前两条语句或者说是命令的造成的影响仍然还是存在的
接下来我们再来思考一个问题:
我正在买票
Ticket -1 , money -100
而票只有1张, 如果在我multi之后,和exec之前, 票被别人买了---即ticket变成0了.
我该如何观察这种情景,并不再提交
悲观的想法:
世界充满危险,肯定有人和我抢, 给 ticket上锁, 只有我能操作. [悲观锁]
乐观的想法:
没有那么人和我抢,因此,我只需要注意,
--有没有人更改ticket的值就可以了 [乐观锁]
Redis的事务中,启用的是乐观锁,只负责监测key没有被改动.
1 具体的命令---- watch命令 2 例: 3 redis 127.0.0.1:6379> watch ticket 4 OK 5 redis 127.0.0.1:6379> multi 6 OK 7 redis 127.0.0.1:6379> decr ticket 8 QUEUED 9 redis 127.0.0.1:6379> decrby money 100 10 QUEUED 11 redis 127.0.0.1:6379> exec 12 (nil) // 返回nil,说明监视的ticket已经改变了,事务就取消了. 13 redis 127.0.0.1:6379> get ticket 14 "0" 15 redis 127.0.0.1:6379> get money 16 "200" 17 18 19 watch key1 key2 ... keyN 20 作用:监听key1 key2..keyN有没有变化,如果有变, 则事务取消 21 22 unwatch 23 作用: 取消所有watch监听
上面就是Redis的一个简单的事物,但我们如果要用事物的话,还是建议使用mysql支持的事物会好些
我们接下来看一下消息的订阅与消息的发布:
使用办法: 订阅端: Subscribe 频道名称 发布端: publish 频道名称 发布内容 客户端例子: redis 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) "good good study" 1) "message" 2) "news" 3) "day day up" 服务端例子: redis 127.0.0.1:6379> publish news 'good good study' (integer) 1 redis 127.0.0.1:6379> publish news 'day day up' (integer) 1
这个也是一个特别简单但是特别实用的一个功能,我们可以使用这样的一个功能来进行聊天室的创建等等