淘汰策略和持久化
一、淘汰策略
(1)介绍
当内存不足时,redis会根据缓存配置,来淘汰部分key,以保证写入成功。当没有淘汰策略时,redis会返回内存溢出错误(out of memory)。redis中,允许用户设置最大使用内存为maxmemory 512G。
(2)6种数据淘汰策略
• volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
• volatile-lfu:从已设置过期的Keys中,删除一段时间内使用次数最少使用的
• volatile-ttl:从已设置过期时间的数据集中挑选最近将要过期的数据淘汰
• volatile-random:从已设置过期时间的数据集中随机选择数据淘汰
• allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
• allkeys-lfu:从所有Keys中,删除一段时间内使用次数最少使用的
• allkeys-random:从数据集中随机选择数据淘汰
• no-enviction(驱逐):禁止驱逐数据(不采用任何淘汰策略。默认即为此配置),针对写操作,返回错误信息
(3)建议
平时应该主动设置key的过期时间,将一些不常用的和过期的key进行删除,有利于提高查询性能。
二、持久化
(1)介绍
内存:读写速度快,高效,但是断电(意外退出)会导致数据丢失。
硬盘:读写速度慢于内存,但是断电数据不会丢失。
(2)RDB
①介绍
把当前数据通过快照的方式存储到硬盘中的过程,默认文件为dump.rdb。
a.手动触发(bgsave)
save基本废弃,不推荐。
bgsave流程:
①redis执行bgsave命令后,父进程会判断当前是否有子进程正在执行,如果有,直接返回。
②父进程会执行fork来创建子进程,期间父进程会阻塞,其它子进程不会进来。
③父进程操作的fork完成后,就不会在阻塞父进程。
④子进程在生产RDB文件,生成快照。
⑤完成后,会通知父进程进行更新。
b.自动触发
比如使用save m n命令,表示m秒内存在n次修改,自动触发bgsave命令。
②优点
RDB是一个二进制文件,适用于备份、全量复制等场景,比如每6小时执行一次bgsave备份,保存速度快,还原速度快,
适用于容灾备份。
③缺点
无法做到实施持久化和秒级持久化。
④快照规则
save 900 1 //每900秒(15分钟)至少1个key发生变化,产生快照
save 300 10 //每300秒(5分钟)至少10个key发生变化,产生快照
save 60 10000 //每60秒(1分钟)至少10000个key发生变化,产生快照
(3)AOF
①介绍
在使用aof做持久化的时候,redis会将每一个收到的命令通过write写的方式来追加到文件中。当redis重启的时候,会去执行保存在redis文件中的内容。
②工作流程
1)所有的写入命令会追加到aof_buf(缓冲区)中。
2)AOF缓冲区根据对应的策略向硬盘做同步操作。
3)随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩
的目的。
4)当Redis服务器重启时,可以加载AOF文件进行数据恢复。
②持久化的方式
• appendonly yes //启用 aof 持久化方式
• # appendfsync always //收到写命令就立即写入磁盘,最慢,但是保证完全的持久化
• appendfsync everysec //每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中
• # appendfsync no //完全依赖 os,性能最好,持久化没保证
②优点
只要收到命令后,就会立刻被写入到文件中(默认是appendonly.aof),很大程度保障了数据的持久化,相比RDB来讲,断电,意外退出后,数据不会丢失。
③缺点
持久化的文件会越来越大,占硬盘,例如我们在调用incr test 100次的时候,文件必须全部保存100次命令,其中有99次命令是多余的。