缓存使用的是内存资源,内存资源要用有限的服务器资源支撑更多的业务。
必须删除掉访问频率不高的缓存,为新的缓存腾出内存空间
页面置换算法
缓存技术对应到操作系统中,就是缓存页面的调度算法
在操作系统中,文件的读取会先分配一定的页面空间 Page
- 查询空间是否有该页面的缓存,如果有的话,则直接拿出来
- 否则就先查询,页面空间没有满,把新页面缓存起来
- 如果页面空间满了,删除部分页面
常见的过期策略
- FIFO (First In First Out, 先进先出)
根据缓存被存储的时间,离当前最远的数据优先被淘汰 - LRU (Least Recently Used, 最近最少使用)
根据最近被使用的时间,离当前最远的数据优先被淘汰 - LFU (Least Frequently Used, 最不经常使用)
在一段时间内,缓存数据被使用次数最少的会被淘汰
内存淘汰策略
当 Redis 节点分配的内存使用到达最大值以后,Redis 会启动内存淘汰策略
- noeviction:这时默认的策略,对于写请求会拒绝服务,直接返回错误,可以保证数据不丢失。
- allkeys-lru:这种策略操作的范围是所有 key,使用 LRU 算法进行缓冲淘汰。
- volatile-lru:这种策略操作的范围是设置了过期时间的 key,使用 LRU 算法进行淘汰。
- allkeys-random:这种策略操作的范围是设置了过期时间的key,会进行随机淘汰。
- volatile-random:这种策略操作的范围是设置了过期时间的 key,会进行随机淘汰。
- volatile-ttl:这种策略操作的范围是设置了过期时间的 key,根据 key 的过期时间进行淘汰,越早过期的越优先被淘汰。
缓存过期策略
- 内存淘汰是缓存服务层面的操作
- 过期策略是具体缓存数据何时失效
Redis 是 key-value 数据库,可以设置缓存 key 的过期时间
过期策略——当 Redis 中缓存的 key 过期了, Redis 如何处理
- 定时过期
为每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除
但需要耗费大量的 cpu 资源区处理过期的数据,可能影响缓存服务的性能 - 惰性过期
只有当访问一个 key 时,才会判断该 key 是否已过期,并且进行删除操作
极端情况下,缓存中出现大量的过期 key 无法被删除 - 定期过期
添加一个即将过期的缓存字典,每隔一定的时间,会扫描一定数量的key,并清除其中已过期的 key