91、Redis - 事务 与 订阅-发布 相关的命令 及 演示

news/2024/10/29 5:30:23/

★ 事务相关的命令

Redis事务保证事务内的多条命令会按顺序作为整体执行,其他客户端发出的请求绝不可能被插入到事务处理的中间,

这样可以保证事务内所有命令作为一个隔离操作被执行。

Redis事务同样具有原子性,事务内所有命令要么全部被执行,要么全部被放弃。
比如事务执行过程中遇到数据库宕机,Redis会自动回滚这些已经执行过的命令。

需要说明的是,某条命令执行出现错误并不会影响事务提交。(这句下面会演示)

▲ 事务相关的常用命令如下:

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

MULTI: 开启事务

EXEC: 执行事务

WATCH key [key …]: 监视一个或多个key,如果在事务exec之前这些key对应的值被其他命令改动,事务会自动中断。

UNWATCH: 取消WATCH命令对所有key的监视。

【注意】 WATCH命令 必须在事务开启之前执行。

演示Redis的事务

一个简单的事务演示:
某条命令执行出现错误并不会影响事务提交
如图:这个事务一共有3条命令操作,其中有一条命令是错误的,会执行失败,但是不影响事务提交。

在这里插入图片描述

演示两个事务之间的操作:

情景:甲事务要修改Redis中 A key所对应数据,甲事务在执行的过程中肯定会对A key所对应数据加锁,
等待事务结束才会释放对A key的加锁。
因此在甲事务在对A key所对应数据的修改过程中,其他进程肯定无法修改A key对应的value。但试想一下,A key的value依赖于B key的value,
甲事务对A key的value所修改必须以B key所对应的value为基础。
换而言之,如果B key所对应的value已经被其他进程修改了,
那么甲事务对A key的value所修改应该自动撤销。此时就可以在甲事务开始之前,使用WATCH命令来监视B key,
这样当B key所对应的value发生修改后,甲事务自动撤销。【注意】WATCH命令必须在事务开始之前执行。
比如 watch keyB # 指定当keyB对应的value在其他命令修改之后,
当前进程中事务所做的修改就会自动撤销。

演示:先演示 keyA 和 keyB 没啥关系的情况下的事务执行。

先添加两个 key-value对,
然后开始事务
修改 keyA 的value值
在这里插入图片描述
然后这时候再开启一个redis。
可以看出修改keyB的事务,对修改keyA的事务并没有什么影响。
在这里插入图片描述

但是如果 keyA 和 keyB 有关联的话,我们要的效果应该是当 keyB 被修改过后,那么修改keyA的操作将失败才合理。
现在演示:
假设keyA是依赖keyB的,所以只要keyB在其他线程发生修改,那keyA这边的事务就会被撤销。

在这里插入图片描述

UNWATCH: 取消WATCH命令对所有key的监视。

测试:这个watch 的监视的作用时间,在上一个事务执行完成后,就失效了,我重新开一个事务,就没有再监视keyB了。
在这里插入图片描述

测试在事务的执行过程中能否去掉对key的监视。
结论:对keyB的监视作用还在,所以说明这个去掉监视的命令,
不能在事务中执行
在这里插入图片描述

再测试一遍,在事务开启前取消对key的监视
结论:表明这个取消对key监视的命令,需要在事务开启前执行
在这里插入图片描述

★ 发布订阅相关的命令:

Redis内置支持发布/订阅的消息机制,消息订阅者可以订阅一个或多个channel,
每个channel也可被多个消息订阅者订阅。只要消息发布者向某个channel发布消息,
该消息就会同时被该channel的多个消息订阅者收到。

发布/订阅相关的常用命令如下:

SUBSCRIBE channel [channel …]: 订阅一个或多个channel。
UNSUBSCRIBE [channel [channel …]]: 取消订阅一个或多个channel,如果不带参数,表明取消订阅所有channel。
PSUBSCRIBE pattern [pattern …]: 按模式匹配的方式订阅一个或多个channel。
PUNSUBSCRIBE [pattern [pattern …]]: 按模式匹配的方式取消订阅一个或多个channel,如果不带参数,表明取消订阅所有channel。
PUBLISH channel message: 向指定channel发布消息。
PUBSUB subcommand [argument [argument …]]: 检查订阅/发布系统状态。

演示:redis中的基本的订阅-发布的操作
在这里插入图片描述


http://www.ppmy.cn/news/1134486.html

相关文章

关于“兆易创新杯”中国研究生电子设计竞赛的一点个人小经验

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、一些基本常识二、赛前准备要充分三、选题很重要!!!四、队友很关键五、一些碎碎念总结 前言 请注意这是我参加“兆易创新…

websocket逆向

Websocket逆向技术的实际应用 前言一、websocket逆向实际应用1. 插件开发2. 弹幕互动游戏3. (半)无人直播 二、直播间常见通信技术1. http轮询2. websocket通信 三. 直播间常见消息解析技术四、 逆向直播间常用技术1. RPC远程服务调用2. 通信拦截3. API调用 五、学习路线实战1&…

C中无符号数与有符号数的运算

在C语言中,无符号数和有符号数是不同的数据类型,它们在内存中以不同的方式表示和处理。 对于有符号数,例如signed char、signed int、signed long等,使用最高位来表示正负号,剩余位表示数值。 例如,对于一…

Spring源码篇(十一)注册bean的方式

文章目录 前言bean注册的方式class扫描beanComponentScanImportDeferredImportSelectorImportBeanDefinitionRegistrar xml注册beanspring扩展点总结 前言 本篇主要以注册bean的方式从源码角度展开分析总结。 bean注册的方式 首先,由spring管理的对象&#xff0c…

使用 ClassFinal 对 java class 文件进行加密防止反编译

ClassFinal 是一款 java class文件安全加密工具,支持直接加密 jar 包或 war 包,无需修改任何项目代码,兼容 spring-framework;可避免源码泄漏或字节码被反编译 特点 无需修改原项目代码,只要把编译好的jar/war包用本工…

二叉搜索树 , Set 和 Map (JAVA)

二叉搜索树 二叉搜索树又称二叉排序树,它具有以下性质的二叉树或空树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的每颗子树也分别为二叉搜索树 二叉搜索树的…

腾讯云南京服务器性能如何?南京服务器测速IP地址

腾讯云服务器南京地域怎么样?南京地域很不错,正好处于中间的位置,南方北方用户均可以选择,网络延迟更低速度更快,并且目前南京地域有活动,南京地域可用区可选南京一区、南京二区和南京三区,腾讯…

【力扣】买卖股票(121,122,123)

121. 买卖股票的最佳时机 题意 只能买卖股票各一次求最大收益 解法 动态规划 要求最值,肯定要穷举。而穷举主要有两种方法:动态规划 和 回溯。 这道题显然可以使用动态规划的算法来解决,因为这里有一个很明显的子问题:前 i …