前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis 事务

Redis 事务

作者头像
一个架构师
发布2022-06-20 19:51:13
2950
发布2022-06-20 19:51:13
举报
文章被收录于专栏:从码农的全世界路过

在关系型数据库中的事务一定要满足原子性,一致性,隔离性和持久性4个特性;

但Redis中的事务却与pipeline批量命令操作更像.

先看一下事务相关命令:

1. multi:开启事务,并将命令存入命令队列中

exec:事务执行

代码语言:javascript
复制
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set key1 value1
QUEUED
127.0.0.1:6379> set key2 value2
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
127.0.0.1:6379> get key1 
"value1"
127.0.0.1:6379> get key2
"value2"
127.0.0.1:6379>

2. discard:事务取消

代码语言:javascript
复制
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set key3 value3
QUEUED
127.0.0.1:6379> set kye4 value4
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get key3
(nil)
127.0.0.1:6379> get key4
(nil)
127.0.0.1:6379>

3. 出错时事务不回滚:操作命令正确,参数不正确

此时事务并不满足原子性

代码语言:javascript
复制
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr key1
QUEUED
127.0.0.1:6379> set key5 value5
QUEUED
127.0.0.1:6379> exec
1) (error) ERR value is not an integer or out of range
2) OK
127.0.0.1:6379> get key5
"value5"
127.0.0.1:6379>

4. 出错时事务回滚:操作命令错误

代码语言:javascript
复制
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set key6 valu6
QUEUED
127.0.0.1:6379> aaa aa
(error) ERR unknown command `aaa`, with args beginning with: `aa`, 
127.0.0.1:6379> set key7 value7
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get key6
(nil)
127.0.0.1:6379> get key7
(nil)
127.0.0.1:6379>

5. watch:监控指定key(可多个)值变化

watch是乐观锁(CAS)机制,根据key值是否变化,决定事务是否提交,间接解决事务原子性问题.

在第一个客户端,监控key1值变化,并开启事务

代码语言:javascript
复制
127.0.0.1:6379> watch key1 
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set key8 value8
QUEUED

打开第二个客户端,修改key1值

代码语言:javascript
复制
127.0.0.1:6379> set key1 v1
OK
127.0.0.1:6379> get key1
"v1"
127.0.0.1:6379>

在第一个客户端继续执行exec命令,整体事务因为key1值的变化不能正常执行;

保证了事务的原子性.

代码语言:javascript
复制
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get key1
"v1"
127.0.0.1:6379> get key8
(nil)
127.0.0.1:6379>

事务处理流程如下:

6.unwatch:取消监视所有key

代码语言:javascript
复制
127.0.0.1:6379> watch key1
OK
127.0.0.1:6379> unwatch 
OK
127.0.0.1:6379>

综上可见:

redis的事务本身并不是原子性,在使用时需要配合watch命令;

在命令出错情况下,事务是会回滚的;在命令参数出错时,事务是不会回滚的,会继续执行后续命令;

因为lua脚本的原子性,redis事务也可以使用lua脚本代替.

pipeline类似,都是命令的批量操作,但pipeline关注的是减少RTT时间,而事务关注的是一致性,从性能上来说pipeline性能更高些;

在集群环境中执行时,数据不一定都在一台服务器中,很容易造成分布式事务不一致.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从码农的全世界路过 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档