大家好,又见面了,我是你们的朋友全栈君。
过期删除策略
redis可以对key的通用设置中,可以设置key的过期时间及ttl
如果单纯的再client中进行命令测试的话,会发现了当时间到时间后
再去获取该key会显示nil
那么一个key过期了,那么它实际是在什么时候删除的呢?
当然这个删除也不是简单的到期了就直接被删除了
redis中对于过期键的过期删除策略
- 定时删除
- 惰性删除
- 定期删除
定时删除
它会在设置键的过期时间的同时,创建一个定时器, 当键到了过期时间,定时器会立即对键进行删除。 这个策略能够保证过期键的尽快删除,快速释放内存空间。
但是有得必有失,redis的操作频率是非常高的。绝大多数的键都是携带过期时间的,这样就会造成出现大量的定时器执行,严重降低系统性能
总的来说:该策略对内存来说十分的友好,但对cpu来说非常不友好,会拉低系统的性能,因此不建议使用
惰性删除
为了解决定时删除会占用大量CPU资源的问题, 因此产生了惰性删除。
它不持续关注key的过期时间, 而是在获取key时,才会检查key是否过期,如果过期则删除该key。简单来说就是:平时我不关注你,我用到你了,我才关注你在不在。
总的来说:惰性删除对CPU足够友好,但是对内存空间非常不友好,会造成大量内存空间的浪费。
定期删除
定期删除,顾名思义,就是每隔一段时间进行一次删除
- 如果删除操作执行次数过多、执行时间太长,就会导致和定时删除同样的问题:占用大量cpu资源去进行删除操作
- 如果删除操作次数太少、执行时间短,就会导致和惰性删除同样的问题:内存资源被持续占用,得不到释放。
所以定时删除最关键的就在于执行时长和频率的设置
- 默认每秒运行10次会对具有过期时间的key进行一次扫描,但是并不会扫描全部的key,因为这样会大大延长扫描时间。
- 每次默认只会随机扫描20个key,同时删除这20个key中已经过期的key。
- 如果这20个key中过期key的比例达超过25%,则继续扫描。
参数配置
默认每秒扫描10次,我们可以在redis的配置文件中进行更改
对于hz参数,官方不建议超过100,否则会把cpu造成比较大的压力
内存淘汰策略
为什么需要内存淘汰策略
可以思考两个问题
- 通过惰性+定期删除,能不能百分百避免过期key没有被删除的情况?
- 当大量插入插入到redis,但内存空间不足时,redis会如何处理呢?
有一些已经过期的key,定期扫描一直都没有扫描到它,而且这些key也一直没有被使用。 那么它们就会一直在内存中存在。同时继续向Redis不断插入新数据,最终造成内存空间不足的问题。
对于这种问题的解决,就用到了内存淘汰策略。
策略详解
当客户端执行命令,添加数据时,Redis会检查内存空间大小,如超过最大内存,则触发内存淘汰策略。
在Redis中默认提供了三类八种淘汰策略。
这里我们可以看到两个名称:lru、lfu,他俩是什么意思呢?
他们的学名叫做:数据驱逐策略。 其实所谓的驱逐就是将数据从内存中删除掉。
- lru:Least Recently Used,它是以时间为基准,删除最近最久未被使用的key。
- lfu:Least Frequently Used,它是以频次为基准,删除最近最少未被使用的key。
redis默认使用noeviction,我们可以通过修改redis.conf中maxmemory-policy属性值设置不同的内存淘汰策略。
不同策略的使用场景
1、Redis只做缓存,不做DB持久化,使用allkeys。如状态性信息,经常被访问,但数据库不会修改。
2、同时用于缓存和DB持久化,使用volatile。如商品详情页。
3、存在冷热数据区分,则选择LRU或LFU。如热点新闻,热搜话题等。
4、每个key被访问概率基本相同,选择使用random。如企业内部系统,访问量不大,删除谁对数据库也造成太大压力。
5、根据超时时间长久淘汰数据,选择选用ttl。如微信过期好友请求。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/127819.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...