软考:缓存持久化和过期策略,淘汰策略

持久化:

RDC(把全量数据以二进制压缩文件的方式存储到磁盘文件),快照,体积小,性能更高(会fork一个子进程来处理保存操作)恢复更快。

AOF(每一个写命令都通过write函数追加到文件中,日志记录),近乎实时的方式把执行的每条数据变动命令进行追加存储到AOF的缓存区里面, 然后再把缓存的数据写入到磁盘的AOF文件里面。数据不会丢失,AOF文件写入性能很高,AOF文件不会影响客户端的读写,通过非常可读的方式记录,适合做灾难性的误删除的紧急恢复。比如某人不小心使用flushall命令清空了所以记录。

RDB的优缺点

优点:

适合做定时备份(冷备)

RDB的数据恢复快

缺点:

RDB无法做到实时持久化,若在两次bgsave间宕机,则会丢失区间(分钟级)的增量数据,不适用于实时性要求较高的场景

RDB的cow机制中,fork子进程属于重量级操作,并且会阻塞redis主进程(执行客户端命令的线程)

AOF的优缺点

优点:

AOF是近乎实时,一秒一次去通过一个后台的线程fsync操作,最多只会丢这一秒的数据,适合做实时备份(热备)

AOF只是追加写日志文件,对服务器性能影响较小,速度比RDB要快,消耗的内存较少

缺点:

AOF方式生成的日志文件太大,需要不断AOF重写,进行瘦身。

AOF重演命令式的恢复数据,速度显然比RDB要慢

redis的过期策略

1、定期删除

分为记录到期实际,到期就删除

另外一种是每间隔一段时间,检查key,删除过期的key

2、惰性删除

占内存,CPU友好

redis:支持上面两种方式的结合!!!

随机抽取一些设置了过期时间的key,检查是福哦过期,如果过期就删掉,可能导致很多过期的key到了时间并没有被删除。

Redis提供了8种淘汰策略

不淘汰

noeviction:不进行淘汰数据。一旦缓存被写满,再有写请求进来,Redis就不再提供服务,而是直接返回错误。

从全部数据中进行淘汰

allkeys-lru:在所有的键值对中,移除最近最少使用的键值对。

allkeys-lfu:在所有的键值对中,移除最近最不频繁使用的键值对。

allkeys-random:在所有键值对中,随机移除某个key。

从设置了过期时间的数据中进行淘汰

volatile-ttl:在设置了过期时间的键值对中,移除即将过期的键值对。

volatile-lru:在设置了过期时间的键值对中,移除最近最少使用的键值对。

volatile-lfu:在设置了过期时间的键值对中,移除最近最不频繁使用的键值对。

volatile-random:在设置了过期时间的键值对中,随机移除某个键值对。

策略推荐:

通常情况下推荐优先使用 allkeys-lru 策略。这样可以充分利用 LRU 这一经典缓存算法的优势,把最近最常访问的数据留在缓存中,提升应用的访问性能。

如果你的业务数据中有明显的冷热数据区分,建议使用 allkeys-lru 策略。

如果业务应用中的数据访问频率相差不大,没有明显的冷热数据区分,建议使用 allkeys-random 策略,随机选择淘汰的数据就行。

如果没有设置过期时间的键值对,那么 volatile-lru,volatile-lfu,volatile-random 和 volatile-ttl 策略的行为, 和 noeviction基本上一致。

相关推荐
楚识科技7 分钟前
XML配置OCR接入实战:自定义OCR模板从字段定义到API调用全流程
xml·java·ocr
ESDWAN20 分钟前
跨境网络频繁掉线怎么排查?从企业内网到 SD-WAN 链路的故障诊断
开发语言·网络·php
程序员zgh37 分钟前
C++ erase() 函数用法
c语言·开发语言·c++·学习
小蒜学长1 小时前
基于Java的公司采购系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·公司采购系统
lee_tianbai1 小时前
Java SSM 电影票预定系统|完整前后端项目,开箱即用(源码分享)
java·开发语言·数据库
小坏讲微服务1 小时前
Spring Boot 4 新特性全解析:从上手到生产实战
java·spring boot·后端·架构·springboot4
砚底藏山河1 小时前
python量化入门:多周期数据对齐统一时间轴
java·数据库·python·金融·maven
集智飞行1 小时前
解决mavros2 ros2版本cpu占用高的问题
java·服务器·前端
迪丽热爱2 小时前
一、C语言概述与程序结构
c语言·开发语言·算法
禾小西2 小时前
05丨Redis 内存快照:宕机后,如何实现快速恢复?
数据库·redis·缓存