Loading... # redis缓存LRU ## redis作为数据库/缓存的区别 - 缓存中的数据相对不重要 - 缓存中不是全量数据 - 缓存中的数据随着访问而变化 - 缓存中存放热数据 ## redis中key的有效期 - 有效期并不会随着访问而延长时间 - 发生写操作时,会剔除过期时间。 也就是说redis没有自动延长过期时间的概念,如果要对key的过期时间进行操作,需要自行补全业务。 ### redis如何淘汰过期的key redis淘汰过期的key有两种方式:被动和主动 - 被动:当key超时之后并不会删除,只有当客户端尝试访问它时,被发现并删除。 - 主动:redis每秒执行10次,随机抽取20个key做过期检测,删除过期的key,如果有多余25%的key过期,那么立即重复一次该过程。这意味着,在任何给定的时刻,最多会清除1/4的过期keys。 ## redis数据淘汰机制 内存是有限的,redis应该随着访问的变化,淘汰掉冷数据。 ``` vi /etc/redis/6379.conf ``` 打开配置文件 ``` maxmemory <bytes> # 最大占用内存 maxmemory-policy noeviction # 回收策略 ``` ### LRU与LFU - LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的数据 - LFU是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的数据 ### 回收策略 当内存使用达到maxmemory给定的大小之后,会执行maxmemory-policy配置的回收策略,主要有以下几种策略可供使用: - noeviction: 当内存达到限制并且客户端尝试调用会占用更多内存的命令的时候,直接返回错误(大部分的写入指令,但DEL和几个例外) - allkeys-lru: 尝试回收最少使用的key(LRU),使得新添加的数据有空间存放。 - volatile-lru: 尝试回收最少使用的key(LRU),但仅限于设置了过期时间集合中的key,使得新添加的数据有空间存放。 - allkeys-random: 随机删除key使得新添加的数据有空间存放。 - volatile-random: 随机删除key使得新添加的数据有空间存放,但仅限于设置了过期时间集合中的key。 - volatile-ttl: 回收设置了过期时间集合的key,并且优先回收存活时间(TTL)较短的key,使得新添加的数据有空间存放。 一般的经验规则: - allkeys-lru: 当redis中大部分数据都没设置过期时间时使用。 - volatile-lru: 当redis中大部分数据都设置了过期时间时使用。 优先使用allkeys-lru与volatile-lru,allkeys-random与volatile-random随机性过高,volatile-ttl性能开销相对较大。 Last modification:November 29th, 2019 at 06:49 pm © 允许规范转载