Redis笔记3-redis事务

Redis的事务机制允许同时执行多条指令,它是原子性操作,事务中的命令要么全部执行,要么全部不执行,另外,事务中的所有指令都会被序列化,而且其开始执行过程中,不回被即时过来的指令所打断,其需要经历三个过程,分别为开始事务、命令入队以及执行事务。

一、相关命令

1、MULTI

该命令用来开启事务,它总是返回ok结果,当其执行之后,客户端可以继续发送任意条数量的指令,这些指令不会立即被执行,而是被放到了队列中,直到EXEC被调用之后,所有命令才会被序列化执行。

2、EXEC

该命令负责触发并执行队列中所有的命令。

NOTE:

如果MULTI开启之后,因为某些原因没有成功执行EXEC,那么事务中所有的命令都不会被执行的。

3、DISCARD

该命令用来刷新事务中所有排队等待执行的指令,它总是返回ok结果,并且将服务连接状态恢复到正常。如果已经使用WATCH,那么其会将释放所有被WATCH的key。

4、WATCH

标记所有指定的key被监控起来,使其在事务中有条件的执行(乐观锁)。

NOTE:

A、WATCH使得EXEC命令需要有条件的执行,也就是事务只能在所有被监视的键没有被修改的前提下才能执行。另外,在EXEC被执行之后,所有的WATCH都会被取消。

B、UNWATCH手动取消对所有键的WATCH,如果执行了EXEC或者DISCARD,则不需要手动执行UNWATCH命令

redis事务有两种情况:

  1.事务开启期间,发生语法错误,所有事务都会滚。如下图:

第二种,对某个键执行不符合其数据类型的操作:实际上,这就意味着只有程序错误才会导致Redis命令执行失败,这种错误很有可能在程序开发期间发现,一般很少在生产环境发现。

在事务运行期间,虽然Redis命令可能会执行失败,但是Redis仍然会执行事务中余下的其他命令,而不会执行回滚操作,

如下图:

WATCH命令详解:Watch命令一个重要的应用就是施加乐观锁

那么WATCH命令实际做了些什么呢?这个命令会使得EXEC命令在满足某些条件时才会运行事务:我们要求Redis只有在所有受监控的键都没有被修改时,才会执行事务。(但是,相同的客户端可能会在事务内部修改这些键,此时这个事务不会中止运行。)否则,Redis根本就不会进入事务。(注意,如果你使用WATCH命令监控一个易失性的键,然后在你监控这个键之后,Redis再使这个键过期,那么EXEC命令仍然可以正常工作。)

WATCH命令可以被调用多次。简单说来,所有的WATCH命令都会在被调用之时立刻对相应的键进行监控,直到EXEC命令被调用之时为止。你可以在单条的WATCH命令之中,使用任意数量的键作为命令参数。

当调用EXEC命令时,所有的键都会变为未受监控的状态,Redis不会管事务是否被中止。当一个客户单连接被关闭时,所有的键也都会变为未受监控的状态。

你还可以使用UNWATCH命令(不需要任何参数),这样便能清除所有的受监控键。当我们对某些键施加乐观锁之后,这个命令有时会非常有用。因为,我们可能需要运行一个用来修改这些键的事务,但是在读取这些键的当前内容之后,我们可能不打算继续进行操作,此时便可以使用UNWATCH命令,清除所有受监控的键。在运行UNWATCH命令之后,Redis连接便可以再次自由地用于运行新事务。

如何使用WATCH命令实现ZPOP操作呢?

本文将通过一个示例,说明如何使用WATCH命令创建一个新的原子化操作(Redis并不原生支持这个原子化操作),此处会以实现ZPOP操作为例。这个命令会以一种原子化的方式,从一个有序集合中弹出分数最低的元素。以下源码是最简单的实现方式:

原文地址:https://www.cnblogs.com/huangjuncong/p/8488209.html

时间: 2024-10-13 06:12:18

Redis笔记3-redis事务的相关文章

redis笔记

redis笔记 下载完redis,执行make命令. 然后启动redis就进src文件夹,执行./redis-server就可以了. 再在文件夹下执行 ./redis-cli 就可以执行redis的命令了. pipelining  一次请求发送多个命令,以提高性能.我们在使用redis时都是向它发送命令,每次都是需要和redis建立tcp连接,然后发送命令信息,redis执行命令后,客户端等待着redis的响应.这个我们当然知道,就像访问db,IO开销都是消耗资源的大头,所以redis提供了pi

Redis笔记整理(三):进阶操作与高级部分

[TOC] Redis笔记整理(三):进阶操作与高级部分 Redis发布订阅 Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis客户端可以订阅任意数量的频道. 下图展示了频道channel1,以及订阅这个频道的三个客户端--client1,client2,client5之间的关系. 当有新消息通过PUBLISH命令发送给频道channel1时,这个消息就会被发送给订阅它的三个客户端: 相关操作命令如下: 命令 描述 PSUBS

点滴记录——学习Redis笔记

转载请说明出处:http://blog.csdn.net/cywosp/article/details/39701409 Redis 默认端口6379 Redis适用场景 1. 取最新N个数据的操作 2. 排行榜应用,取TOP N操作 3. 需要精确设定过期时间的应用 4. 计数器应用 5. Uniq操作,获取某段时间所有数据排重值 6. 实时系统,反垃圾系统 7. Pub/Sub构建实时消息系统--消息的发布与订阅 8. 构建队列系统 9. 缓存 Redis数据类型 Strings类型及操作

传智168期 day61 redis 笔记(2017年8月25日19:16:30)

redis入门笔记,介绍了如何在Linux下搭建redis,开启redis服务,还有常见的操作. 笔记下载: 链接:https://pan.baidu.com/s/1sl9GneP 密码:yh7k

Redis 发布订阅、事务、脚本、连接、HyperLogLog

欢迎大家加入 459479177QQ群进行交流 本次主要介绍Redis的发布订阅.事务.脚本.连接.HyperLogLog 一.发布订阅 1>psubscribe,订阅一个或多个指定的频道 Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "tv1" 3) (integer) 1 127.0.0.1:6379> psubscribe tv2 tv3                \

Redis资料汇总(四) 事务

edis对事务的支持目前还比较简单.redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的 命令. 由于redis是单线程来处理所有client的请求的所以做到这点是很容易的.一般情况下redis在接受到一个client发来的命令后会立即处理并 返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一 个队列中.当从此连接受到exec命令后,redis会顺序的执行

Redis Essentials 读书笔记 - 第九章: Redis Cluster and Redis Sentinel (Collective Intelligence)

Chapter 9. Redis Cluster and Redis Sentinel (Collective Intelligence) 上一章介绍了复制,一个master可以对应一个或多个slave(replica), 在以下的情况下是够用的: 1. master有足够内存容纳所有key 2. 通过slave可以扩展读,解决网络吞吐量的问题 3. 允许停止master的维护窗口时间 4. 通过slave做数据冗余 但复制解决不了自动failover和自动resharding的问题,在以下的情

Redis笔记整理(二):Java API使用与Redis分布式集群环境搭建

[TOC] Redis笔记整理(二):Java API使用与Redis分布式集群环境搭建 Redis Java API使用(一):单机版本Redis API使用 Redis的Java API通过Jedis来进行操作,因此首先需要Jedis的第三方库,因为使用的是Maven工程,所以先给出Jedis的依赖: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactI

redis深入学习(三)-----事务、主从复制、jedis

reids事务 概念 可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞 作用 一个队列中,一次性.顺序性.排他性的执行一系列命令 常用命令 正常操作事务: 放弃事务: 其实redis对于事务是部分支持: 例如incr k1虽然是错误的(类似于java的运行时异常),但是其他几个结果依然可以成功操作. watch监控 悲观锁/乐观锁/CAS(Check And Set) 1.悲观锁 悲观锁(Pessimistic Lock