redis的事物

作者: 程序员小饭 | 来源:发表于2019-07-22 16:58 被阅读0次

涉及到的相关命令

  • 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)最小的元素:

WATCH zset

element = ZRANGE zset 0 0

MULTI

ZREM zset element

EXEC

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

相关文章

  • Redis基础(2)——事物

    Redis事物 redis中的事物(transaction)是一组命令的集合。事物同命令都是redis的最小执行单...

  • redis的事物

    涉及到的相关命令 multi exec discard watch unwatch 1:multi,exec 对于...

  • redis事物-lua & 超卖 --- 2022-08-07

    redis组队的时候出现错误,会导致redis事物执行不成功;redis事物组队完毕,按照顺序依次执行,执行的时候...

  • Redis-事物

    Redis 通过 MULTI 、 DISCARD 、 EXEC 和 WATCH 四个命令来实现事务功能, 本章首先...

  • 八、redis的事务及锁应用

    redis事物及锁应用 过程:把命令输入后,就把命令放在队列里打完exec,再集中执行 redis事物的执行 re...

  • Redis学习笔记(二)

    一、redis事物及锁应用 MULTI、EXEC、DISCARD和WATCH命令是Redis事务功能的基础。Red...

  • Redis之慢查询分析

    Redis除了提供5种数据结构之外,还为我们提供了诸如慢查询分析,Redis Shell, Pipeline,事物...

  • Redis 发布订阅与事物

    一、Redis的发布和订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订...

  • Redis事物与持久化

    Redis事物 介绍 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:事务是一个单独的隔离操作...

  • redis 分布式事物

    实现代码 问题:1、客户端分片和中间件(我们目前使用的codis)分片均不支持transaction。因为tran...

网友评论

    本文标题:redis的事物

    本文链接:https://www.haomeiwen.com/subject/rbmwlctx.html