Redis附加功能之Redis事务

一、事务

Redis 的事务功能允许用户将多个命令包裹起来,然后一次性地、按顺序地执行被包裹的所有命令。在事务执行的过程中,服务器不会中断事务而改去执行其他命令请求,只有在事务包裹的所有命令都
被执行完毕之后,服务器才会去处理其他命令请求。

事务示例:

现在, 让我们假设 SETEX 命令并不存在于 Redis , 并且 SET 命令也不支持 EX seconds 参数, 如果我们要自己来实现一个 SETEX 命令的话, 那么我们可能会使用以下代码:

def SETEX(key, seconds, value):
SET key value
EXPIRE key seconds

在一般情况下,这个自制的 SETEX 命令可以达到设置键值对并设置生产时间的效果,但是这个自制的SETEX 存在一个缺陷:如果服务器在成功地执行 SET 命令并保存数据之后崩溃,那么 EXPIRE 命令将没办法执行。

这时虽然我们已经设置了键, 但并没有为键设置过期时间, 如果我们没有发觉的话, 那么这个本来应该定期被删除的键就会一直留在数据库里面占用着内存, 甚至造成之后的程序出错。

二、事务命令

为了避免遇上以上所说的情况, 我们需要用到 Redis 的事务功能, 通过事务, 我们可以让 Redis一次性地执行多个命令, 并且确保事务中的命令要么就全部都执行,要么就一个都不执行

MULTI : 开始一个新的事务

DISCARD : 放弃事务

EXEC : 执行事务中所有命令

以下分别对事务命令进行描述:

MULTI

开始一个事务。
在这个命令执行之后,客户端发送的所有针对数据库或者数据库键的命令都不会被立即执行,而是被放入到一个事务队列里面,并返回 QUEUED 表示命令已入队。

redis> MULTI # 开始一个事务
OK
redis> SET msg "hello world" # 将这个 SET 命令放入事务队列
QUEUED
redis> EXPIRE msg 10086 # 将这个 SET 命令放入事务队列
QUEUED

DISCARD

取消事务,放弃执行事务队列中的所有命令。

redis> MULTI
OK
redis> SET msg "hello world"
QUEUED
redis> EXPIRE msg 10086
QUEUED
redis> DISCARD # 事务已被取消
OK
redis> SET msg "hello world"
OK

EXEC

执行事务,按照命令被入队到事务队列中的顺序,执行事务队列中的所有命令。命令的返回值是一个列表,列表里包含了事务队列中所有被执行命令的返回值。

redis> MULTI
OK
redis> SET msg "hello world"
QUEUED
redis> EXPIRE msg 10086
QUEUED
redis> EXEC
1) OK # SET 命令的返回值
2) (integer) 1 # EXPIRE 命令的返回值

使用事务保证操作的安全性

之前的自制 SETEX 的定义,带有安全缺陷:

def SETEX(key, seconds, value):
SET key value
EXPIRE key seconds # 如果服务器在 SET 命令执行之后崩溃,那么 EXPIRE 将无法执行

使用事务实现的自制 SETEX 的定义,没有安全缺陷,服务器保证要么两个命令都执行,要么就两个命令都不执行:

def SETEX(key, seconds, value):
MULTI
SET key value
EXPIRE key seconds
EXEC

三、流水线和事务的区别

流水线:确保多条命令会被一起发送

事  务 :确保多条命令会被一起执行

(PIPELINE_START)
SET msg “hello world” # 这两条命令会被一起发送至服务器
EXPIRE msg 10086
(PIPELINE_END)
MULTI
SET msg “hello world” # 这两条命令会一起被服务器执行
EXPIRE msg 10086
EXEC
时间: 2024-08-11 03:25:39

Redis附加功能之Redis事务的相关文章

Redis附加功能之Redis流水线pipeline

流水线功能的目的:通过减少客户端与服务器之间的通信次数来提高程序的执行效率. 一.通信 在一般情况下, 用户每执行一个 Redis 命令,客户端与服务器都需要进行一次通信:客户端会将命令请求发送给服务器,而服务器则会将执行命令所得的结果返回给客户端. 当程序执行一些复杂的操作时, 客户端可能需要执行多个命令, 并与服务器进行多次通信. 假设我们正在构建一个为图书打标签(tag)的网站,这个网站上的每本图书都可以被打上任意多个标签.并且为了记录哪些标签的图书是最多人阅览的,我们会为每个标签创建一个

Redis附加功能之键过期功能

一.键过期功能的相关命令 二.设置生存时间 Redis 提供了两个命令来设置键的生存时间(TTL,time to live),它们分别是: 如果给定的键不存在,那么 EXPIRE 和 PEXPIRE 将返回 0 ,表示设置失败:如果命令返回 1 ,那么表示设置成功.当一个键被设置了生存时间之后,它的生存时间将会随着时间的流逝而减少:时间过去一毫秒,键的生存时间就减少一毫秒:时间过去一秒钟,键的生存时间就减少一秒钟:以此类推.当一个键的生存时间被减少至低于 0 时,Redis 就会自动将这个键删除

【redis 学习系列08】Redis小功能大用处02 Pipeline、事务与Lua

3.Pipeline 3.1 Pipeline概念 Redis客户端执行一条命令分为如下四个过程: (1)发送命令 (2)命令排队 (3)命令执行 (4)返回结果 其中(1)和(4)称为Round Trip Time(RTT,往返时间). Redis提供了批量操作命令( 例如mget.mset等) ,可以有效地节约RTT.但大部分命令是不支持批量操作的,例如要执行n次hgetall命令,并没有mhgetall命令存在,需要消耗n次RTT.Redis的客户端和服务端可能部署在不同的机器上.例如客户

redis学习笔记 - Pipeline与事务

原文 Redis提供了5种数据结构,但除此之外,Redis还提供了注入慢查询分析,Redis Shell.Pipeline.事务.与Lua脚本.Bitmaps.HyperLogLog.PubSub.GEO等附加功能,这些功能可以在某些场景发挥很重要的作用. Pipeline 1. Pipeline概念 Redis客户端执行一条命令分为以下四个步骤: 1.发送命令2.命令排队3.命令执行4.返回结果 其中,第一步+第四步称为Round Trip Time(RTT,往返时间). Redis提供了批量

【redis 学习系列07】Redis小功能大用处01 慢查询分析以及Redis Shell

Redis提供了5种数据结构已经足够强大,但除此之外,Redis还提供了诸如慢查询分析.功能强大的Redis Shell.Pipeline.事务与Lua脚本.Bitmaps.HyperLogLog.发布订阅.GEO等附加功能,这些功能可以在某些场景发挥重要作用. 慢查询分析:通过慢查询分析,找出有问题的命令进行优化: Redis Shell:功能强大的Redis Shell会有意想不到的使用功能: Pipeline:通过Pipeline(管道或者流水线)机制有效提高客户端性能: 事务与Lua:制

Redis学习笔记(4) Redis事务、生存时间及排序

1. Redis事务 Redis中的事务(transaction)是一组命令的集合,一个事务中的命令要么都执行,要么都不执行.事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次执行这些命令. 127.0.0.1:6379> multi OK 127.0.0.1:6379> sadd user:1:following 2 QUEUED 127.0.0.1:6379> sadd user:2:followers 1 QUEUED 127.0.0.1:6379>

就publish/subscribe功能看redis集群模式下的队列技术(一)

Redis 简介 Redis 是完全开源免费的,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储. Redis支持数据的备份,即master-slave模式的数据备份. 性能极高 – Redis能读的速度是110000次/s

redis源码分析之事务Transaction(下)

接着上一篇,这篇文章分析一下redis事务操作中multi,exec,discard三个核心命令. 原文地址:http://www.jianshu.com/p/e22615586595 看本篇文章前需要先对上面文章有所了解: redis源码分析之事务Transaction(上) 一.redis事务核心命令简介 redis事务操作核心命令: //用于开启事务 {"multi",multiCommand,1,"sF",0,NULL,0,0,0,0,0}, //用来执行事

(3)redis队列功能

Redis队列功能介绍 List 常用命令: Blpop删除,并获得该列表中的第一元素,或阻塞,直到有一个可用 Brpop删除,并获得该列表中的最后一个元素,或阻塞,直到有一个可用 Brpoplpush Lindex获取一个元素,通过其索引列表 Linsert在列表中的另一个元素之前或之后插入一个元素 Llen获得队列(List)的长度 Lpop从队列的左边出队一个元素 Lpush从队列的左边入队一个或多个元素 Lpushx当队列存在时,从队到左边入队一个元素 Lrange从列表中获取指定返回的