redis之事务

什么是事务

Redis 的事务和 MySQL 的事务概念上是类似的. 都是把一系列操作绑定成一组. 让这一组能够批量执 行. 但是注意体会 Redis 的事务和 MySQL 事务的区别:

但是注意体会 Redis 的事务和 MySQL 事务的区别:

• 弱化的原子性: redis 没有 "回滚机制" . **只能做到这些操作 "批量执行".**不能做到 "一个失败就恢复到 初始状态".也就是说redis的原子性不确保执行是否成功,没有回滚机制,不能回滚

• 不保证一致性: 不涉及 "约束". 也没有回滚. MySQL 的一致性体现的是运行事务前和运行后 , 结果都 是合理有效的, 不会出现中间非法状态.

• 不需要隔离性: 也没有隔离级别, 因为不会并发执行事务 (redis 单线程处理请求) .

• 不需要持久性: 是保存在内存的. 是否开启持久化, 是redis-server 自己的事情, 和事务无关.

Redis 事务本质上是在服务器上搞了一个 "事务队列". 每次客户端在事务中进行一个操作, 都会把命令先 发给服务器, 放到 "事务队列" 中(但是并不会立即执行) 而是会在真正收到 EXEC 命令之后, 才真正执行队列中的所有操作.

事务操作

MULTI 开启一个事务,执行成功返回ok

执行multi后,并没有真正执行,可以看到返回结果时queued,此时只是讲这多个请求保存在了服务器的事务队列中,此时另开一个窗口可以看见,是无法查询到key对应的值的。

EXEC 真正执行事务

当执行exec后,服务器才真正执行了事务队列里的请求,此时才能查询到对应的数据

DISCARD 放弃当前事务.

此时直接清空事务队列. 之前的操作都不会真正执行到

WATCH

watch监控某个key是否在事务执行之前发生了改变

在执行事务的时候,如果某个事务中修改的值被别的客户端修改了,此时就容易出现数据不一致的问 题.

在上述场景中,就可以使用watch来解决该问题

WATCH key → 先监视一个或多个键

MULTI → 开启事务块

SET key 111 → 在事务块中执行命令

EXEC → 执行事务(如果被监视的 key 未被修改,则事务成功执行)

如图,watch key后,另一客户端修改key之后,再执行exec会发现返回nil,随后get key得到的值为被修改后的值222

unwatch 取消监控

WATCH key1 key2

MULTI

... 一些命令 ...

DISCARD # 取消事务,但不会自动取消 WATCH

UNWATCH # 如果需要,手动取消监视

redis 的watch就相当于基于版本号这样的机制来实现的"乐观锁"

总结:

相关推荐
摇滚侠10 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
川石课堂软件测试11 小时前
学习软件测试需掌握的一些知识
数据库·python·sql·功能测试·网络协议·mysql·http
2501_9377671611 小时前
自建 SQL 数据库定时备份踩坑复盘与落地思路
数据库·sql
silvamux_13 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
夕除14 小时前
redis--模型
redis
I Am a robert girl14 小时前
从 GameHorizon 拆解多时间尺度游戏评测:数据管线、离线基准与在线回放的三层设计
数据库·游戏·多时间尺度·数据管线·游戏评测·离线基准·在线回放
躺柒15 小时前
读数据安全架构设计与实践17安全架构案例(下)
数据库·安全·零信任·安全架构·防火墙·无边界
SelectDB15 小时前
实时更新排错现场:导入了却查到旧数据,和 FINAL 越加越慢的两条路
大数据·数据库·数据分析
SelectDB15 小时前
拿 Planet 的账单一行行对下来,我总结出三个可自查的校验点
大数据·数据库·数据分析
SelectDB15 小时前
Apache Doris + Vane:让多模态数据进入业务分析
大数据·数据库·数据分析