千家信息网

Redis事务的应用

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,redis对事务的支持目前还比较简单。redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。 由于redis是单线程来处理所有client的请求的所
千家信息网最后更新 2025年02月02日Redis事务的应用

redis对事务的支持目前还比较简单。redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。 由于redis是单线程来处理所有client的请求的所以做到这点是很容易的。一般情况下redis在接受到一个client发来的命令后会立即处理并 返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一 个队列中。当从此连接受到exec命令后,redis会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给client.然后此连接就 结束事务上下文。

Redismysql事物


Mysql

Redis

开启

start transaction

muitl

语句

普通sql

普通命令

失败

rollback 回滚

discard 取消

成功

commit

exec


一、正常情况下,一个事物开启,语法检查没问题,并不是马上直接提交,而是放在一个队列里QUEUED

简单验证正常情况一个事物的过程:一个简单的银行转账,wang 200元,zhao 700元,wang100zhao的实现过程

127.0.0.1:6379> set wang 200

OK

127.0.0.1:6379> set zhao 700

OK

127.0.0.1:6379> multi

OK

127.0.0.1:6379> decrby zhao 100 #decrby减去100

QUEUED

127.0.0.1:6379> incrby wang 100 #增加一百

QUEUED

127.0.0.1:6379> exec #因为是开启事务,所以要"commit"才可以

1) (integer) 600

2) (integer) 300

127.0.0.1:6379> mget wang zhao

1) "300"

2) "600" ##这里可以看到和设置的初始值不一样了~~



二、当开启一个事务的时候,若有一个事务语法检查无法通过导致异常,开启的整个事务都会失败,直接被discard

127.0.0.1:6379> multi #开启事务

OK

127.0.0.1:6379> decrby zhao 100 #减去了100,并且提示在队列里

QUEUED

127.0.0.1:6379> df #输入一个错误

(error) ERR unknown command 'df'

127.0.0.1:6379> exec

(error) EXECABORT Transaction discarded because of previouserrors.

127.0.0.1:6379> mget zhao wang

1) "600"

2) "300" ##发现原来减去100没生效


三、Redis的简单事务,语法本身没错,但适用对象有问题,比如 zadd 操作list对象

Exec之后, 当事务在队列里,会执行正确的语句,并跳过有不适当的语句.


127.0.0.1:6379> mget zhao wang

1) "500"

2) "300"

127.0.0.1:6379> multi

OK

127.0.0.1:6379> decrby zhao 100

QUEUED

127.0.0.1:6379> sadd wang df

QUEUED

127.0.0.1:6379> exec

1) (integer) 400

2)(error) WRONGTYPE Operation against a key holding the wrong kind of value

127.0.0.1:6379> mget zhao wang

1) "400"

2) "300"


四、Redis的事务中,启用的是乐观锁,只负责监测key没有被改动,若KEY 被改动了事物取消,以买票为例:若没对key监控就会导致钱没了,票没买着钱被扣了,不加watch 自己验证……

实现过程:

窗口1

127.0.0.1:6379> mget zhao wang ticket

1) "600"

2) "600"

3) "1"

127.0.0.1:6379> watch ticket #监测ticket

OK

127.0.0.1:6379> multi #开启事务

OK

127.0.0.1:6379> decrby zhao 200 #减去200

QUEUED

127.0.0.1:6379> decr ticket #获取TICKET

QUEUED


窗口2

127.0.0.1:6379> decr ticket #直接购买票了,动作比窗口1快


窗口1

127.0.0.1:6379> exec

(nil)

127.0.0.1:6379> mget zhao wang ticket

1) "600"

2) "600"

3) "0"

Watch可以监控多个key,若多个key有一个发生变化,,则事务都取消

取消监听unwatch


事务 命令 队列 事物 情况 语句 语法 过程 处理 普通 上下 上下文 多个 对象 结果 而是 问题 检查 监控 监测 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 计算机网络技术与应用考研 邮件接收服务器安全吗 网络安全 财政 创建数据库和数据表实验 软件开发的技术手段是什么 持续推进网络安全工作 服务器虚拟化应用技术规范 记箅机网络技术就业方向 小翼管家服务器连接失败咋办 信息管理和网络安全调研报告 代理 翻墙 服务器 汽车制造技术管理风险数据库 湖南服务器机柜厂家供应虚拟主机 众成科技共享是什么互联网公司 查找数据库归档日志的目录 精灵宝可梦服务器手机版下载教程 软件开发小公司的组织结构 长春数据库租用 数据库2017标准版 网络安全保密工作会议 首批bim数据库征集 拍题得答案的软件开发 绿幕抠图软件开发 免费代理服务器大全 安徽百维网络技术有限公司 网络安全标语主题 联想st558服务器阵列设置 香肠派对官方正式服务器 淘宝助理如何设置代理服务器 小米数据库技术流视频
0