用过其他关系型数据库(比如msql)的肯定都指定,在关系型数据库里面的事务可以保证多个命令操作要么同时成功,要么同时失败。并且在执行事务的时候,可以有隔离级别。

  但是在Redis中的事务,只是保证事务同时执行多个命令,并且不会被其他客户端的命令所打断,但是,如果在执行的时候发现中断,错误之类的,Redis中的事务是没有回滚的功能。

  在Redis中提供了DISCART、EXEC、MULTI、UNWATCH、WATCH这个几个命令来操作事务。

事务的用法

  ①通过MULTI命令,开启一个事务,这时候,客户端可以发送任意多条命令,这些命令不会立即执行,而是放到一个队列中。

  ②通过EXEC命令,可以一次性执行队列中的命令。

  ③如果命令加入队列中之后,我们不想执行这个事务了,还可以通过DISCARD来放弃事务,这时候队列会被清空。

实例:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> get name
QUEUED
127.0.0.1:6379> set name zhangsan
QUEUED
127.0.0.1:6379> pop age
(error) ERR unknown command 'pop'
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> multi
OK
127.0.0.1:6379> get name
QUEUED
127.0.0.1:6379> set name zhangsan
QUEUED
127.0.0.1:6379> exec
1) (nil)
2) OK
127.0.0.1:6379> exec
(error) ERR EXEC without MULTI
127.0.0.1:6379>

可以看到,在pop age这个命令入队的时候i,发生了错误,然后在exec的时候,发现这个事务已经被取消了。

而在后面,get name返回的是nil,但是事务还是被执行了。

需要注意的是,在执行的时候即使在其中某个命令出现错误了,redis还是会继续执行事务里的其他命令,而不会中止执行操作。

使用CHECK-AND-SET实现乐观锁

  乐观锁的意思就是锁定某个资源,但是如果其他客户端也需要访问这个资源的时候,则释放资源给其他客户端访问。

  WATCH命令可以用来监视某个键,并且可以发觉这些键是否被改动了。如果至少有一个被监视的键在EXEC执行之前被修改了,那么整个事务都被被取消,EXEC会返回nil-reply来表示事务已经失败。

127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379> watch name
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> set address shanghai
QUEUED
#####################
#这时候,在启动一个客户端,修改name的值
#####################
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379>
[root@localhost 08:36 ~]# redis-cli
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379>

Redis脚本

  Redis脚本,本身也是一种事务,所以在事务中可以完成的事情都可以通过脚本来完成。并且脚本更加简单,更加快速。

  但是由于脚本是在Redis2.6版本中才引入的,而事务很早就已经存在了,所以现在的版本中两种都存在,

  但是不排除以后的版本会删掉事务的功能。

Redis事务管理的更多相关文章

  1. 【原】Redis事务管理

    Redis高级篇 事务 MULTI, EXEC, DISCARD and WATCH命令用于保证Redis中的事务处理 一个事务中的所有命令被序列化并串行执行. 事务的原子性. 用法 MULTI ...

  2. Redis学习笔记~Redis事务机制与Lind.DDD.Repositories.Redis事务机制的实现

    回到目录 Redis本身支持事务,这就是SQL数据库有Transaction一样,而Redis的驱动也支持事务,这在ServiceStack.Redis就有所体现,它也是目前最受业界认可的Redis ...

  3. Redis学习——Redis事务

    Redis和传统的关系型数据库一样,因为具有持久化的功能,所以也有事务的功能! 有关事务相关的概念和介绍,这里就不做介绍. 在学习Redis的事务之前,首先抛出一个面试的问题. 面试官:请问Redis ...

  4. Redis整理第三波(生存时间、事务管理)

    expire  设置生存时间 Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即到期后数据销毁. TTL查看key的剩余时间,当返回值为-2时,表示键被删除. 当 ...

  5. redis的持久化 与事务管理

    1. redis的持久化 Redis的持久化主要分为两部分:RDB(Redis DataBase), AOF(Append Only File) 2. 什么是redis 的持久化        在指定 ...

  6. Redis数据库之KEY的操作与事务管理

    目的 了解并掌握各种数据类型的命令操作方式,以及各种数据类型值的操作方式.同时,主要培养对KEY的操作命令运用的能力.重点掌握对KEY信息的管理.事务常规管理和事务回滚操作. KEYS命令的练习,对K ...

  7. Spring Framework 中启动 Redis 事务操作

    背景: 项目中遇到有一系列对Redis的操作,并需要保持事务处理. 环境: Spring version 4.1.8.RELEASE Redis Server 2.6.12 (64位) spring- ...

  8. spring+springmvc+mybatis+oracle+atomikos+jta实现多数据源事务管理

    ---恢复内容开始---   在做项目过程中,遇到了需要一个项目中访问两个数据库的情况,发现使用常规的spring管理事务,导致事务不能正常回滚,因此,采用了jta+atomikos的分布式数据源方式 ...

  9. Hibernate框架笔记02_主键生成策略_一级缓存_事务管理

    目录 0. 结构图 1. 持久化类的编写规则 1.1 持久化和持久化类 1.2 持久化类的编写规则 2. 主键生成策略 2.1 主键的分类 2.2 主键生成策略 3. 持久化类的三种状态[了解] 3. ...

随机推荐

  1. 关于css的text-indent首行缩进两个字符和图片缩进的问题

    段落前面空两个字的距离,不要再使用空格了.应该使用首行缩进text-indent. text-indent可以使得容器内首行缩进一定单位.比如中文段落一般每段前空两个汉字. <style typ ...

  2. Java读取word中表格

    因为要新建一个站,公司要把word表格的部分行列存到数据库中.之前用java操作过excel,本来打算用java从word表格中读取数据,再存到数据库中,结果因为权限不够,无法访问公司要写的那个数据库 ...

  3. C语言作业(三)

    一.完成PTA上四题作业 二.具体解题 (一).A乘以B 1.实验代码 #include <stdio.h> int main() { int A,B,C; scanf("%d ...

  4. android 检查软件是否有更新版本

    import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import com.yuxin.m ...

  5. 项目Beta冲刺Day4

    项目进展 李明皇 今天解决的进度 因服务器端未完成登录态维护,故无法进行前后端联动. 明天安排 前后端联动调试 林翔 今天解决的进度 因上课和实验室事务未完成登录态维护 明天安排 完成登录态维护 孙敏 ...

  6. Java.nio-随机读写汉字

    笔者最近在用多线程来计算中文文本的标点符号数目,遇到了以下问题: 在Windows下,文本中汉字通常采用Unicode编码,这就导致需要随机(RandomAccessFile)读取文本时,产生乱码现象 ...

  7. WebApi 的三种寄宿方式 (一)

    最近逛博客园,看到了Owin,学习了一下,做个笔记,说不定将来哪天就用上了 关于 Owin 的介绍,百度解释的很清楚了: https://baike.baidu.com/item/owin/28607 ...

  8. 开源软件:NoSql数据库 - 图数据库 Neo4j

    转载自原文地址:http://www.cnblogs.com/loveis715/p/5277051.html 最近我在用图形数据库来完成对一个初创项目的支持.在使用过程中觉得这种图形数据库实际上挺有 ...

  9. 新概念英语(1-9)How is Ema?

    A:Hello Helen. B:Hi Steven. A:How are you today? B:I'm very well, thank you. And you? A:I'm fine tha ...

  10. Tesseract-OCR4.0识别中文与训练字库实例

    关于中文的识别,效果比较好而且开源的应该就是Tesseract-OCR了,所以自己亲身试用一下,分享到博客让有同样兴趣的人少走弯路. 文中所用到的身份证图片资源是百度找的,如有侵权可联系我删除. 一. ...