当前位置: 首页 > news >正文

Redis事务控制

1.Redis事务控制的相关命令

命令名作用
MULTI表示开始收集命令,后面所有命令都不是马上执行,而是加入到一个队列中。
EXEC执行MULTI后面命令队列中的所有命令。
DISCARD放弃执行队列中的命令。
WATCH“观察“、”监控“一个KEY,在当前队列外的其他命令操作这个KEY时,放弃执行自己队列的命令
UNWATCH放弃监控一个KEY

2.命令队列执行失败的两种情况

①加入队列时失败

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> incr age www
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.

遇到了入队时即可检测到的错误,整个队列都不会执行。

②执行队列时失败

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 30
QUEUED
127.0.0.1:6379> incrby age 5
QUEUED
127.0.0.1:6379> incrby age 5
QUEUED
127.0.0.1:6379> incrby age ww
QUEUED
127.0.0.1:6379> incrby age 5
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (integer) 35
3) (integer) 40
4) (error) ERR value is not an integer or out of range
5) (integer) 45
127.0.0.1:6379> get age
"45"

错误在入队时检测不出来,整个队列执行时有错的命令执行失败,但是其他命令并没有回滚。

③Redis为什么不支持回滚

官方解释如下:

如果你有使用关系式数据库的经验, 那么 “Redis 在事务失败时不进行回滚,而是继续执行余下的命令”这种做法可能会让你觉得有点奇怪。以下是这种做法的优点:
1.Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。
2.因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。
有种观点认为 Redis 处理事务的做法会产生 bug , 然而需要注意的是, 在通常情况下, 回滚并不能解决编程错误带来的问题。 举个例子, 如果你本来想通过 INCR 命令将键的值加上 1 , 却不小心加上了 2 , 又或者对错误类型的键执行了 INCR , 回滚是没有办法处理这些情况的。

3.悲观锁和乐观锁

在使用WATCH命令监控一个KEY后,当前队列中的命令会由于外部命令的执行而放弃,这是乐观锁的体现。

- 悲观锁

认为当前环境非常容易发生碰撞,所以执行操作前需要把数据锁定,操作完成后释放锁,其他操作才可以继续操作。

- 乐观锁

认为当前环境不容易发生碰撞,所以执行操作前不锁定数据,万一碰撞真的发生了,那么检查版本号:
  - 如果是基于最新的版本所做的修改:服务器接受,修改成功
  - 如果是基于旧的版本号所做的修改:服务器不接受,修改失败,整个MULTI队列中的操作都被丢弃

http://www.lryc.cn/news/14107.html

相关文章:

  • Springcloud OpenFeign 详解
  • 软件测试期末
  • 关于Java的深拷贝和浅拷贝
  • 固定值电阻的检测方法总结
  • 打印机相关
  • 入门力扣自学笔记235 C++ (题目编号:2347)
  • k8s-二进制部署
  • 前缀和差分(C/C++)
  • 回文子串的数量[寻找回文子串的完整思路过程]
  • CCNP350-401学习笔记(301-350题)
  • 【LeetCode】No.225. 用队列实现栈 -- Java Version
  • 45个写规范代码的小技巧
  • MindFusion Diagramming for Java, 最新版 Crack
  • 中间件安全—Apache常见漏洞
  • Spring IOC 容器 Bean 加载过程
  • 【DRF】Django Rest Framework(5.DRF中的通用视图类-GenericAPIView方法说明与使用说明)
  • STM32 OTA应用开发——自制BootLoader
  • 时域和频域的简单理解
  • 华为OD机试 - 第 K 个最小码值的字母 | 机试题算法思路 【2023】
  • 离散数学笔记_第一章:逻辑和证明(1)
  • Rust FFI 与C语言互相调用
  • 从全局变量寻找到Tomcat回显方式
  • Tapdata Connector 实用指南:数据入仓场景之数据实时同步到 BigQuery
  • 关于机器人状态估计(12)-VIO/VSLAM的稀疏与稠密
  • Python每日一练(20230220)
  • 技术总监的“技术提升”
  • kettle安装部署_简单认识_Spoon勺子界面---大数据之kettle工作笔记002
  • 第三章 Kafka生产问题总结及性能优化实践
  • Comparable和Comparator的区别
  • 全15万字丨PyTorch 深度学习实践、基础知识体系全集;忘记时,请时常回顾。