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