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事务及持久化相关推荐

  1. Redis基本使用|基本命令|redis事务|Jedis|持久化|订阅|集群|

    文章目录 Redis ! 一.概述 二.安装 三.实操 1.性能测试 2.基础知识 3.基本key命令 4.基本数据类型 1.String 2.List 3.Set 4.Hash 5.Zset 5.特 ...

  2. redis事务与持久化

    1.redis事务三特性 1.单独的隔离操作       事务中的所有命令都会序列化.按顺序执行,事务执行过程中不会被其他客户端发来的命令打断. 2.没有隔离级别的概念       队列中的命令在没有 ...

  3. Redis事务、持久化、主从复制、哨兵、JRedis和JRedis Pool(摘抄)

    事务是指一系列操作步骤,这一系列的操作步骤,要么完全执行,要么完全地不执行 Redis中的事务是一组命令的集合,至少是两个或两个以上的命令,redis事务保证这些命令被执行时中间不会被任何操作打断 ( ...

  4. redis 事务,持久化,日志,主从,VM

    redis目前对事务的支持比较简单,只能保证一个客户端连接发起事务中的命令可以连续执行,而中间不会插入其他客户端的命令. 1.事务 一般情况下,redis接收到一个客户端发送的命令,立刻执行并返回结果 ...

  5. Redis系列:Redis持久化机制与Redis事务

    Redis 是个基于内存的数据库.那服务一旦宕机,内存中数据必将全部丢失.所以丢失数据的恢复对于 Redis 是十分重要的,我们首先想到是可以从数据库中恢复,但是在由 Redis 宕机时(说明相关工作 ...

  6. Redis全部知识总结(概念、安装、用法、数据类型、事务、持久化、Jeids、订阅系统、缓存穿透及雪崩等)

    Redis NoSql简述 Nosql概念 Nosql的四大分类 Redis概述 Redis的安装 安装文件 Window下安装 Linux下安装 redis-benchmark 压力测试工具 五大数 ...

  7. 尚硅谷Redis尚硅谷学习汇总_事务_持久化_主从复制_集群_穿透_雪崩_击穿

    前言 该文章是我在学习Redis过程中写的学习汇总,包括了基本使用和常用命令.RDB和AOF.配置文件.事务.击穿.穿透.雪崩.集群等,都记录了详细过程,不管是新手学习还是有基础的同学拿来回顾都是可以 ...

  8. redis事务机制及持久化机制

    事务机制 redis是支持事务的 redis事务是基于队列实现的,创建一个事务队列,然后将事务操作都放入队列中,最后依次执行 #开启事务 multi#添加命令 sadd user:1001:follo ...

  9. 腾讯二面:Redis 事务支持 ACID 么?

    ❝ 腾讯面试官:「数据库事务机制了解么?」 「内心独白:小意思,不就 ACID 嘛,转眼一想,我面试的可是技术专家,不会这么简单的问题吧」 程许远:「balabala-- 极其自信且从容淡定的说了一通 ...

最新文章

  1. 4000个“不会数学”的程序员出现大反转!居然能学AI,玩算法,搞逻辑!背后原因首次曝光...
  2. matlab解决多旅游商问题,多旅行商问题的matlab程序
  3. zookeeper与分布式系统
  4. C# WinForm编程之System.Windows.Forms.DataGridViewRow.DataBoundItem Property
  5. 并发编程-16AQS同步组件之CountDownLatch 闭锁
  6. debian mysql开机启动_自动启动debian和lighttpd+mysql
  7. flask + react_再写一本 Flask 书
  8. android中对sd卡的 操作文件问题 创建目录 创建文件到指定目录
  9. 编译mediastreamer2/ffmpeg/linphone(x86平台)
  10. 三点外接圆_故地重游伪切圆——伪外接圆的基本性质
  11. leetcode —— 1290. 二进制链表转整数
  12. ora 所有表记录数_ORACLE中如何查找定位表最后DML操作的时间小结
  13. 剑指_5替换空格(Python)
  14. bdd java_二元判断图BDD及其JAVA实现的应用与研究
  15. Blazeds文档(二)-------Blazeds体系结构(一)【转载】
  16. 归并算法(java的简单实现)
  17. 如何快速备份微信聊天记录到电脑
  18. 世界第八大奇迹:复利
  19. 微速(微锐) 与 打码工作
  20. 同网段能互通,跨网段不通

热门文章

  1. BlockChain:区块链入门课程 -- 区块链之类型 、应用程序、技术挑战和潜力
  2. leaflet 结合 Echarts4 实现散点图(附源码下载)
  3. 用python代替人脑运算24点游戏
  4. js 请求接口获取不到登录cookie xhrFields 配置
  5. 在微信小程序中引入 Iconfont 阿里巴巴图标库
  6. 十分钟搞定 pandas
  7. Linux入门学习(六)
  8. vue基础入门-应用 组件实例
  9. dagger2 注入_如何使用Dagger 2在您的应用程序中实现依赖注入
  10. 手动创建线程更好哦_如何通过创建更好的工作流程找到下一个大想法