Redis事务及持久化
Redis事务
1)、定义
Redis事务,是一个单独的隔离操作,事务中所有命令都会序列化、按顺寻的执行。
事务在执行的过程中,不会被其他客户端发送过来的命令请求所打断。
作用:串联多个命令防止插队
2)、指令
①Multi
输入的命令进入命令队列,不执行
组队过程中出报告错误,整个队列都会取消
②Exec
将队列中的命令依次执行
执行过程中出报告错误,报错部分不会执行,其它部分无影响
③discard
组队过程可通过discard来放弃组队
3)、事务冲突
①传统的关系型数据库:悲观锁(每次请求都对数据加锁,其它请求block)
如:行锁、表锁、写锁、读锁
②Redis:乐观锁(版本号)
先获取版本号,在操作后时比较版本号,若不同(被其它请求修改),结束
适用于多读的应用类型,可提高吞吐量(check-and-set)
Ps:在执行Multi之前。先执行watch key1 key2 可以监视一个或多个key,
若事务执行前,这些key被其它命令所改动,则事务被打断
4)、特性
①单独的隔离操作
②无隔离级别(队列提交前,命令都不会执行)
③不保证原子性,队列出错不回滚
5)、秒杀案例
存储一个商品,存储一个成功用户集合
Tips:可使用ab模拟高并发
①”超卖问题”
问题起因:并发都成功
先使用watch监视key,使用jedis.multi来获取事务tran
通过tran调用修改方法,tran.exec来执行,返回null或0即失败
②“库存遗留问题”
问题起因:多个并发只成功一个
LUA脚本/外挂:嵌入式脚本语言
将复杂的或多步的redis操作写为一个脚本,一次性交给redis执行,减少链接次数,提高性能
类似Redis事务,有一定原子性,可以完成一些redis事务的操作
在redis2.6版本上可以使用
String st = jedis.scriptLoad(lua脚本字符串) //加载脚本
jedis.evalsha(st,参数个数,第一个参数,第二个参数)//解析脚本
③”超时“
使用链接池
6)、链接池
①通过new JedisPoolConfig()来创建一个连接池配置:
设置属性:
MaxTotal:控制一个pool可分配多少个jedis实例
maxIdle:控制一个pool最多有多少个状态为idel的jedis实例
MaxWaitMillis:当borrow一个jedis实例时,最大的等待毫秒数,超过时间,直接抛异常
testOnBorrow:获得一个jedis实例的时候是否检查链接可用性(ping)
②通过new JedisPool(poolconfig,IP,Port,num)来创建一个连接池
通过pool.getResource()来获取jedis
Redis持久化
1)、持久化方式
RDB(Redis DataBase)
AOF(Append Of File)
2)、RDB
①在指定时间间隔内将内存中的数据集快速写入磁盘,即Snapshot快照
恢复时,将快照文件直接读到内存里
②备份过程
Redis会单独创建(fork)一个子进程来进行持久化
先将数据写入一个临时文件,持久化过程结束后,再使用这个临时文件替换上次持久化好的文件
整个过程主进程不进行任何IO操作,比AOF更高效
对数据恢复的完整性不敏感(会丢失数据)
最后一次持久化后的数据可能会丢失
③写时复制技术(Linux)
需要持久化的时候fork才会占用进程
父进程和子进程会共用同一段物理内存,只有进程空间的各段内容要发生变化时,
才会将父进程内容复制一份给子进程
④rdb保存的文件
在redis.conf中配置文件名称:dbfilename dump.rdb
保存位置(默认保存在开启redis的位置):dir ./
⑤rdb的保存策略
配置文件中:
save seconds changes(在seconds秒中,完成changes次操作,进行持久化)
Ps:正常关闭时,也会持久化
⑥手动保存快照
save:只管保存,全部阻塞
save vs bgsave(一般不使用)
⑦其它配置
stop-writes-on-bgsave-error yes:当Redis无法写入磁盘时,直接关闭写操作
rdbcompression yes:进行rdb保存时,将文件压缩
rdbcheck yes:存储快照后,使用CRC64算法来校验数据,会增加大约10%性能消耗
⑧rdb的恢复
关闭Redis,将备份文件拷贝到工作目录下,启动自动加载
⑨rdb优点和缺点
优点:节省磁盘空间,恢复速度快
缺点:数据量庞大消耗性能;存储有间隔,若Redis意外down(宕)掉,就会失去最后一次快照的修改
3)、AOF
①以日志的形式来记录每个写操作,只许追加文件,不可改写文件
Redis启动时按照指令来重构数据
②默认不开启
redis.conf中:appendonly no
文件名称:appendfilename “appendonly.aof”
保存路径同RDB一致
③AOF文件恢复
指令:redis-check-aof --fix appendonly.aof
Ps:每个指令以*、$开始
④同步频率设置
始终同步:appendfsync everysec
每秒同步:appendfsync always
不主动进行同步,交给操作系统:appendfsync no
⑤Rewrite
重写机制:当AOF文件大小超过阈值时,Redis就会启动AOF文件的内容压缩
只保留可以恢复数据的最小指令集。可以使用命令bgrewriteaof。
重写:fork出一条新进程来重写,并没有读取旧的aof文件,将整个内存中的数据用命令写了一个新的aof文件。
何时重写:上次重写/系统载入时,记录aof文件大小,当增长为2倍时,进行重写
⑥优点和缺点
优点:备份机制稳健;可读的日志文件,可处理误操作
缺点:占用更多磁盘;恢复速度慢;每次读写同步有性能压力;存在个别Bug
4)、AOF和RDB同时开启
以AOF为准
5)、用哪个
推荐两个都启用;
不建议单独使用AOF,会出现Bug;
做纯内存缓存,都可不用
Redis事务及持久化相关推荐
- Redis基本使用|基本命令|redis事务|Jedis|持久化|订阅|集群|
文章目录 Redis ! 一.概述 二.安装 三.实操 1.性能测试 2.基础知识 3.基本key命令 4.基本数据类型 1.String 2.List 3.Set 4.Hash 5.Zset 5.特 ...
- redis事务与持久化
1.redis事务三特性 1.单独的隔离操作 事务中的所有命令都会序列化.按顺序执行,事务执行过程中不会被其他客户端发来的命令打断. 2.没有隔离级别的概念 队列中的命令在没有 ...
- Redis事务、持久化、主从复制、哨兵、JRedis和JRedis Pool(摘抄)
事务是指一系列操作步骤,这一系列的操作步骤,要么完全执行,要么完全地不执行 Redis中的事务是一组命令的集合,至少是两个或两个以上的命令,redis事务保证这些命令被执行时中间不会被任何操作打断 ( ...
- redis 事务,持久化,日志,主从,VM
redis目前对事务的支持比较简单,只能保证一个客户端连接发起事务中的命令可以连续执行,而中间不会插入其他客户端的命令. 1.事务 一般情况下,redis接收到一个客户端发送的命令,立刻执行并返回结果 ...
- Redis系列:Redis持久化机制与Redis事务
Redis 是个基于内存的数据库.那服务一旦宕机,内存中数据必将全部丢失.所以丢失数据的恢复对于 Redis 是十分重要的,我们首先想到是可以从数据库中恢复,但是在由 Redis 宕机时(说明相关工作 ...
- Redis全部知识总结(概念、安装、用法、数据类型、事务、持久化、Jeids、订阅系统、缓存穿透及雪崩等)
Redis NoSql简述 Nosql概念 Nosql的四大分类 Redis概述 Redis的安装 安装文件 Window下安装 Linux下安装 redis-benchmark 压力测试工具 五大数 ...
- 尚硅谷Redis尚硅谷学习汇总_事务_持久化_主从复制_集群_穿透_雪崩_击穿
前言 该文章是我在学习Redis过程中写的学习汇总,包括了基本使用和常用命令.RDB和AOF.配置文件.事务.击穿.穿透.雪崩.集群等,都记录了详细过程,不管是新手学习还是有基础的同学拿来回顾都是可以 ...
- redis事务机制及持久化机制
事务机制 redis是支持事务的 redis事务是基于队列实现的,创建一个事务队列,然后将事务操作都放入队列中,最后依次执行 #开启事务 multi#添加命令 sadd user:1001:follo ...
- 腾讯二面:Redis 事务支持 ACID 么?
❝ 腾讯面试官:「数据库事务机制了解么?」 「内心独白:小意思,不就 ACID 嘛,转眼一想,我面试的可是技术专家,不会这么简单的问题吧」 程许远:「balabala-- 极其自信且从容淡定的说了一通 ...
最新文章
- 4000个“不会数学”的程序员出现大反转!居然能学AI,玩算法,搞逻辑!背后原因首次曝光...
- matlab解决多旅游商问题,多旅行商问题的matlab程序
- zookeeper与分布式系统
- C# WinForm编程之System.Windows.Forms.DataGridViewRow.DataBoundItem Property
- 并发编程-16AQS同步组件之CountDownLatch 闭锁
- debian mysql开机启动_自动启动debian和lighttpd+mysql
- flask + react_再写一本 Flask 书
- android中对sd卡的 操作文件问题 创建目录 创建文件到指定目录
- 编译mediastreamer2/ffmpeg/linphone(x86平台)
- 三点外接圆_故地重游伪切圆——伪外接圆的基本性质
- leetcode —— 1290. 二进制链表转整数
- ora 所有表记录数_ORACLE中如何查找定位表最后DML操作的时间小结
- 剑指_5替换空格(Python)
- bdd java_二元判断图BDD及其JAVA实现的应用与研究
- Blazeds文档(二)-------Blazeds体系结构(一)【转载】
- 归并算法(java的简单实现)
- 如何快速备份微信聊天记录到电脑
- 世界第八大奇迹:复利
- 微速(微锐) 与 打码工作
- 同网段能互通,跨网段不通