一、事务

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 # 将这个 SET 命令放入事务队列
QUEUED

DISCARD

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

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

EXEC

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

redis> MULTI
OK
redis> SET msg "hello world"
QUEUED
redis> EXPIRE msg
QUEUED
redis> EXEC
) OK # SET 命令的返回值
) (integer) # 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
(PIPELINE_END)
MULTI
SET msg “hello world” # 这两条命令会一起被服务器执行
EXPIRE msg
EXEC

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

  1. Redis附加功能之Redis流水线pipeline

    流水线功能的目的:通过减少客户端与服务器之间的通信次数来提高程序的执行效率. 一.通信 在一般情况下, 用户每执行一个 Redis 命令,客户端与服务器都需要进行一次通信:客户端会将命令请求发送给服务 ...

  2. Redis(三)Redis附加功能

    一.慢查询分析 许多存储系统(例如MySql)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作. 所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阈值,就将这条命令的相关信息 ...

  3. Redis附加功能之键过期功能

    一.键过期功能的相关命令 二.设置生存时间 Redis 提供了两个命令来设置键的生存时间(TTL,time to live),它们分别是: 如果给定的键不存在,那么 EXPIRE 和 PEXPIRE ...

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

    3.Pipeline 3.1 Pipeline概念 Redis客户端执行一条命令分为如下四个过程: (1)发送命令 (2)命令排队 (3)命令执行 (4)返回结果 其中(1)和(4)称为Round T ...

  5. redis学习笔记 - Pipeline与事务

    原文 Redis提供了5种数据结构,但除此之外,Redis还提供了注入慢查询分析,Redis Shell.Pipeline.事务.与Lua脚本.Bitmaps.HyperLogLog.PubSub.G ...

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

    Redis提供了5种数据结构已经足够强大,但除此之外,Redis还提供了诸如慢查询分析.功能强大的Redis Shell.Pipeline.事务与Lua脚本.Bitmaps.HyperLogLog.发 ...

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

    1. Redis事务 Redis中的事务(transaction)是一组命令的集合,一个事务中的命令要么都执行,要么都不执行.事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次 ...

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

    Redis 简介 Redis 是完全开源免费的,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中 ...

  9. Redis之(四)事务

    5.1开始事务 MULTI 命令的执行标记着事务的开始: 当客户端处于非事务状态下时, 所有发送给服务器端的命令都会立即被服务器执行. Redis 的事务不可嵌套, 当客户端已经处于事务状态, 而客户 ...

随机推荐

  1. 试用fastJSON

    实体类 User.java package com.test.fastjson.entity; import java.util.Date; public class User { private L ...

  2. Python基础教程【读书笔记】 - 2016/7/5

    希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第三波:第8章  异常 [总览]学习如何创建和引发自定义的异常,以及处理异常的各种方法. 为了能够处理异常事件,可以再所 ...

  3. 剑指offer系列46---和为s的连续正数序列

    [题目]输出所有和为S的连续正数序列.序列为:1,2,3,4,5,6,7,8................ * 序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序 package com.e ...

  4. 在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)

    http://www.cyqdata.com/cnblogs/article-detail-35876#

  5. ADF_Starting系列4_使用ADF开发富Web应用程序之维护User Interface(Part1)

    2014-05-04 Created By BaoXinjian

  6. WLS_Oracle Weblogic安装和环境搭建(案例)

    2014-01-03 Created By BaoXinjian

  7. PLSQL_闪回操作6_Flashback Database

    2014-12-09 Created By BaoXinjian

  8. UVA 272 TEX Quotes

    TEX Quotes 题意: 变引号. 题解: 要想进步,真的要看一本好书,紫书P45 代码: #include<stdio.h> int main() { int c,q=1; whil ...

  9. python实现字体闪图

    !/usr/bin/env python from future import print_function import os.path import sys from optparse impor ...

  10. linux命令(10)使用kill杀死含有指定关键字的进程

    命令:ps -ef|grep keyword|grep -v grep|cut -c 9-15|xargs kill -9 批量杀死包含关键字“keyword”的进程. "ps -ef&qu ...