我命由我,不由天!


  • 搜索
prometheus docker golang linux kubernetes

redis-事务(十四)

发表于 2021-06-02 | 0 | 阅读次数 336

事务

基本用法

Redis事务在形式上,指令分别是multi、exec、discard。multi指示事务的开始,exec指示事务的执行,discard指示事务的丢弃

multi
incr books
exec

所有的指令在exec之前不执行,而是缓存在服务器的一个事务队列中,服务器一旦收到exec指令,才开始执行整个事务队列,执行完毕后一次性返回所有指令的运行结果。因为Redis的单线程特性,它不用担心自己在执行队列的时候被其他指令打搅

原子性

事务执行到中间时遇到失败,后面的指令还会继续执行。Redis的事务根本不具备原子性,而仅仅满足了事务的隔离性中的串行化,当前执行的事务不被其他事务打断的权利

discard(丢弃)

multi
incr books
discard

在discard之后,队列中的所有指令多没有执行,就好像multi和discard中间的所有指令从未发生过一样

优化

Redis事务在发送每个指令到事务缓冲队列时都要经过一次网络读写,当一个事务内部的指令较多时,需要的网络IO时间也会线性增长,所以Redis的客户端再执行事务时都会结合pipeline一起使用

watch

watch会在事务开始之前盯住一个或多个关键变量,当事务执行时,也就是服务收到exec指令要顺序执行缓存的事务队列时,Redis会检查关键变量自watch之后是否被修改。如果关键变量被人改动了,exec指令就会返回NULL回复告知客户端事务执行失败,这个时候客户端一般会选择重试

watch books
incr books
multi
incr books
exec
  • 本文作者: Dante
  • 本文链接: https://gaodongfei.com/archives/redis-事务
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
redis-管道(十三)
registry删除镜像
  • 文章目录
  • 站点概览
Dante

Dante

119 日志
5 分类
5 标签
RSS
Creative Commons
0%
© 2023 Dante
由 Halo 强力驱动
|
主题 - NexT.Pisces v5.1.4
沪ICP备2020033702号