【Redis】内存淘汰机制看这一篇就够了

官方数据表示Redis读的速度是110000次/s,写的速度是81000次/s ,由于redis是依赖物理内存的非关系型数据库,存在内存空间不够的情况,这个时候就要考虑淘汰删除部分无用数据。所以,虽然redis是单线程的,但限制redis发展的不是cpu而是内存
在这里插入图片描述

Redis过期键的删除策略
  • 定时删除,这个就是大家最熟悉的给Key设置过期时间,创建定时器,让定时器在过期时间到来时删除键和值
  • 惰性删除,指当客户端取键时才检查键是否过期,不主动删除过期的键
  • 定期删除,每隔一段时间检查数据库,删除过期的键
  • 定时删除+惰性删除

目前使用的策略
redis采用的是定期删除+惰性删除混合策略,至于为什么不单纯使用定时删除,那是因为用一个定时器监视key,过期自动删除,虽然实现了内存及时释放,但是这样的操作十分消耗CPU资源,高并发的情况下,CPU主要用来处理请求,而不是删除过期的key,所以没有只使用定时删除
定期删除的具体操作

  • 定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redis不是每个100ms将所有的key检查一,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。
Redis六种淘汰策略
策略 具体内容
noeviction 默认策略,不淘汰数据,内存满了之后,再增加数据报错
allkeys-lru 在所有键中,选取最近最少未使用的数据淘汰
allkeys-random 在所有键中,随机淘汰
volatile-lru 在设置了过期时间的所有键中,选取最近最少未使用的数据淘汰
volatile-random 在设置了过期时间的所有键中,随机淘汰
volatile-ttl 在设置了过期时间的所有键中,淘汰剩余时间最短的数据

redis4.0之后增加了两个策略

  • volatile-lfu:从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰
  • allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的 key

具体配置
在redis.conf中有一行配置

maxmemory-policy  volatile-lru

maxmemory-policy 后根据情况选择不同的淘汰策略

Redis LRU淘汰

LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。

LRU算法是一个近似算法,默认情况下,Redis会随机挑选5个键,并从中选择一个最久未使用的key进行淘汰。

猜你喜欢

转载自blog.csdn.net/yujing1314/article/details/106693803