Redis11-淘汰策略和持久化

239 阅读4分钟

淘汰策略和持久化

一、淘汰策略

(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次命令是多余的。