Redis 删除策略

文章目录

  • Redis 删除策略
    • 一、过期数据
    • 二、数据删除策略
      • 1、定时删除
      • 2、惰性删除
      • 3、定期删除
      • 4、删除策略对比
    • 三、逐出算法

Redis 删除策略

一、过期数据

Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态

  • XX :具有时效性的数据
  • -1 :永久有效的数据
  • -2 :已经过期的数据或被删除的数据或未定义的数据

问:过期的数据真的删除了吗?

**答:**不是的

二、数据删除策略

数据删除策略的目标

在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或内存泄露

  • 定时删除

  • 惰性删除

  • 定期删除

1、定时删除

  • 创建一个定时器,当 key 设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作
  • **优点:**节约内存,到时就删除,快速释放掉不必要的内存占用
  • **缺点:**CPU 压力很大,无论CPU 此时负载多高,均占用 CPU,会影响 redis 服务器响应时间和指令吞吐量
  • 总结:用处理器性能换取存储空间(拿时间换空间)

2、惰性删除

  • 数据到达过期时间,不做处理,等下次访问该数据时
    • 如果未过期,返回数据
    • 发现已过期,删除,返回不存在
  • **优点:**节约 CPU 性能,发现必须删除的时候才删除
  • **缺点:**内存压力很大,出现长期占用内存的数据
  • 总结:用存储空间换取处理器性能(拿空间换时间

3、定期删除

以上两种删除策略的折中策略

  • Redis 启动服务器初始化时,读取配置 server.hz 的值,默认为 10
  • 每秒钟执行server.hz次**serverCron()**中的方法—databasesCron()–activeExpireCycle()
  • activeExpireCycle() 对每个expires[]逐一进行检测,每次执行 250ms/server.hz
  • 对某个 expires[]检测时,随机挑选W个 key 检测
    • 如果 key 超时,删除 key
    • 如果一轮中删除的key的数量>W * 25%,循环该过程
    • 如果一轮中删除的key的数量≤W * 25%,检查下一个expires[*],0-15循环
    • W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值
  • 参数current_db用于记录activeExpireCycle() 进入哪个expires[*] 执行
  • 如果**activeExpireCycle()**执行时间到期,下次从current_db继续向下执行

在这里插入图片描述

**定期删除:**周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度

  • 优点1:CPU性能占用设置有峰值,检测频度可自定义设置
  • 优点2:内存压力不是很大,长期占用内存的冷数据会被持续清理
  • 总结:周期性抽查存储空间 (随机抽查,重点抽查)

4、删除策略对比

  1. 定时删除 节约内存,无占用 不分时段占用CPU资源,频度高 拿时间换空间
  2. 惰性删除 内存占用严重 延时执行,CPU利用率高 拿空间换时间
  3. 定期删除 内存定期随机清理 每秒花费固定的CPU资源维护内存 随机抽查,重点

三、逐出算法

当新数据进入redis时如果内存不足怎么办?

  • Redis使用内存存储数据,在执行每一个命令前,会调用freeMemoryIfNeeded()检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为逐出算法

  • 注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。

    抛出异常:(error) OOM command not allowed when used memory >'maxmemory

影响数据逐出的相关配置

  • maxmemory最大可使用内存

    占用物理内存的比例,默认值为0,表示不限制,生产环境中根据需求设定,通常设置在50%以上。

  • maxmemory-samples每次选取待删除数据的个数

    选取数据时并不会全库扫描,导致严重的性能消耗,降低读写性能。因此采用随机获取数据的方式作为待检测删除数据

  • maxmemory-policy删除策略

检测易失数据(可能会过期的数据集server.db[i].expires )

① volatile-lru:挑选最近最少使用的数据淘汰

② volatile-lfu:挑选最近使用次数最少的数据淘汰

③ volatile-ttl:挑选将要过期的数据淘汰

④ volatile-random:任意选择数据淘汰

检测全库数据(所有数据集****server.db[i].dict

⑤ allkeys-lru:挑选最近最少使用的数据淘汰

⑥ allkeys-lfu:挑选最近使用次数最少的数据淘汰

⑦ allkeys-random:任意选择数据淘汰

放弃数据驱逐

⑧ no-enviction(驱逐):禁止驱逐数据(

redis4.0中默认策略),会引发错误OOM(Out Of

Memory)达到最大内存后的,对被挑选出来的数据进行删除的策略

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/75123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【李自然说】在创业路演现场,3分钟打动投资人 (notebook)[Updating]

【李自然说】在创业路演现场,3分钟打动投资人_哔哩哔哩_bilibili 融资的核心问题(三分钟内讲清楚) - 竞争者做什么,我们做什么 (是否有,没有那潜在competitor是谁,有没有可能变成合作伙伴&#…

构建高效实时数据流水线:Flink、Kafka 和 CnosDB 的完美组合

当今的数据技术生态系统中,实时数据处理已经成为许多企业不可或缺的一部分。为了满足这种需求,Apache Flink、Apache Kafka和CnosDB等开源工具的结合应运而生,使得实时数据流的收集、处理和存储变得更加高效和可靠。本篇文章将介绍如何使用 F…

java的动态代理如何实现

一. JdkProxy jdkproxy动态代理必须基于接口(interface)实现 接口UserInterface.java public interface UserService {String getUserName(String userCde); }原始实现类:UseServiceImpl.java public class UserServiceImpl implements UserSerice {Overridepub…

举例说明PyTorch函数torch.cat与torch.stack的区别

一、torch.cat与torch.stack的区别 torch.cat用于在给定的维度上连接多个张量,它将这些张量沿着指定维度堆叠在一起。 torch.stack用于在新的维度上堆叠多个张量,它会创建一个新的维度,并将这些张量沿着这个新维度堆叠在一起。 二、torch.…

原生js之dom表单改变和鼠标常用事件

那么好,本次我们聊聊表单改变时如何利用onchange方法来触发input改变事件以及鼠标常用的滑入滑出,点击down和点击up事件. 关于onchange方法 onchange方法在鼠标输入完后点击任何非输入框位置时触发.触发时即可改变原有输入框的值. out 、leave、over、down、up鼠标方法 当用…

React refers to UMD global, but the current file is a module vite初始化react项目

vite搭建react项目 初始化项目 npm create vite 在执行完上面的命令后,npm 首先会自动下载create-vite这个第三方包,然后执行这个包中的项目初始化逻辑。输入项目名称之后按下回车,此时需要选择构建的前端框架: ✔ Project na…

932. 漂亮数组

932. 漂亮数组 原题链接:完成情况:解题思路:参考代码: 原题链接: 932. 漂亮数组 https://leetcode.cn/problems/beautiful-array/description/ 完成情况: 解题思路: nums 是由范围 [1, n] 的…

jmeter如何压测和存储

一、存储过程准备: 1、建立一个空表: 1 CREATE TABLE test_data ( id NUMBER, name VARCHAR2(50), age NUMBER ); 2、建立一个存储过程: CREATE OR REPLACE PROCEDURE insert_test_data(n IN NUMBER) ASBEGIN--EXECUTE IMMEDIATE trunca…

4个维度讲透ChatGPT技术原理,揭开ChatGPT神秘技术黑盒!(文末送书)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

浏览器进程,性能指标,性能优化

目录 浏览器进程:多进程 主进程:显示、交互,增删进程 UI进程:控制地址栏、书签、前进后退 存储进程:cookie,webstorage,indexDB 渲染进程:每个标签页或窗口都有一个独立的渲染进…

【深度学习】分类损失函数解析

【深度学习】分类相关的损失解析 文章目录 【深度学习】分类相关的损失解析1. 介绍2. 解析3. 代码示例 1. 介绍 在分类任务中,我们通常使用各种损失函数来衡量模型输出与真实标签之间的差异。有时候搞不清楚用什么,下面是几种常见的分类相关损失函数及其…

Boost搜索引擎

项目背景 先说一下什么是搜索引擎,很简单,就是我们平常使用的百度,我们把自己想要所有的内容输入进去,百度给我们返回相关的内容.百度一般给我们返回哪些内容呢?这里很简单,我们先来看一下. 搜索引擎基本原理 这里我们简单的说一下我们的搜索引擎的基本原理. 我们给服务器发…

Fast RCNN

【简介】 Fast RCNN[6]网络是RCNN和SPPNet的改进版,该网路使得我们可以在相同的网络配置下同时训练一个检测器和边框回归器。该网络首先输入图像,图像被传递到CNN中提取特征,并返回感兴趣的区域ROI,之后再ROI上运用ROI池化层以保证…

如何用Jmeter提取和引用Token

1.执行获取token接口 在结果树这里,使用$符号提取token值。 $根节点,$.data.token表示提取根节点下的data节点下的token节点的值。 2.使用json提取器,提取token 变量路径就是把在结果树提取的路径写上。 3.使用BeanShell取样器或者BeanShell后…

浅谈泛在电力物联网、能源互联网与虚拟电厂

导读:从能源互联网推进受阻,到泛在电力物联网名噪一时,到虚拟电厂再次走向火爆,能源领域亟需更进一步的数智化发展。如今,随着新型电力系统建设推进,虚拟电厂有望迎来快速发展。除了国网和南网公司下属的电…

常见排序算法

排序简介常见排序算法插入排序直接插入排序希尔排序 选择排序选择排序堆排序 交换排序冒泡排序快速排序hoare版挖坑法前后指针法非递归实现快排优化 归并排序非递归实现归并排序海量数据排序问题 基数排序(不用比较就能够排序)桶排序计数排序&#xff08…

常用消息中间件有哪些

RocketMQ 阿里开源,阿里参照kafka设计的,Java实现 能够保证严格的消息顺序 提供针对消息的过滤功能 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力 RabbitMQ Erlang实现,非常重量级,更适…

一百七十三、Flume——Flume写入HDFS后的诸多小文件问题

一、目的 在用Flume采集Kafka中的数据写入HDFS后,发现写入HDFS的不是每天一个文件,而是一个文件夹,里面有很多小文件,浪费namenode的宝贵资源 二、Flume的配置文件优化(参考了其他博文) (一&a…

OpenCV(二十四):可分离滤波

目录 1.可分离滤波的原理 2.可分离滤波函数sepFilter2D() 3.示例代码 1.可分离滤波的原理 可分离滤波的原理基于滤波器的可分离性。对于一个二维滤波器,如果它可以表示为水平方向和垂直方向两个一维滤波器的卷积,那么它就是可分离的。也就是说&#x…

无涯教程-JavaScript - DDB函数

描述 DDB函数使用双倍余额递减法或您指定的某些其他方法返回指定期间内资产的折旧。 语法 DDB (cost, salvage, life, period, [factor])争论 Argument描述Required/OptionalCostThe initial cost of the asset.RequiredSalvage 折旧结束时的价值(有时称为资产的残值)。 该…