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;
做纯内存缓存,都可不用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值