Redis 过期策略和内存淘汰策略

ops/2024/11/27 2:36:52/

一、过期策略

我们在set key的时候,可以给它设置一个过期时间,比如expire key 60。指定这key60s后过期,60s后,redis是如何处理的?

  1. 定时删除(Active Expiration)
    • 原理:Redis会在后台周期性地检查并删除已过期的键。
    • 实现:Redis的服务器进程会定期(默认每100毫秒)运行一个过期键清理任务。这个任务会随机选择一部分数据库,检查这些数据库中的键是否已过期,如果过期则删除。
    • 优点:可以及时删除过期键,释放内存。
    • 缺点:如果过期键非常多,可能会导致CPU负担加重。
  1. 惰性删除(Lazy Expiration)
    • 原理:当客户端尝试访问一个键时,Redis会检查该键是否已过期,如果已过期则删除该键。
    • 实现:每次访问键时,Redis都会检查该键的过期时间。如果键已过期,则删除该键并返回相应的错误信息。
    • 优点:不会在后台占用额外的CPU资源。
    • 缺点:过期键可能在一段时间内仍然占用内存,直到被访问时才会被删除。

Redis实际上结合了定时删除和惰性删除两种策略,以达到最佳的性能和资源利用率。具体来说:

  • 定时删除:定期检查并删除过期键,确保大部分过期键能够及时被清理。
  • 惰性删除:在客户端访问键时,检查并删除过期键,确保不会出现访问到已过期键的情况。

二、内存淘汰策略

当Redis的内存使用达到配置的最大限制时,Redis会根据配置的内存淘汰策略来决定如何释放内存。内存淘汰策略的目的是在内存不足时,尽量保留重要的数据,避免系统崩溃。

  1. noeviction(默认策略)
    • 描述:当内存使用达到上限时,新的写入操作会被拒绝,返回错误信息。
    • 适用场景:适用于不允许数据丢失的场景。
  1. allkeys-lru
    • 描述:当内存使用达到上限时,优先删除最近最少使用的键(Least Recently Used, LRU)。
    • 适用场景:适用于缓存场景,希望保留最近经常访问的数据。
  1. volatile-lru
    • 描述:当内存使用达到上限时,优先删除设置了过期时间的键中最近最少使用的键。
    • 适用场景:适用于缓存场景,且希望优先保留未设置过期时间的数据。
  1. allkeys-lfu
    • 描述:当内存使用达到上限时,优先删除最近最少频繁使用的键(Least Frequently Used, LFU)。
    • 适用场景:适用于缓存场景,希望保留最近频繁访问的数据。
  1. volatile-lfu
    • 描述:当内存使用达到上限时,优先删除设置了过期时间的键中最近最少频繁使用的键。
    • 适用场景:适用于缓存场景,且希望优先保留未设置过期时间的数据。
  1. allkeys-random
    • 描述:当内存使用达到上限时,随机删除键。
    • 适用场景:适用于对数据一致性要求不高的场景。
  1. volatile-random
    • 描述:当内存使用达到上限时,随机删除设置了过期时间的键。
    • 适用场景:适用于对数据一致性要求不高的场景,且希望优先保留未设置过期时间的数据。
  1. volatile-ttl
    • 描述:当内存使用达到上限时,优先删除设置了过期时间且过期时间最近的键。
    • 适用场景:适用于缓存场景,希望尽快释放即将过期的数据。

这里只要记住默认的策略和最近最少使用和最少频率使用和随机删除即可,无非就是所有key和设置了过期时间的可以的区别

三、总结

  • 过期策略:Redis通过定时删除和惰性删除相结合的方式来处理过期键,确保数据的时效性,同时尽量减少对性能的影响。
  • 内存淘汰策略:当内存使用达到上限时,Redis会根据配置的策略来释放内存,确保系统的稳定运行。常见的策略包括LRU、LFU、随机删除等,适用于不同的应用场景。

通过合理配置这些策略,可以有效地管理和优化Redis的内存使用,确保系统的高性能和稳定性。


http://www.ppmy.cn/ops/136970.html

相关文章

java学习记录12

ArrayList方法总结 构造方法 ArrayList() 构造一个初始容量为 10 的空列表。 ArrayList(int initialCapacity) 构造一个具有指定初始容量的空列表。 实例方法 add(int index, E element) 在此list中的指定位置插入指定元素。 ArrayList<Integer> array…

神经网络问题之:梯度不稳定

梯度不稳定是深度学习中&#xff0c;特别是在训练深度神经网络时常见的一个问题&#xff0c;其本质涉及多个方面。 一、根本原因 梯度不稳定问题的根本原因在于深度神经网络的结构和训练过程中的一些固有特性。随着网络层数的增加&#xff0c;梯度在反向传播过程中会逐层累积变…

《Spring Cloud 微服务》

一、引言 在现代软件开发中&#xff0c;微服务架构已成为主流趋势。Spring Cloud 作为构建微服务架构的强大工具集&#xff0c;提供了一系列组件和解决方案&#xff0c;帮助开发者轻松构建、部署和管理分布式系统。本文将深入介绍 Spring Cloud 的核心概念、主要组件、工作原理…

python画图|无坐标轴自由划线操作fig.add_artist(lines.Line2D()函数

【1】引言 新发现了一种自由划线操作函数&#xff0c;和大家共享。 【2】官网教程 点击下述代码&#xff0c;直达官网&#xff1a; https://matplotlib.org/stable/gallery/misc/fig_x.html#sphx-glr-gallery-misc-fig-x-py 官网代码非常简洁&#xff0c;我进行了解读。 …

fingerprint.js的使用

FingerprintJS 是一个基于 JavaScript 的浏览器指纹识别库&#xff0c;可以通过收集浏览器和设备的多个属性来生成一个独一无二的指纹&#xff08;即一个用户的唯一标识符&#xff09;。这个库的常见用途包括防止欺诈、识别重复用户、分析流量等。 安装 FingerprintJS 1. 通过…

【机器学习】近似分布的熵到底是p(x)lnq(x)还是q(x)lnq(x)?

【1】通信的定义 信息量&#xff08;Information Content&#xff09;是信息论中的一个核心概念&#xff0c;用于定量描述一个事件发生时所提供的“信息”的多少。它通常用随机变量 &#x1d465;的概率分布来定义。事件 &#x1d465;发生所携带的信息量由公式给出&#xff1…

10、PyTorch autograd使用教程

文章目录 1. 相关思考2. 矩阵求导3. 两种方法求jacobian 1. 相关思考 2. 矩阵求导 假设我们有如下向量&#xff1a; y 1 3 x 1 5 [ w T ] 5 3 b 1 3 \begin{equation} y_{1\times3}x_{1\times5}[w^T]_{5\times3}b_{1\times3} \end{equation} y13​x15​[wT]53​b13​​…

在 ARM 平台上如何实现Linux系统的1秒启动

在ARM平台上实现Linux系统的1秒启动&#xff0c;是一项涉及深层次优化的挑战。这不仅需要对系统的各个层面进行精细调整&#xff0c;还需要确保在保持系统稳定性的同时&#xff0c;实现快速启动。以下是实现这一目标的关键步骤和优化工作&#xff1a; 1. 精简U-Boot启动过程 …