Redis持久化
为了解决Redis服务器重启后数据丢失的问题,需要将Redis的数据持久化到硬盘上。
有两种持久化方式:AOF持久化、RDB持久化。
AOF 持久化
Append Only File
AOF持久化将服务器所有的写操作命令保存到单独的日志文件中,服务器重启时,通过加载日志文件并执行命令来回复数据。
AOF持久化配置
AOF持久化的实现
- 命令追加:Redis服务器并不是每执行一条写命令就将该命令写入AOF文件,避免频繁与硬盘交互浪费资源;而是先将命令追加到缓存区aof_buf中
AOF文件写入和文件同步:
根据appendfsync参数配置的不同策略,将缓存区aof_buf中的数据内容同步至硬盘中、zhbtAOF持久化策略
每当有新命令就追加
- 设置每秒执行一次
-
AOF文件重写
目的
定期重写AOF文件,可以压缩文件大小,节省空间。- 方式
AOF文件重写,会生成新的AOF文件代替旧的,但是重写过程并不会对旧的文件进行读取或写入。而是直接读取当前数据库的状态,将相应命令写入新AOF文件。 - 触发方式
AOF文件重写有手动触发和自动触发两种方式 后台重写
调用aof_rewrite函数重写AOF文件时,会使线程被长时间阻塞。Redis服务器采用单线程处理命令请求,此时会使服务器阻塞。因此Redis将AOF文件重写放到一个子进程中执行AOF文件处理
服务器启动时,会创建一个伪客户端,读取AOF文件的命令并发出命令执行,直到AOF中所有命令读取完毕
优点与缺点
RDB 持久化
在指定时间间隔内,将内存中所有数据生成一份快照保存在硬盘中。
触发机制
手动触发
save命令手动触发- 自动触发
满足save规则时,可以自动触发save m n
命令:时间m内被修改的键的个数大于n时,会触发BGSAVE
命令。
BGSAVE在后台执行,Redis调用子进程来执行,与AOF文件后台重写类似。 - 执行
flusl all
命令后 - 退出redis时
优点
缺点
- 操作需要一定时间间隔,两次快照会隔一段时间,最后一次的数据会丢失
- 子进程执行时,会占用一定内存空间
Redis缓存
缓存穿透
缓存中没有的数据,被大量访问。没有在缓存中查到数据,直接在数据库中查询。当这个数据被大量查询时,会影响系统。
解决方案
缓存空对象
此方法问题:
设置热点数据永不过期
加互斥锁
分布式锁,保证每一个key同一时间只要一个线程访问,将并发压力转移到分布式锁上
缓存雪崩
某一时间内,大量缓存集中失效。或服务器断点或断网π
Redis高可用
限流降级
数据预热
正式部署前,把可能的访问预先访问一遍,让可能大量访问的数据下载到缓存中
Redis事务
Lua脚本
管道技术 Pipline
Redis技巧
慢日志查询
耗时命令日志
当一条命令执行超过一定时间时,将它存入slowlog
slowlog-log-slower-than
慢日志命令时间限制 (默认10000)
slowlog-max-len
慢日志命令存储条数最大值 (默然128)
JAVA操作Redis
Java中使用Jedis操作Redis。
如果是云服务器,需要配置防火墙,添加服务器安全组。
性能优化
内存优化
Redis是多线程还是单线程?
IO线程
redis 6版本以前,单线程
redis 6版本开始,多线程,引入NIO,多路复用模型(主要性能提升点)
内存数据处理线程
一直都是单线程(为什么单线程还这么快?)
Redis 数据处理是单线程的,为什么还这么快?
- 多线程不一定就快,多线程环境下需要切换CPU,切换CPU需要消耗大量资源
- redis单线程,不需要切换cpu
- 直接操作内存,所以很快。