当前位置: 首页 > news >正文

Redis过期清理策略和内存淘汰机制

目录

    • Redis过期清理策略
    • Redis内存淘汰机制

Redis过期清理策略

Redis 通过设置键的过期时间来实现自动删除过期键。当键的过期时间到达时,Redis 会自动将该键删除。Redis 过期清理策略主要有以下两种:

  1. 惰性删除:Redis 在获取键时会检查键是否过期,如果过期则删除。惰性删除可以确保了过期键不会被返回给客户端,但是可能导致内存占用较高,因为不会主动回收过期键的内存空间。在惰性删除策略下,如果过期键一直没有被访问,那么它将永远不会被删除。所以Redis还有下面一种清理策略

  2. 定期删除:当一个key设置了过期时间之后,Redis会将这个key放入一个过期字典中,并设置对应的过期时间。然后,Redis会启动一个定时器,定时检查过期字典是否有过期的key。如果有,Redis会将这个key从数据中删除。这种策略可以保证内存被尽快释放,但在CPU时间紧张的情况下,可能需要花时间去删除这些key

Redis 定时扫描策略

Redis 默认会每秒进行十次过期扫描,过期扫描不会遍历过期字典中所有的 key,而是
采用了一种简单的贪心策略。

  1. 从过期字典中随机 20 个 key;
  2. 删除这 20 个 key 中已经过期的 key;
  3. 如果过期的 key 比率超过 1/4,那就重复步骤 1;

同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时
间的上限,默认不会超过 25ms。

Redis内存淘汰机制

当已用内存超过maxmemory限定时,Redis会触发内存淘汰机制。内存淘汰机制包括对设置了过期时间的key进行处理的几种方式,如volatile-ttl(根据过期时间的先后进行删除,越早过期的越先被删除)、volatile-random(随机删除设置了过期时间的键值对)等。

maxmemory配置指定了Redis可以使用的内存,你可以在redis.conf文件进行设置

例如,要配置100兆的内存限制,可以在redis.conf文件中添加以下指令:

maxmemory 100 mb

以下是Redis的内存淘汰机制的几种策略:

  1. noeviction:这是默认策略,当内存不足以容纳新写入数据时,新写入操作会报错,无法写入新数据。
  2. allkeys-random:在所有键中,随机选择并删除数据。
  3. volatile-random:在设置了过期时间的键中,随机选择并删除数据。
  4. volatile-ttl:在设置了过期时间的键中,优先删除剩余生存时间最短的键值对。
  5. allkeys-lru:在所有键中,删除最近最少使用的键。
  6. volatile-lru:在设置了过期时间的键中,删除最近最少使用的键。
  7. allkeys-lfu:在所有键中,删除最不经常使用(访问次数最少)的键。
  8. volatile-lfu:在设置了过期时间的键中,删除最不经常使用访问次数最少)的键。

注:LFU(Least Frequently Used)策略是在Redis 4.0版本开始加入的

内存淘汰策略设置

内存淘汰策略可以通过maxmemory-policy参数进行设置

我们可以打开 Redis 配置文件 redis.conf,在配置文件中找到 maxmemory-policy 参数,根据你的需求,选择一个合适的策略,并将其设置为对应的值。

例如,如果要使用 LFU 策略,可以将 maxmemory-policy 设置为 volatile-lfu 或 allkeys-lfu。

如果我们使用的是lru或者lfu策略,那么还有一个参数需要我们了解,那就是maxmemory-samples 参数

maxmemory-samples 参数用于设置 Redis 在执行 LFU(Least Frequently Used)和 LRU(Least Recently Used)淘汰策略时所使用的样本数目。

LFU 和 LRU 策略都需要通过近期访问记录来判断键的热度。为了减少计算开销,Redis 会对一部分键进行采样,然后根据这些样本来估计键的访问频率或访问时间。maxmemory-samples 参数指定了采样的样本数目。

较小的样本数目可以减少采样的计算开销,但可能导致对键的访问频率或访问时间估计不准确。而较大的样本数目可以提高估计的准确性,但会增加计算开销。

默认情况下,maxmemory-samples 参数的值为 5。你可以根据实际情况进行调整。通常来说,如果 Redis 实例的键数量很大,适当增加 maxmemory-samples 的值可能会更好地捕捉键的热度变化。

http://www.lryc.cn/news/277536.html

相关文章:

  • 2_并发编程同步锁(synchronized)
  • Python 常用模块pickle
  • CentOS 6 制作openssh 9.6 p1 rpm包(含ssh-copy-id、openssl) —— 筑梦之路
  • Tomcat Notes: Deployment File
  • 某邦通信股份有限公司IP网络对讲广播系统挖矿检测脚本
  • uniapp点击跳转传对象
  • 简单用PHP实现微信小程序的游戏功能
  • 某查查请求头参数加密分析(含JS加密算法与Python爬虫源码)
  • 免费用chatGPT
  • 还不会python 实现常用的数据编码和对称加密?看这篇文章就够啦~
  • 简易实现 MyBatis 底层机制
  • PhpPythonC++圆类的实现(OOP)
  • OpenSSL升级版本
  • 基于sprinmgboot实习管理系统源码和论文
  • 图像分类任务的可视化脚本,生成类别json字典文件
  • Adding Conditional Control to Text-to-Image Diffusion Models——【代码复现】
  • java-Exchanger详解
  • ‘再战千问:启程你的提升之旅‘,如何更好地提问?
  • java SSM社区文化服务管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
  • go执行静态二进制文件和执行动态库文件
  • 通过示例解释序列化和反序列化-Java
  • k8s源码阅读环境配置
  • Java JDBC整合(概述,搭建,PreparedStatement和Statement,结果集处理)
  • Nginx 负载均衡集群 节点健康检查
  • uniapp 多轴图,双轴图,指定哪几个数据在哪个轴上显示
  • Kotlin 协程 supervisorScope {} 运行崩溃解决
  • 【Spring 篇】JdbcTemplate:轻松驾驭数据库的魔法工具
  • Web开发SpringBoot SpringMVC Spring的学习笔记(包含开发常用工具类)
  • 微服务下的SpringSecurity认证端
  • 苹果电脑菜单栏应用管理软件Bartender 4 mac软件特点