redis key键过期删除策略及淘汰机制探究

 更新时间:2023年11月16日 10:57:56   作者:bug生产者  
这篇文章主要为大家介绍了redis key键过期删除策略及淘汰机制探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

redis过期删除

redis的键可以设置过期时间,但是并不是每个键一到过期时间就会立即删除,redis不可能给每个设置过期时间的key上添加一个定时器来监视是否过期,CPU根本承受不了如此多的定时线程

注意:我使用的版本是6.0.10,不同版本可能略有差别

删除策略

存在的删除策略:

  • 定时删除 在设置键的同时创建定时器,过期时间到了就执行对键的删除,这种策略对内存使用率有优势,但是占用CPU资源太多
  • 定期删除 每隔特定时间对数据库进行一次扫描,检测并删除其中过期的键值对
  • 惰性删除 键值对过期暂时不进行删除,当获取键时先查看是否已经过期,过期则进行删除,这种策略可能会由于一些过期key一直没有被访问,浪费一定的内存

redis采用的策略是定期删除+惰性删除

定期删除是指每隔一段时间去检查是否有过期的key,如果有则删除

惰性删除是指在获取key的时候检查一下这个key是否过期

定期删除的配置是hz(默认是10,即每秒十次扫描)

首先客户端在尝试访问某个key的时候,redis会检查是否过期,如果过期则删除,但是有些key是不会被访问到的,redis的定期删除则会进行扫描并删除过期的key

  • 从过期字典里随机抽取20个key
  • 删除这20个key中已经过期的key
  • 如果过期的比例超过25%,则重复步骤一

过期的key过多会导致循环抽取删除,为防止过度循环,增加了扫描时间的上限,默认不超过25ms

应该避免同一时刻大量key同时过期

在主从结构中,从服务器就算读取到过期键也不会删除,只有接收到主服务器发来的del命令之后才会删除

淘汰机制

配置最大内存的大小,如果超过该内存大小,就会使用淘汰机制进行淘汰

maxmemory 100mb

也可以通过命令进行修改

127.0.0.1:6380> config set maxmemory 50mb
OK
127.0.0.1:6380> config get maxmemory
1) "maxmemory"
2) "52428800"

由于使用定期删除+惰性删除机制,但是也可能很多过期的没有被删除掉导致内存不足的情况,所以redis存在淘汰机制

  • volatile-lru -> Evict using approximated LRU, only keys with an expire set 当内存不足时,设置了过期时间的键,选取最近最少使用的键抛弃(Least Recently Used)
  • allkeys-lru -> Evict any key using approximated LRU 当内存不足时,对于所有的键,选取最近最少使用的键抛弃(Least Recently Used)
  • volatile-lfu -> Evict using approximated LFU, only keys with an expire set 当内存不足时,设置了过期时间的键,选取最少频率使用的键抛弃(Least Frequently Used)
  • allkeys-lfu -> Evict any key using approximated LFU 当内存不足时,对于所有的键,选取最少频率使用的键抛弃(Least Frequently Used)
  • volatile-random -> Remove a random key having an expire set 当内存不足时,对于设置过期时间的键,随机选取键抛弃
  • allkeys-random -> Remove a random key, any key 当内存不足时,对于所有的键,随机选取键抛弃
  • volatile-ttl -> Remove the key with the nearest expire time (minor TTL) 当内存不足时,抛弃最近要过期的键
  • noeviction -> Don't evict anything, just return an error on write operations 默认策略,不淘汰,如果内存已满,写操作返回错误

在使用volatile-lfu、volatile-random、volatile-ttl时,如果没有key可以淘汰,则与noeviction一样在写操作时返回错误

获取当前的内存策略

config get maxmemory-policy

可以在配置文件修改

maxmemory-policy noeviction

也可以使用命令设置

config set maxmemory-policy noeviction

在进行LRU/LFU/TTL淘汰策略时,并不是那么准确,可以通过采样率来进行设置其准确度,默认是5,即随机选出5个key,然后淘汰掉里面最近最少使用的key。

当设置为10的时候就非常接近真正的LRU算法了,但是会消耗更多的CPU,5已经是足够好的结果了

maxmemory-samples 5

以上就是redis key键过期删除策略及淘汰机制探究的详细内容,更多关于redis key键过期删除的资料请关注脚本之家其它相关文章!

相关文章

  • Redis的双写问题解决

    Redis的双写问题解决

    本文主要介绍了Redis的双写问题解决,这种问题在使用 Redis 作为缓存层时尤为常见,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Redis妙用之存储用户token问题

    Redis妙用之存储用户token问题

    这篇文章主要介绍了Redis妙用之存储用户token问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Redis事务处理的使用操作方法

    Redis事务处理的使用操作方法

    Redis保证一个事务中的所有命令要么都执行,要么都不执行(原子性),如果客户端发送了EXEC命令,所有的命令就都会被执行,即使此后客户端断线也没关系,因为Redis中已经记录了所有要执行的命令,下面通过本文给大家介绍Redis事务处理的使用操作,感兴趣的朋友一起看看吧
    2021-10-10
  • redis做websocket分布式消息推送服务的实现

    redis做websocket分布式消息推送服务的实现

    本文介绍了使用Redis作为消息队列实现WebSocket分布式消息推送服务的方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • 深入解析RedisJSON之如何在Redis中直接处理JSON数据

    深入解析RedisJSON之如何在Redis中直接处理JSON数据

    JSON已经成为现代应用程序之间数据传输的通用格式,然而,传统的关系型数据库在处理JSON数据时可能会遇到性能瓶颈,本文将详细介绍RedisJSON的工作原理、关键操作、性能优势以及使用场景,感兴趣的朋友一起看看吧
    2024-05-05
  • redis如何查看锁是否存在

    redis如何查看锁是否存在

    文章介绍了两种方法来检查Redis锁的状态:使用GET命令查看锁的值和使用EXISTS命令检查锁的存在性,这两种方法都是通过连接到Redis服务器并执行相应的命令来实现的,GET命令用于获取指定键的值,而EXISTS命令用于检查指定键是否存在
    2025-01-01
  • SpringBoot整合Mybatis-plus和Redis实现投票功能

    SpringBoot整合Mybatis-plus和Redis实现投票功能

    投票功能是一个非常常见的Web应用场景,这篇文章将为大家介绍一下如何将Redis和Mybatis-plus整合到SpringBoot中,实现投票功能,感兴趣的可以了解一下
    2023-05-05
  • Redis和数据库 数据同步问题的解决

    Redis和数据库 数据同步问题的解决

    这篇文章主要介绍了Redis和数据库 数据同步问题的解决操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Windows环境下打开Redis闪退的解决方案

    Windows环境下打开Redis闪退的解决方案

    每次使用完Redis后,我们习惯性的动作是直接叉掉doc页面,这样导致的结果是Redis在后台继续运行,没有关闭,所以当再次打开的时候直接闪退,文中有详细的解决方案,需要的朋友可以参考下
    2024-03-03
  • 关于Redis未授权访问的问题

    关于Redis未授权访问的问题

    这篇文章主要介绍了Redis未授权访问的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07

最新评论