Redis系列文章目录
@
目录一、Redis事务是什么?
概念:
- 可以一次执行多个命令,本质是一组命令的集合。一个事务中所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不允许阻塞。
如何使用?
-
事务相关命令:
(1)DISCARD
取消事务,放弃执行事务块内地所有命令;
(2)EXEC
执行所有事务块内的命令;
(3)MULTI
标记一个事务块的开始;
(4)UNWATCH
取消WATC命令对所有key的监视;
(5)WATCH key [key ....]
监视一个或者多个key,如果在事务执行之前这个key被其它命令所改动,那么事务会被打断; -
事务的正常执行:
-
放弃事务:
-
全体连坐:类似于Java中的异常处理,书写代码时就会报错,但是它不会处理 1/0=xx 这种错误,这种错误需要在编译时才能被发现。
-
冤头债主:说明了Redis对事务是部分支持
-
watch监控
-
表锁:将整张表锁住,其它行的任何操作都不行;
-
行锁:仅仅锁住这一行。
-
悲观锁:类似于表锁。数据的正确性是最高的。
-
乐观锁:类似于行锁。每条记录包括一个Version版本信息,每次有用户修改后Version加1。此时如果有A和B两个用户共同修改一条记录,但是A先提交后将Version+1;然后B再去提交时会报错,因为此时数据库中该条记录的Version已经为2了,就需要B重新从数据库中获取该条记录然后再次修改后提交。这样保证了数据的统一性。
-
watch的应用:
-
watch:watch命令是一个乐观锁,它可以在EXEC命令执行前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改过了,如果是的话服务器会拒绝执行事务。
-
unwatch命令:放弃对所有key的监控。
-
一旦执行了exec,之前加的所有的监控锁都会被取消掉了。
-
Watch 命令可以被调用多次,一个Watch 命令可以监控多个key。Watch 命令调用即启动监控功能,从Watch 命令开始点到执行EXEC命令终止。一旦EXEC被调用,所有的键都将不被监视,无论所讨论的事务是否被中止。关闭客户端连接也会触发所有的键被取消监视。
-
Redis Watch 命令给事务提供check-and-set (CAS) 机制。被Watch的Key被持续监控,如果key在Exec命令执行前有改变,那么整个事务被取消,Exec返回null表示事务没有成功。
实例:
num = GET sampleKey
num = num + 1
SET sampleKey $num
上面的命令在单用户环境下没有问题。如果多个用户都尝试同时增加值就会出现竞争条件,此时结果为14而不是15.
WATCH sampleKey
num = GET sampleKey
num = num + 1
MULTI
SET sampleKey $num
EXEC
使用了WATCH 关键字能够有效保障竞争条件,一个用户修改后另外一个用户就不能操作了。
事务总结:
二、Redis消息发布订阅?
进程间的一种通信模式,发送者(pub) 发送消息,订阅者(sub) 接收消息。一般使用 rabbitmq来作为消息发布订阅。
//可以一次订阅多个
SUBSCRIBE c1 c2 c3;
//消息发布
PUBLISH c2 hello-redis
//订阅多个
PSUBSCRIBE new*
参考:
violate特性详解: https://www.cnblogs.com/monkeysayhi/p/7654460.html
https://blog.csdn.net/jiyiqinlovexx/article/details/50989328