Redis事务

Redis事务的概念

Redis事务的本质是一系列命令的集合。事务支持一次执行多个命令,一个事务中所有的命令都会被序列化。在事务的执行过程中,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
总结来说:Redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。

与Mysql事务的区别

1)Redis事务没有隔离级别的概念:

批量指令在发送EXEC命令之前被依次放入队列中,并不会被实际执行,也就不存在事务内的查询要看到事务里的更新,事务外查询不能看到。

2)Redis事务不保证原子性:

Redis中,单条命令是原子性执行的,但是事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。

Redis事务的三个阶段

1)开始事务
2)命令入队
3)执行事务

Redis事务命令

  • 1、DISCARD 取消事务,放弃执行事务块内的所有命令
  • 2、MULTI 标记一个事务块的开始
  • 3、EXEC 执行所有事务块内的命令
  • 4、WATCH key [key ...] 监视一个或多个key,如果在事务执行之前这个/些key被其他命令所改动,那么事务将被打断
  • 5、UNWATCH 取消WATCH命令对所有key的监视

Redis事务验证

1)不保证原子性

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set key1 1
QUEUED
127.0.0.1:6379> set key2 2
QUEUED
127.0.0.1:6379> SADD key2 3
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
3) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get key1
"1"

2) 监视key

Redis事务原子性.png

如图所示,在当前事务执行开始之前对key1进行监视,如果在此事务执行EXEC之前在另一个客户端对key1进行修改,则当前事务会执行失败,执行结果为nil。

总结

1)Redis事务提供了一种将多个命令打包,然后一次性、有序性执行的机制。
2)在事务中,多个命令会被入队到事务队列中,然后按FIFO的顺序执行。
3)事务在执行过程中不会被中断,当事务队列中的所有命令执行完毕后,事务才会结束。
4)带有WATCH命令的事务会将客户端和被监视的键在数据库中的watch_keys字典关联,当键被修改时,程序会将所有监视被修改键的客户端的REDIS_DIRTY_CAS标识打开,服务只有在REDIS_DIRTY_CAS标识没有打开时,才会执行客户端提交的事务,否做拒绝执行事务。
5)Redis中的事务不支持回滚机制。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容