ToB企服应用市场:ToB评测及商务社交产业平台

标题: 第83篇 Redis中的事件区别 [打印本页]

作者: 农妇山泉一亩田    时间: 2024-12-10 03:02
标题: 第83篇 Redis中的事件区别
1.与关系型数据库事件的区别

Redis事件是指将多条命令加入队列,一次批量执行多条命令,每条命令会按顺序执行,事件执行过程中不会被其他客户端发来的命令所打断。也就是说,Redis事件就是一次性、顺序性、排他性的执行一个队列中的一系列命令。
Redis事件和关系型数据库的事件不太一样,它不包管原子性,也没有隔离级别的概念。
  1. 事务不保证原子性,但是Redis命令本身是原子性的
复制代码
1. Redis事件没有隔离级别的概念
批量操纵在发送 EXEC 命令前被放入队列缓存,并不会被实际执行,也就不存在事件里的查询要看到本事务的更新或别的事件的修改更新操纵的题目。(Mysql里的事件的语句不是放入队列,而是直接执行)
2. Redis不包管原子性
Redis中,单条命令是原子性执行的,但事件不包管原子性,且没有回滚。事件中任意命令执行失败,别的的命令仍会被执行。
2.Redis事件的运行流程

2.1 Redis事件相关命令

2.2 没有隔离级别

当事件开启时,事件期间的命令并没有执行,而是加入队列,只有执行EXEC命令时,事件中的命令才会按照顺序执行,也就是说事件间就不会存在数据脏读、不可重复读、幻读的题目,因此就没有隔离级别。

2.3 事件不包管原子性

如上图所示,在通过EXEC执行事件时,其中命令执行失败不会影响到其他命令的执行,因此并没有包管同时乐成和同时失败的原子操纵,尽管这样,Redis事件中也没有提供回滚的支持

官方来由为:包管Redis的性能
多数事件失败是由语法错误大概数据布局类型错误导致的,语法错误说明在命令入队前就举行检测的,而类型错误是在执行时检测的,Redis为提升性能而采用这种简单的事件,这是差别于关系型数据库的,特别要留意区分。Redis之以是保持这样简易的事件,完全是为了包管高并发下的核心题目——性能。
2.4 语法错误(编译器错误)

在开启事件后,A的转出操纵命令打成了DECRBYa,最终会导致事件提交失败,所有命令都不会执行,A、B保存原值。
  1. 127.0.0.1:6379> multi
  2. OK
  3. 127.0.0.1:6379(TX)> DECRBYa A 500
  4. (error) ERR unknown command 'DECRBYa', with args beginning with: 'A' '500'
  5. 127.0.0.1:6379(TX)> INCRBY B 500
  6. QUEUED
  7. 127.0.0.1:6379(TX)> EXEC
  8. (error) EXECABORT Transaction discarded because of previous errors.
  9. 127.0.0.1:6379> mget A B
  10. 1) "1000"
  11. 2) "100"
  12. 127.0.0.1:6379>
复制代码
2.5 类型错误(运行时错误)

在运行时检测类型错误,此时势务并没有回滚,而是跳过错误命令继续执行, 结果B值改变、A保存原值。

小结
3.利用WATCH实现乐观锁

WATCH通过监视指定Redis Key,如果没有改变,就执行乐成,如果发现对应值发生改变,事件就会执行失败,如下图:

三种方式可以取消监视:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4