Redis 缓存清理

2023-11-13

redis中,key过期后并不会马上删除,而是同时使用了 3 种策略来删除这些key

  • 惰性清除:访问key时,如果发现key已经过期,那么会将key删除

  • 定时清理:每次清理会依次遍历所有DB,从db随机取出20个key,如果过期就删除

  • 如果其中有5个key过期,那么就继续对这个db进行清理,否则开始清理下一个db

  • 内存不足:内存不够,采用LRU策略清除

1. LRU 介绍

redis在数据达到一定程度之后,就会将数据进行清理,默认采用的是LRU策略

  • LRU:Least Recently Used,最近最少使用算法

  • 将最近一段时间内,最少使用的一些数据,给干掉。

  • 比如说有一个key,在最近1个小时内,只被访问了一次; 还有一个key在最近1个小时内,被访问了1万次

  • 这时候就会清除只访问了一次的key

2. 缓存清理配置

在 redis.conf 中也可以进行配置

  • maxmemory:redis存放数据的最大内存,超出这个内存之后,就会立即使用LRU算法清理掉部分数据

  • 64 bit的机器,如果maxmemory设置为0,那么就默认不限制内存的使用,直到耗尽机器中所有的内存为止;

  • 32 bit的机器,有一个隐式的闲置就是3GB

  • maxmemory-policy:内存达到最大限制后,采取什么策略来处理

  • noeviction: 内存达到最大限制,client还要继续写入数据,直接报错给客户端

  • allkeys-lru: 就是我们说的LRU算法,移除掉最近最少使用的数据

  • allkeys-random: 随机选择一些key来删除掉

  • volatile-lru: 采取LRU算法,仅仅对设置了存活时间(TTL)的key才会清理掉

  • volatile-random: 随机选择一些设置了TTL的key来删除掉

  • volatile-ttl: 选择那些TTL时间比较短的key,益处

  • maxmemory_samples:随机选择的key的数量

3. Redis 的LRU算法

redis中使用的是LRU近似算法,也就是对keys进行采样,然后在采样结果中进行数据清理,之所以不使用 LRU 算法,是因为需要消耗大量的额外的内存

Redis 为实现近似 LRU 算法,它给每个 key 增加了一个额外的小字段,这个字段的长度是 24 个bit,也就是最后一次被访问的时间戳。

当 Redis 执行写操作时,发现内存超出 maxmemory,就会执行一次 LRU 淘汰算法。

  • 就是随机采样出 5 个key(通过maxmemory_samples配置) ,然后淘汰掉最旧的 key

  • 如果淘汰后内存还是超出 maxmemory,那就继续随机采样淘汰,直到内存低于 maxmemory 为止。

  • 采样:通过 maxmemory-policy 的配置

  • allkeys 就是从所有的 key 中随机

  • volatile 就从带过期时间的 key 中随机

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis 缓存清理 的相关文章

  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 如何在 Spring-JUnit 测试中设置 JNDI 查找?

    我正在使用 Maven 3 0 3 Spring 3 1 0 RELEASE 和 JUnit 4 8 1 如何在容器外部创建 JNDI 功能 在我的例子中是 JBoss 我认为 Spring 的 jndiTemplate 可以解决这个问题
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • Spring 3 匹配通配符严格,但找不到元素 'jee:jndi-lookup' 的声明

    所以我遇到了与这里类似的问题 Spring 3 0错误 匹配通配符严格 但找不到元素的声明 https stackoverflow com questions 8651781 spring 3 0 error the matching wi
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 有没有好的方法支持 Redis 排序集中的 pop 成员?

    有没有好的方法可以像 List 的 api LPOP 一样支持 Redis 排序集中的 pop 成员 我发现从 Redis 排序集中弹出消息是使用 ZRANGE ZREM 但是它不是线程安全性 并且当多个线程从不同主机同时访问它们时需要分布
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • c语言逐行存储到txt,c语言逐行读取txt文件数据

    我写的是linux下的程序 一个文件叫MYFILE里面是一行一行的写内容的 我可以使用fgets函数 1 函数名 fgets 2 声明 char fgets char buf int bufsize FILE stream 3 头文件 st
  • Android JNI2--C++基础

    1 基础结构 C 标准支持 include
  • MATLAB之极坐标绘图

    目标是要绘制一个二维的极坐标彩色图 输入参数有三个 一个是角度 一个是半径 一个是颜色 说到极坐标绘图 第一个想到的就是polar啦 那就先试试吧 1 polar绘图 polar函数用来绘制极坐标图 调用格式为 polar theta rh
  • 数据结构-最小生成树、prim算法、kruskal算法

    目录 最小生成树 Prim算法 普里姆 Kruskal算法 科普斯卡尔 prim算法的实现思想 Kruskal算法的实现思想 最小生成树 如果一个连通图本身就是一棵树 则其最小生成树就是它本身 只有连通图才有生成树 非连通图只有生成森林 P
  • telnet 使用教程(新手篇)及问题集锦

    telnet经常用于测试网络及端口占用情况 具体使用如下 测试端口命令 telnet host 端口 例 telnet 192 168 31 100 8081 连接失败表示端口未占用 否则表示被占用 如下 8080端口已占用 例 telne
  • RACI模型

    1 什么是RACI模型 释义 RACI是一个相对直观的模型 用以明确组织变革过程中的各个角色及其相关责任 我们知道 变革过程是不可能自发或者自动进行的 必须有人对其进行作用 促使进程发生变化 因而 就很有必要对谁做什么 以及促发什么样的变革
  • dracut 使用笔记

    dracut 维基 https dracut wiki kernel org index php Main Page dracut 官方手册 https www kernel org pub linux utils boot dracut
  • luaframework框架中将protobuf文件转成lua文件

    在luaframework框架中提供了通讯工具protobuf 需要将protobuf文件转成lua文件使用 按步骤来 1 下载并安装Python 我下载的版本是2 7 8 这个去Python官网下载即可 我的Python安装目录如图 2
  • Mybatis-plus 集合分页方法

    一 静态分页 1 POM引用
  • 使用matplotlib做动态排名图

    数据源 数据 过程 1 将数据进行持久化存储 先使用pandas的read csv函数从网页端直接读取数据 并筛选部分数据 url https gist githubusercontent com johnburnmurdoch 4199d
  • 【网页设计】HTML+CSS 实现简单宣传网页设计展示

    网站设计包含 1 图片设计 有背景图片和颜色 同时有一张图片悬浮 2 字体设计 设置字体大小 颜色等内容 3 按钮设计 完成点击按钮后弹出视频窗口的功能 4 视频窗口 视频窗口包括视频进度条 调节音量 窗口全屏 调节视频播放速度以及画中画等
  • NetworkManager和network

    一 NetworkManager做了什么 NetworkManager确保网络连接正常 当检测到系统中没有网络配置但有网络设备时 NetworkManager会创建临时连接以提供连接 通过不同的工具 GUI nmtui nmcli 提供管理
  • 操作系统 页面置换算法:LRU和FIFO

    LRU Least Recently Used 最少使用页面置换算法 顾名思义 就是替换掉最少使用的页面 FIFO first in first out 先进先出 页面置换算法 这是的最早出现的置换算法 该算法总是淘汰最先进入内存的页面 即
  • flutter Image图片控件-知识点

    图片是大家做项目中常用最大控件之一 本篇针对项目中经常用的功能 做些总结 ImageProvider 是一个抽象类 主要定义了图片数据获取的接口load 从不同的数据源获取图片需要实现不同的ImageProvider 如AssetImage
  • Linux搭建SVN服务器

    1 安装SVN 官网下载 http subversion apache org packages html SVN客户端 TortoiseSVN 官网下载 http tortoisesvn net downloads html yum in
  • SpringCloud——GateWay入门

    客户由发送请求由Nginx服务器已经将请求转发到一个服务器上 但是服务之前我们还需要一个网关将这些请求进一步加工处理到服务上 这一步就是GateWay GateWay 1 GateWay服务是不需要进入以下jar包
  • Java_synchronized的锁对象之对象锁和类锁

    具体知识学习与 https blog csdn net yansuoo article details 51248281 https www jianshu com p 6586d9f3b515 下面是自己的理解 代码 一 前置知识 jav
  • 设计模式-建造者模式

    建造者模式是一种创建型设计模式 它允许你创建复杂对象的不同表示 而无需直接与其构造函数参数进行交互 建造者模式将一个复杂对象的构建与其表示分离 使得同样的构建过程可以创建不同的表示 建造者模式的核心思想是将一个复杂对象的构建过程分解为多个简
  • web前端基础——第二章

    目录 十八 表格标签 1 table tr th td caption 等 2 语义化标签 thead tbody tfoot 十九 表格属性 二十 表单标签 二十一 表格表单组合 二十二 div 与 span 1 div 做一个区域划分的
  • Redis 缓存清理

    redis中 key过期后并不会马上删除 而是同时使用了 3 种策略来删除这些key 惰性清除 访问key时 如果发现key已经过期 那么会将key删除 定时清理 每次清理会依次遍历所有DB 从db随机取出20个key 如果过期就删除 如果