redis_4_事务和发布订阅

一、redis中的事务

什么是事务:
可以一次性执行多个命令,本质是一组命令的集合,一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞。实质上是一个批处理,即一次性执行多个命令,在这中间不允许其他命令,在这中的所有命令要不一起成功,要不一起失败。- - -redis对事务的支持是部分支持,不像oracle一样强一致性,冤头债主就是这样,对的我放行,谁错就找谁。

能干什么:一个队列中,一次性,顺序性,排他性的执行一系列命令。

multi:标记一个事务块的开始,然后会返回一个ok,但是并不能表示事务成功,只能表示redis收到,至于能不能成功,什么时候执行,都还不知道,redis会将这个事务放入队列中,具体执行需要调用exec命令,discard命令表示放弃丢弃本次的批处理操作。

exec:执行所有事务块内的命令。一旦执行了exec命令,exec之前的监控锁都会被取消掉。

discard:取消事务,放弃执行事务块内的所有命令。

unwatch:取消watch命令对所有key的监视。

watch key [key…..]:
监视一个或多个key,如果在事务执行之前这个 (或这些)key被动其他命令所改动,那么事务将被打断(大致的意思就是:我从数据库去了某个值,假如是99,将这个数进行一些列的运算后,想把这个数更新到数据库中,发现这个数还是99就ok,如果这个数已经不是99了,说明已经有人比你先进行了对这个数的更新,watch提交将会失败,只能放弃本次的监控提交操作)

queued:表示加入事务的队列中,但是并没有执行,一旦exec,就各取所需,返回一堆结果。

正常执行实例:

这里写图片描述

放弃事务实例:我突然发现有个值赋错了,或者我不想对这个值赋值,就放弃本次事务和批处理。

这里写图片描述

全体连坐实例:要么一次性全部成功,要么一次性全部失败,一人出错,全体受罚,加入队列就报错,相当于java中的非运行是异常,还没打exec就告诉你,我挂了,就相当于java中直接报错了。

这里写图片描述

冤头债主实例:加入队列时候不报错,但是是错的,执行的时候不成功,其他队中的命令能执行成功,相当于java中的运行时异常,只有运行的时候才会报错。

这里写图片描述

watch中的悲观锁:
我在处理事务的时候看,认为一定有人会修改数据,就直接把整张表锁了。
表锁:把整张表锁了,我在用的时候,整张表别人都不能用,需要排队—并发性贼差,但是一致性很好。

watch中的乐观锁:
用的比较多,不锁整张表,为了既保证高并发,又保证一致性,在每条记录后面加一个version这个字段,即一个版本号,每次修改都会改变版本号。如果a拿了1版本的取修改tel,b也拿了1版本的取修改QQ,但是b先改完,然后将版本号改为了2,a改完tel之后提交发现版本后不对,然后就会报错,然后再从2版本中获取信息再进行修改,直到对为止。

watch实例:相当于一把锁

这里写图片描述

这里写图片描述

结论:监视k1,然后另一个终端给k1重新赋值,然后这个人开启事务,改变k1的值,再执行,发现返回的是null,说明事务不成功,是因为k1这个值在监控之前和提交的时候不一致。

二、redis中的订阅发布

是什么:进程间的一种消息模式:发送者(pub)发送消息,订阅者(sub)接受消息。- - -一般企业不用redis用作消息队列

订阅:subscribe 频道

发布:publish 频道 发布的内容

这里写图片描述

这里写图片描述

退订:unsubscribe 频道

订阅给定模式的频道:psubscribe 频道*

退订所有给定模式的频道:punsubscribe 频道*

查看订阅发布系统状态:PUBSUB [argument [argument …]] - - - 返回值是:由活跃频道组成的列表

这里写图片描述

猜你喜欢

转载自blog.csdn.net/tuesdayma/article/details/79066844