当前位置: 首页 > 后端技术 > PHP

面试官:你是如何清理Redis中的过期键的?

时间:2023-03-29 20:31:22 PHP

rediskey清理,即内存回收,主要分为过期删除策略和内存淘汰策略两部分。过期删除策略在达到过期时间时删除密钥。第一种方式:定期检查和删除每个key都会创建一个定时器,设置过期时间,一旦达到过期时间就会删除。这种方式立即清除过期数据,对内存比较好,但缺点是处理过期数据会占用大量CPU资源,会影响redis的吞吐量和响应时间。第二种:懒查删。当访问一个key时,会判断这个key是否过期,如果过期则删除。这种方式可以最大程度的节省CPU资源。但是,这对记忆力不是很好。有一种极端情况:大量过期的key没有被再次访问,因为不会被清除,导致占用大量内存。第三种方法:每隔一段时间定时查删,扫描redis中过期键的字典,清除一些过期键。这种方法是前两种方法的折衷。针对不同情况,调整定时扫描间隔,优化CPU和内存。内存淘汰策略redis内存淘汰策略是指当达到maxmemory限制时,通过一定的算法来决定清理哪些数据,以保证有新的数据被存储。第一种不处理,等待错误(默认配置)noeviction,当发现内存不够时,不会删除key,执行write命令时直接返回错误信息。(Redis默认配置是noeviction)第二种从结果集中的所有keyselect,eliminationallkeys-random,即从所有key中随机选择key,eliminationallkeys-lru,选择最近使用的timefromallkeys剔除距离当前allkeys最远的keys-lfu是从所有keys中选择使用频率最低的key并剔除。(这是Redis4.0之后新增的策略。)第三类从设置过期时间的key中进行选择,淘汰。这是从结果集中选出一部分设置了expires过期时间的key进行淘汰。选择算法是:volatile-random随机选择要从结果集中删除的键,并设置过期时间。volatile-lru从设置过期时间的结果集中选择距离上次使用时间最长的key开始删除volatile-ttl从设置过期时间的结果集中选择存活时间最短的key开始删除(即从哪些key中先删除过期的key)volatile-lfu从过期时间的结果集中选择使用频率最低的key开始删除(这是Redis4.0版本后新增的策略)更多好文,公众号持续更新中