Redis:四、事务

Redis系列文章目录

@


一、Redis事务是什么?

概念:

  • 可以一次执行多个命令,本质是一组命令的集合。一个事务中所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不允许阻塞。

如何使用?

在这里插入图片描述

  1. 事务相关命令:
    (1) DISCARD 取消事务,放弃执行事务块内地所有命令;
    (2) EXEC 执行所有事务块内的命令;
    (3) MULTI 标记一个事务块的开始;
    (4) UNWATCH 取消WATC命令对所有key的监视;
    (5) WATCH key [key ....] 监视一个或者多个key,如果在事务执行之前这个key被其它命令所改动,那么事务会被打断;

  2. 事务的正常执行:
    在这里插入图片描述

  3. 放弃事务:
    在这里插入图片描述

  4. 全体连坐:类似于Java中的异常处理,书写代码时就会报错,但是它不会处理 1/0=xx 这种错误,这种错误需要在编译时才能被发现。
    在这里插入图片描述

  5. 冤头债主:说明了Redis对事务是部分支持
    在这里插入图片描述

  6. watch监控

  • 表锁:将整张表锁住,其它行的任何操作都不行;

  • 行锁:仅仅锁住这一行。

  • 悲观锁:类似于表锁。数据的正确性是最高的。
    在这里插入图片描述

  • 乐观锁:类似于行锁。每条记录包括一个Version版本信息,每次有用户修改后Version加1。此时如果有A和B两个用户共同修改一条记录,但是A先提交后将Version+1;然后B再去提交时会报错,因为此时数据库中该条记录的Version已经为2了,就需要B重新从数据库中获取该条记录然后再次修改后提交。这样保证了数据的统一性。
    在这里插入图片描述
    在这里插入图片描述

  • watch的应用:
    在这里插入图片描述

  • watch:watch命令是一个乐观锁,它可以在EXEC命令执行前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改过了,如果是的话服务器会拒绝执行事务。

  • unwatch命令:放弃对所有key的监控。

  • 一旦执行了exec,之前加的所有的监控锁都会被取消掉了。

  • Watch 命令可以被调用多次,一个Watch 命令可以监控多个key。Watch 命令调用即启动监控功能,从Watch 命令开始点到执行EXEC命令终止。一旦EXEC被调用,所有的键都将不被监视,无论所讨论的事务是否被中止。关闭客户端连接也会触发所有的键被取消监视。

  • Redis Watch 命令给事务提供check-and-set (CAS) 机制。被Watch的Key被持续监控,如果key在Exec命令执行前有改变,那么整个事务被取消,Exec返回null表示事务没有成功。
    实例:

num = GET sampleKey
num = num + 1
SET sampleKey $num

上面的命令在单用户环境下没有问题。如果多个用户都尝试同时增加值就会出现竞争条件,此时结果为14而不是15.

WATCH sampleKey
num = GET sampleKey
num = num + 1
MULTI
SET sampleKey $num
EXEC

使用了WATCH 关键字能够有效保障竞争条件,一个用户修改后另外一个用户就不能操作了。


事务总结:
在这里插入图片描述
在这里插入图片描述

二、Redis消息发布订阅?

进程间的一种通信模式,发送者(pub) 发送消息,订阅者(sub) 接收消息。一般使用 rabbitmq来作为消息发布订阅。

//可以一次订阅多个
SUBSCRIBE c1 c2 c3;

//消息发布
PUBLISH c2  hello-redis

//订阅多个
PSUBSCRIBE new*

参考:
violate特性详解: https://www.cnblogs.com/monkeysayhi/p/7654460.html
https://blog.csdn.net/jiyiqinlovexx/article/details/50989328

posted @ 2023-02-24 21:21  Stitches  阅读(61)  评论(0)    收藏  举报