一文搞懂redis事务

来自文章集合:一文带你搞懂redis使用过程(持续更新中)

Redis事务

Redis事务可以一次执行多个命令,是一个原子操作:要么全部被执行,要么全部都不执行。

Redis事务通过MULTI命令开始事务,通过EXEC命令提交事务。在MULTI和EXEC之间的命令将按顺序放入队列中,而不会立即执行。这种特性使得Redis事务可以确保多个命令的原子性操作,避免了其他客户端在执行这些命令期间的干扰。

需要注意Redis的事务并不具备像传统关系型数据库中那样的回滚功能,因此在执行失败时无法进行回滚。这意味着,即使事务中的某些命令失败,其他命令仍将继续执行。

redis的事务使用

下面是一个简单使用事务的例子:

json 复制代码
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set redis_text "hello world"
QUEUED
127.0.0.1:6379> get redis_text
QUEUED
127.0.0.1:6379> set redis_text "HELLO WORLD"
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) "hello world"
3) OK

使用中途,想取消事务,放弃事务块内的所有命令:DISCARD

json 复制代码
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> get redis_text
QUEUED
127.0.0.1:6379> set redis_text "Hello"
QUEUED
127.0.0.1:6379> discard
OK

为了避免有一个键被其他客户端修改,可以使用WATCH命令监视的指定键,那么在执行EXEC命令之前,如果监视的键被修改,整个事务都将被取消。下面的例子用来展示,执行事务期间监听key发生了变化的情况

json 复制代码
// redis客户端1,监视键 mykey,如果该键的值在事务期间发生变化,事务将被取消
127.0.0.1:6379> WATCH mykey
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET mykey "new value"
QUEUED
127.0.0.1:6379> EXEC
(nil)

//	redis客户端2,在redis客户端1执行事务期间执行
127.0.0.1:6379> set mykey "new value"
OK

取消所有监听可以使用:UNWATCH

redis事务使用场景

根据redis事务的原子性操作方式,常被用于保持一致性的批量操作的场景:

  1. 转账:多个账户之间进行资金转移时,通过Redis事务可以确保在资金转移的过程中不会出现中断,避免因为某些命令执行失败而造成资金损失。
  2. 缓存更新:当需要同时更新多个缓存时,通过Redis事务可以确保所有缓存都得到正确更新,避免因为某些缓存更新失败而导致数据不一致。

引申

redis事务的特点

  1. 原子性支持有限:redis的事务是原子性的,要么全部执行,要么全部不执行,没有中间状态。然而,redis并不提供回滚机制,即使其中一个命令执行失败,其他命令仍然会执行。

  2. 快速执行:因为redis是内存数据库,所以redis事务通常比传统的关系型数据库事务执行的要快,而关系型数据库则通常需要涉及磁盘访问。

  3. 命令预处理:redis事务将一系列命令进行 排队,只有在EXEC命令被调用时才会一次性执行这些命令。

关系型数据库的特点:

  1. 支持ACID属性: 关系型数据库事务支持ACID(原子性、一致性、隔离性和持久性)属性,这确保了数据的完整性和一致性。
  2. 数据持久性: 关系型数据库通常将数据持久化到磁盘上,确保数据不会因系统故障而丢失。
  3. 回滚支持: 关系型数据库具有回滚机制,可以回滚未完成的事务,确保在出现错误时数据库的一致性和稳定性。

redis事务和关系型数据库的优缺点比较

  1. redis事务对于简单的操作十分高效,适合执行一系列快速的命令。然而,他不具备关系型数据库的完整性保证
  2. 关系型数据库事务在保证数据的一致性和完整性方面更加强大,但其执行速度可能较慢,尤其是涉及大量IO操作的情况。

在实际应用中,根据具体需求和场景来选择使用Redis事务或关系型数据库事务。

相关推荐
她的男孩3 分钟前
页面已发布用户仍进不去:Forge Admin 门户入口与系统菜单挂载解耦
java·spring boot·低代码
不像程序员的程序媛7 分钟前
mybatisplus insert dto未指定id时会如何
java·开发语言
程序员梅雨24 分钟前
Hive面试总结
hive·hadoop·面试
我命由我1234526 分钟前
5-2.Python 编码进阶 - 字符串进阶(拼接、普通格式化、普通格式化数字精度控制、快速格式化、遍历、常用方法)
java·开发语言·后端·python·学习·java-ee·学习方法
专业程序开发源26 分钟前
django视听资源推荐系统16690-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计
多客:duokelijie30 分钟前
婚恋交友小程序合规梳理:上线运营需要准备哪些资质与许可手续?
后端·mysql·微信小程序·前端框架·uni-app·php·持续部署
yunwei3734 分钟前
eBPF 实例教程:使用内核跟踪点监控 GPU 驱动活动
linux·后端·性能优化
高频因子挖掘机40 分钟前
别再手动维护股票名称映射表:用 Python 查询交易所元数据
后端·github·api
我的xiaodoujiao41 分钟前
Django 权限系统项目实战详细图文教程 2--环境搭建
后端·python·django
高频因子挖掘机2 小时前
QuantDash 明明安装成功,为什么 Python 还是无法 import?
后端·github·api