Reis过期删除策略

介绍

在Redis中,我们可以为键值对设置有效期,现在面临一个问题,如果一个键值对过期了,那么我们应该怎么删除呢?
我们目前有三种方案:

  • 定时删除:在设置键的过期时间的同时,为此键设置一个定时器timer,定时器在键的过期时间来临时,立即自动执行键的删除。
  • 惰性删除:放任键不管,但是每次从获取该键时,都会检查此时的键是否过期,如果过期,则此时删除此键;如果没有过期,则返回。
  • 定期删除:每隔一段时间,程序对数据库中所有的键检查一次,删除过期的键。

定时删除和定期删除是主动删除,而惰性删除是被动删除
接下来说一说这三种删除策略的特点,以及在Redis中是如何进行过期键删除的。

定时删除

优点:
定时删除对内存友好,通过使用定时器,可以保证过期键会立即尽可能地被删除,释放所占用的内存

缺点:
对CPU不友好,因为为每一个键都创建了一个定时器,那么键非常的情况下,定时器会占用过多CPU资源
除此之外,在Redis中,创建一个定时器还需要用到Redis中的时间事件,而对于时间事件的实现方式是无序列表,查找一个事件的时间复杂度是O(N),效率低,并不能高效地处理大量键过期删除。

惰性删除

优点:
对CPU支持友好
对键的删除并不会占用过多的CPU资源,而是随着键的访问才会对键进行过期检查。

缺点:
对内存不友好
一个键已经过期了,但是还驻留在内存中,那么只要这个键值对不删除,那么就会一直占用内存,可能会导致内存泄漏问题。

定期删除

先总结前两种策略:

  • 定时删除占用太多的CPU资源,响应服务器的响应时间和吞吐量
  • 惰性删除浪费太多内存,有内存泄漏的风险。
    定期删除是对前两种策略的整合和折中:
  • 定期删除策略每隔一段时间执行一次删除操作,并且可以通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响。
  • 定期删除每个一段时间就会对键进行检查,在短时间内不会有过多过期键堆积的问题。有效减少了内存浪费问题。

使用定期删除策略还需要考虑以下几个问题:

  • 如果删除操作太频繁,或单次的时间太长,就会导致浪费CPU资源
  • 如果删除操作执行次数太少,或单次执行的时间太短,导致不能一次性全部删除过期的键值对,内存中还会存在大量的过期键值对。
    所以,必须根据服务器性能,合理调整这两个参数。

Redis中过期删除策略

Redis并没有定时删除的策略,实际使用的是惰性删除和定期删除两种策略,这两种策略配合使用,Redis可以合理地利用CPU和避免内存浪费之间取得平衡。

惰性删除的实现

Redis中惰性删除策略是由一个函数实现的,所有读写数据库的Redis命令在执行之前都会调用这个函数进行过期检查

  • 如果过期则删除
  • 如果未过期,则不做任何操作,放行这次的命令

大致的流程:
请添加图片描述

定期删除策略的实现

定期删除策略在Redis中也是由一个函数实现的,Redis会周期性执行该函数,随机检查一部分key是否过期,并删除过期的键。
在规定时间内,此操作分多次执行,每次都会随机检查一部分key,过期则删除,随着多次执行,数据库中所有key都会被检查一遍

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

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

相关文章

小游戏扫雷实现教学(详解)

目录 【前言】 一、模块化程序设计(多文件编程)介绍 1.概述 2.传统编程的方式 3.模块化程序设计的方法 二、扫雷代码设计思路 三、扫雷代码设计 1.创建菜单函数 2.实现9x9扫雷 3.初始化棋盘 4.打印棋盘 5.随机布置雷的位置 6.排查雷的信息 7.回…

【Apollo】推动创新:探索阿波罗自动驾驶的进步(含安装 Apollo的详细教程)

前言 Apollo (阿波罗)是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。 开放能力、共享资源、加速创新、持续共赢是 Apollo 开放平台的口号。百度把自己所拥有的强大、…

2023年7月京东冰箱行业品牌销售排行榜(京东运营数据分析)

作为日常使用的大家电之一,如今我国冰箱产业已渐趋饱满,市场增长有限。今年上半年,冰箱市场整体销额同比去年来看勉强保持小幅增长。不过,7月份,冰箱大盘的销售表现就略显萧条了。 根据鲸参谋电商数据分析平台的相关数…

NPM与外部服务的集成(下)

目录 1、撤消访问令牌 2、在CI/CD工作流中使用私有包 2.1 创建新的访问令牌 持续整合 持续部署 交互式工作流 CIDR白名单 2.2 将令牌设置为CI/CD服务器上的环境变量 2.3 创建并签入特定于项目的.npmrc文件 2.4 令牌安全 3、Docker和私有模块 3.1 背景:运…

Android的学习系列之Android Studio Setup安装

Android的学习系列之Android Studio Setup安装 [TOC](Android的学习系列之Android Studio Setup安装) 前言Android平台搭建总结 前言 还是项目需要,暂时搭建安卓的运行平台。 Android平台搭建 安装包 双击安装包,进入安装。 下一步 根据自己需求&a…

React源码解析18(7)------ 实现事件机制(onClick事件)

摘要 在上一篇中,我们实现了useState的hook,但由于没有实现事件机制,所以我们只能将setState挂载在window上。 而这一篇主要就是来实现事件系统,从而实现通过点击事件进行setState。 而在React中,虽然我们是将事件绑…

机器学习笔记 - 基于PyTorch + 类似ResNet的单目标检测

一、获取并了解数据 我们将处理年龄相关性黄斑变性 (AMD) 患者的眼部图像。 数据集下载地址,从下面的地址中,找到iChallenge-AMD,然后下载。 Baidu Research Open-Access Dataset - DownloadDownload Baidu Research Open-Access Datasethttps://ai.baidu.com/bro…

MAVEN利器:一文带你了解MAVEN以及如何配置

前言: 强大的构建工具——Maven。作为Java生态系统中的重要组成部分,Maven为开发人员提供了一种简单而高效的方式来构建、管理和发布Java项目。无论是小型项目还是大型企业级应用,Maven都能帮助开发人员轻松处理依赖管理、编译、测试和部署等…

禾赛科技Q2营收交付双新高,国产激光雷达从量变到质变

随着2022年激光雷达元年、2023年城市智能辅助驾驶(NOA)元年相继到来,激光雷达产业迎来爆发期。 今年以来,自动驾驶公司、汽车制造商以及移动出行公司等各路人马积极推动城市级别的智能辅助驾驶全面落地,北京、上海、深…

Windows - UWP - 网络不好的情况下安装(微软商店)MicrosoftStore的应用

Windows - UWP - 网络不好的情况下安装(微软商店)MicrosoftStore的应用 前言 UWP虽然几乎被微软抛弃了,但不得不否认UWP应用给用户带来的体验。沙箱的运行方式加上微软的审核,用户使用起来非常放心,并且完美契合Wind…

【elasticSearch系】3.完整搭建详尽版elk

话不多说,我们先看下经典的elk 是由哪些组件搭建组合起来的 elasticSearch和kibana搭建 可以查看之前我搭建elasticsearch和kibana 的这篇文章 logstash搭建 为了和之前我搭建elasticsearch和kibana版本保持一致,这里我们还是选择7.17.3 下载地址 点击下载,这里为了方…

207、仿真-51单片机脉搏心率与血氧报警Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括: 需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&a…

Leetcode-每日一题【剑指 Offer 31. 栈的压入、弹出序列】

题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列&#xf…

phpstorm配置ftp同步文件到服务器

这里的默认快捷键 不是 CtrlS ;需要设置快捷键,这里原来是save all操作时上传文件到服务器; ** 设置好快捷键后按 CtrlS就会同步文件(添加删除文件后保存,服务器也会同步) ** 搜索出save all 后&#xf…

FreeRTOS模板-开启资源追踪

目录 开启宏定义 使用API函数 演示效果 测试代码 开启宏定义 #define configUSE_TRACE_FACILITY 1 //TODO 查看任务状态#ifndef INCLUDE_uxTaskGetStackHighWaterMark#define INCLUDE_uxTaskGetStackHighWaterMark 1 //TODO 开启堆栈使用剩余量的检测 #…

一种多策略下RabbitMQ的延时队列实现

1.为什么会用到延时队列? 场景: 最近在开发一款系统中遇到这样一个场景,A系统开通套餐需要把套餐信息以邮件的形式发送给相关工作人员,经过人工审核通过后,在B系统里面开通,A系统会调B系统套餐列表接口查询套餐是否开通成功,开通成功则从A系统去完成订单,假如超过设定时间未开…

【javaweb】学习日记Day2 - JavaScript入门

目录 一、引入方式 1、内部脚本 2、外部脚本 二、基础语法 1、输出语句 2、定义变量类型 3、数据类型 4、运算符 (1)类型转换 5、函数 (1)方法一 (2)方法二 三、对象 1、Array数组 &#x…

设计HTML5表单

HTML5基于Web Forms 2.0标准对HTML4表单进行全面升级,在保持简便、易用的基础上,新增了很多控件和属性,从而减轻了开发人员的负担。表单为访问者提供了与网站进行互动的途径,完整的表单一般由控件和脚本两部分组成。 1、认识HTML…

Martin_DHCP_V3.0 (DHCP自动化泛洪攻击GUI)

Github>https://github.com/MartinxMax/Martin_DHCP_V3.0 首页 Martin_DHCP_V3.0 自动化DHCP洪泛攻击 Martin_DHCP_V3.0 使用方法 安装三方库 #python3 1.RunMe_Install_Packet.py 攻击路由器 #python3 Martin_DHCP_Attack.py 填写网卡 填写攻击次数 开始运行

【Linux】进程地址空间

目录 一、回顾我们以前学习的地址空间二、进程地址空间三、进程地址空间的作用四、解决一个地址出现两个值的问题 一、回顾我们以前学习的地址空间 这个内存布局真是的我们实实在在的内存嘛&#xff1f; 答案是不是的 下面我们来验证 1 #include<stdio.h>2 #include<a…