Redis事务的概念:

Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。

总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。

Redis事务没有隔离级别的概念:

批量操作在发送 EXEC 命令前被放入队列缓存,并不会被实际执行,也就不存在事务内的查询要看到事务里的更新,事务外查询不能看到。
Redis不保证原子性:

Redis不保证原子性:

Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。

Redis事务的三个阶段:

  • 开始事务(MULTI)
  • 命令入队(…)
  • 执行事务(EXEC)

Redis事务相关命令:

  • watch key1 key2 … : 监视一或多个key,如果在事务执行之前,被监视的key被其他命令改动,则事务被打断 (
    类似乐观锁 )
  • multi : 标记一个事务块的开始( queued )
  • exec : 执行所有事务块的命令 ( 一旦执行exec后,之前加的监控锁都会被取消掉 )
  • discard : 取消事务,放弃事务块中的所有命令
  • unwatch : 取消watch对所有key的监控

Redis事务使用案例:

(1)正常执行

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> get k2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK
2) OK
3) "v2"
4) OK
127.0.0.1:6379>


(图片是我在网上找的,我用的是6.0版本的redix,跟图片上稍微有点差别,但不影响。接下来我会全用网上的图片来代替,谁让人家弄得好呢。)

事务在每一次执行完后就没了,再用就需要重新开启事务。

(2)放弃事务

(3)若在事务队列中存在命令性错误(类似于java编译性错误),则执行EXEC命令时,所有命令都不会执行

(4)若在事务队列中存在语法性错误(类似于java的1/0的运行时异常),则执行EXEC命令时,其他正确命令会被执行,错误命令抛出异常。

(5)使用watch

悲观锁:

  • 很悲观,认为什么时候都会出现问题,无论做什么都会加锁

乐观锁:

  • 很乐观,认为什么时候都不会出现问题,所以不会上锁!更新数据的时候去判断一下,在此期间是否有人修改过这个数据
  • 获取version
  • 更新的时候比较version

案例一:使用watch检测balance,事务期间balance数据未变动,事务执行成功


案例二:使用watch检测balance,在开启事务后(标注1处),在新窗口执行标注2中的操作,更改balance的值,模拟其他客户端在事务执行期间更改watch监控的数据,然后再执行标注1后命令,执行EXEC后,事务未成功执行。


一但执行 EXEC 开启事务的执行后,无论事务使用执行成功, WATCH对变量的监控都将被取消。

故当事务执行失败后,需重新执行WATCH命令对变量进行监控,并开启新的事务进行操作。

总结
  watch指令类似于乐观锁,在事务提交时,如果watch监控的多个KEY中任何KEY的值已经被其他客户端更改,则使用EXEC执行事务时,事务队列将不会被执行,同时返回Nullmulti-bulk应答以通知调用者事务执行失败。

redis学习——redis事务相关推荐

  1. Redis 学习---Redis 安装(2)

    Redis 安装 Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases. Redis 支持 32 位和 64 位.这个需要根据你系统 ...

  2. Redis学习手册(事务)

    一.概述: 和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制.在Redis中,MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石.相信对有关系型数据 ...

  3. redis学习-redis事务

    是什么 可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞. 一次执行多个redis命令. 能干嘛 一个队列中,一次性.顺序性 ...

  4. redis学习-redis入门概述及简介

    是什么 Redis:REmote DIctionary Server(远程字典服务器)是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运 ...

  5. redis学习-redis五大数据类型

    五大数据类型简介 String(字符串) string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value. 也就是例子中的k1 v1,k2 v2 s ...

  6. Redis学习---Redis操作之String

    set(name, value, ex=None, px=None, nx=False, xx=False) 在Redis中设置值,默认,不存在则创建,存在则修改 参数: ex,过期时间(秒) px, ...

  7. 转-Redis学习手册(目录)

    为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后 ...

  8. Redis学习总结(数据类型、持久化、事务、数据删除策略、主从复制、哨兵、缓存雪崩等)

    Redis学习总结 1.Redis是什么 1.概念 2.特点 3.应用场景 2.Linux环境安装redis 3.Redis的数据存储格式 1.String类型 1.String类型的常用操作 2.S ...

  9. Redis学习笔记(一) 数据类型事务异常Jredis

    Redis学习笔记(一) NoSql概述 Nosql四大分类 Redis入门 简介 Windows安装 基础使用 问题 Redis4.0之前为什么是单线程 单线程为什么这么快 Redis4.0后的多线 ...

最新文章

  1. HTML元素的基本特性
  2. AtomicLong可以被原子地读取和写入的底层long值的操作
  3. elasticsearch(es)分布式全文检索引擎 简介
  4. Nginx 配置从零开始
  5. Tomcat启动阻塞变慢
  6. 版本1.8.1Go安装以及语法高亮配置
  7. Spring Security3源码分析-http标签解析(转)
  8. 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)
  9. Linux 命令之 unset -- 删除指定的shell变量或函数
  10. MySQL8的新特性ROLE
  11. 基于Ace Admin 的菜单栏实现
  12. C#对接中国移动短信接口
  13. 有机农业产品宣传介绍PPT模板
  14. ewebeditor
  15. android hook 第三方app_Android三大hook框架
  16. i技术会 | 爱奇艺品牌广告算法探索和实践
  17. php+mysql(5.1)+apache+centos 编译安装
  18. canvas设置大小
  19. 实现文件拷贝并获取拷贝进度
  20. pycharm光标变粗变宽

热门文章

  1. @Alias使用技巧
  2. 英文最基本的五个时态
  3. 如何使用petri网建模工具pipe4.3.0
  4. 【大数据入门核心技术-Tez】(二)Tez安装
  5. Linux常用打包命令
  6. java 多线程 并发 面试题_最常见的15个Java多线程,并发面试问题
  7. 计算机网络思维导图_计算机网络面试指南 考研/校招
  8. 云原生(什么是云原生?云原生的四要素)
  9. java中输出语句println()和print()的区别
  10. 《STL源码剖析》-- stl_map.h