前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >redis的事物

redis的事物

作者头像
程序员小饭
发布2020-09-07 15:21:00
8470
发布2020-09-07 15:21:00
举报
文章被收录于专栏:golang+php

涉及到的相关命令

  • multi
  • exec
  • discard
  • watch
  • unwatch

1:multi,exec

对于一般的关系型数据库的事物来说,事物的执行过程无非为 生成事物 产生命令 执行事物。对于redis来说,multi就是生成事物,exec就是执行事物,discard就是取消事物

基本执行过程如下图

redis的事物过程

可以看到,在我们执行set的时候命令并没有执行,而是写入到了一个控制事物的队列中,返回的信息是QUEUED,在最后exec的时候命令才是真正的执行,并且返回执行结果

2:一般事物都有rollback操作,但是redis的事物是不支持rollback操作的,比较遗憾,但是事情都有两面性,正是因为redis不支持rollback操作,所以redis内部才能保持简单而且快速

redis不支持rollback演示

在图中mset命令语法是没有问题的,成功的入到了事物中,执行之后返回结果中第一步成功执行,但是在mset的时候返回错误。

所以类似于这种错误,是需要我们在编程的过程中就避免的,而不应该到生产环境中的。

Redis事物只能检查出语法错误,如果发现语法错误,整个事物直接结束

redis的事物的语法错误

Discard其实就是在multi之后 清楚事物队列,没什么好说的

3:WATCH

WATCH key [key ...]

监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

现实中会存在这样一个问题,比如我们要完成一个incr的操作(不考虑用incr的方法),

val = GET mykey,val = val + 1,SET mykey $val

上面的这个实现在只有一个客户端的时候可以执行得很好。 但是, 当多个客户端同时对同一个键进行这样的操作时, 就会产生竞争条件。举个例子, 如果客户端 A 和 B 都读取了键原来的值, 比如10 , 那么两个客户端都会将键的值设为 11 , 但正确的结果应该是 12 才对。

有了 WATCH , 我们就可以轻松地解决这类问题了:

WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。

WATCH 的键会被监视,并会发觉这些键是否被改动过了(在下图中第2步就是改动)。 如果有至少一个被监视的键在 EXEC 执行之前被修改了, 那么整个事务都会被取消, EXEC 返回nil-reply来表示事务已经失败。

redis的事物 watch演示

用户还可以用watch锁定多个键

Watch key1 key2 key3

使用 WATCH 实现 ZPOP

WATCH 可以用于创建 Redis 没有内置的原子操作。举个例子, 以下代码实现了原创的 ZPOP 命令, 它可以原子地弹出有序集合中分值(score)最小的元素:

代码语言:javascript
复制
WATCH zset

element = ZRANGE zset 0 0

MULTI

ZREM zset element

EXEC

程序只要重复执行这段代码, 直到 EXEC 的返回值不是nil-reply回复即可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1:multi,exec
  • 2:一般事物都有rollback操作,但是redis的事物是不支持rollback操作的,比较遗憾,但是事情都有两面性,正是因为redis不支持rollback操作,所以redis内部才能保持简单而且快速
  • 3:WATCH
相关产品与服务
云数据库 Redis®
腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档