redis学习——redis事务
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事务相关推荐
- Redis 学习---Redis 安装(2)
Redis 安装 Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases. Redis 支持 32 位和 64 位.这个需要根据你系统 ...
- Redis学习手册(事务)
一.概述: 和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制.在Redis中,MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石.相信对有关系型数据 ...
- redis学习-redis事务
是什么 可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞. 一次执行多个redis命令. 能干嘛 一个队列中,一次性.顺序性 ...
- redis学习-redis入门概述及简介
是什么 Redis:REmote DIctionary Server(远程字典服务器)是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运 ...
- redis学习-redis五大数据类型
五大数据类型简介 String(字符串) string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value. 也就是例子中的k1 v1,k2 v2 s ...
- Redis学习---Redis操作之String
set(name, value, ex=None, px=None, nx=False, xx=False) 在Redis中设置值,默认,不存在则创建,存在则修改 参数: ex,过期时间(秒) px, ...
- 转-Redis学习手册(目录)
为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后 ...
- Redis学习总结(数据类型、持久化、事务、数据删除策略、主从复制、哨兵、缓存雪崩等)
Redis学习总结 1.Redis是什么 1.概念 2.特点 3.应用场景 2.Linux环境安装redis 3.Redis的数据存储格式 1.String类型 1.String类型的常用操作 2.S ...
- Redis学习笔记(一) 数据类型事务异常Jredis
Redis学习笔记(一) NoSql概述 Nosql四大分类 Redis入门 简介 Windows安装 基础使用 问题 Redis4.0之前为什么是单线程 单线程为什么这么快 Redis4.0后的多线 ...
最新文章
- HTML元素的基本特性
- AtomicLong可以被原子地读取和写入的底层long值的操作
- elasticsearch(es)分布式全文检索引擎 简介
- Nginx 配置从零开始
- Tomcat启动阻塞变慢
- 版本1.8.1Go安装以及语法高亮配置
- Spring Security3源码分析-http标签解析(转)
- 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)
- Linux 命令之 unset -- 删除指定的shell变量或函数
- MySQL8的新特性ROLE
- 基于Ace Admin 的菜单栏实现
- C#对接中国移动短信接口
- 有机农业产品宣传介绍PPT模板
- ewebeditor
- android hook 第三方app_Android三大hook框架
- i技术会 | 爱奇艺品牌广告算法探索和实践
- php+mysql(5.1)+apache+centos 编译安装
- canvas设置大小
- 实现文件拷贝并获取拷贝进度
- pycharm光标变粗变宽