redis-transaction

redis-transaction

注意

  1. 不支持回滚操作是因为redis是先执行指令然后做日志,所以即使发生异常,没有可以用来执行回滚操作的日志。
  2. 只保证事物的隔离性, 不保证原子性.
  3. redis 禁止在 multiexec 之间执行 watch 指令,而必须在 multi 之前做好盯住关键变量,否则会出错。

事物的过程

multi:

事物的开始(创建一个事物);

exec:

事物的执行;

discard:

丢弃这个事物;

127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr books
QUEUED
127.0.0.1:6379> incr books
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 2
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr books
QUEUED
127.0.0.1:6379> incr books
QUEUED
127.0.0.1:6379> incr books
QUEUED
127.0.0.1:6379> exec
1) (integer) 3
2) (integer) 4
3) (integer) 5

原理

redis 单线程且本身保证有序,且能保证不被其他指令打扰.--仅仅是保证了隔离性
redis multi和exec命令不能保证原子性,中间执行的多个命令有一个失败了,不会影响其他命令的执行.
redis multi和exec仅仅保证一堆命令不被插队,顺序执行.原理是在server端开启了一个事物队列.

优化

建议使用pipeline 提升性能.

pipe = redis.pipeline(transaction=true)
pipe.multi()
pipe.incr("books")
pipe.incr("books")
values = pipe.execute()

避免并发问题

悲观锁: 分布式锁
乐观锁: watch机制

watch机制

> watch books
OK
> incr books  # 被修改了
(integer) 1
> multi
OK
> incr books
QUEUED
> exec  # 事务执行失败
(nil)

watch 会实时检查观察的key是否被改变,如果改变了exec提交会执行失败,返回null.

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

相关阅读更多精彩内容

  • 超强、超详细Redis入门教程 转载2017年03月04日 16:20:02 16916 转载自: http://...
    邵云涛阅读 17,567评论 3 313
  • 【本教程目录】 1.redis是什么2.redis的作者3.谁在使用redis4.学会安装redis5.学会启动r...
    徐猿猿阅读 5,828评论 0 35
  • 五种数据结构简介 Redis是使用C编写的,内部实现了一个struct结构体redisObject对象,通过结构体...
    彦帧阅读 11,882评论 0 14
  • 基于内存的NoSQL数据库。提供五种数据结构的存储。字符串、列表、集合、有序集合、散列表。Redis 支持很多特性...
    韩绝交阅读 4,057评论 0 1
  • 文章已经放到github上 ,如果对您有帮助 请给个star[https://github.com/qqxuanl...
    尼尔君阅读 6,711评论 0 22

友情链接更多精彩内容