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

Redis--内存回收机制详解

什么是内存回收机制?

众所周知Redis之所以性能高是因为数据都存在内存中,内存是很宝贵的,Redis的内存回收机制本质就是处理达到过期时间的key-value,以及当内存到达最大使用值时候触发的内存淘汰策略。

Redis数据删除的策略有哪些?

定时过期(主动淘汰):创建一个定时器,当key设置有过期时间,且达到过期时间的时候,由定时器任务立即执行删除操作。

  • 优点:节约内存,到期就删除,快速释放不需要的内存占用。
  • 缺点:cpu压力很大,无论此时cpu负载多高,均占用cpu资源,会影响redis服务器响应时间和吞吐量。
  • 总结:用处理器性能换存储空间(时间换空间)。

惰性删除(被动淘汰):数据到达过期时间,不做处理,等下次访问该数据时,如果过期就删除,不返回数据,否则正常返回。

  • 优点:节约cpu性能,发现必须删除时候才删除。
  • 缺点:内存压力大,无效数据长期占用内存空间,存在内存泄漏的风险。
  • 总结:用内存存储空间换处理器性能。

定时过期(主动淘汰):创建一个定时器,当key设置有过期时间,且达到过期时间的时候,由定时器任务立即执行删除操作。

  • 优点:节约cpu性能,发现必须删除时候才删除。
  • 缺点:不好确定删除操作执行时长和频率,执行太频繁,CPU压力大,执行间隔太久,和惰性删除一样,存在返回错误数据的风险,比如某个key已经到了过期时间,但是还没有执行定期删除,业务查无的时候会返回该数据,该数据是错误数据。
  • 总结:周期性抽查存储空间,通过调整定时扫描的时间间隔和每次扫描的限定耗时,尽量达到CPU和内存资源平衡效果,一般不推荐使用。

Redis采用的是定时删除和惰性删除的机制实现过期键的内存回收。

Redis对于设置了过期时间的key的逐出算法有哪些?

  • volatile-lru:对生存周期内最少有使用key进行置换(强调的是距离当前的时间,仅关注数据访问时间和顺序,忽略访问次数)。
  • volatile-lfu:对生存周期内最少使用次数key进行置换(强调的是时间周期内的使用次数,关注时间区间内数据访问次数)。
  • volatile-random:对生存周期中的key进行随机置换。
  • volatile-ttl:挑选将要过期的数据进行淘汰。

Redis对于全库的key的逐出算法有哪些?

  • allkeys-lru:挑选最近最少使用的数据淘汰(强调的是距离当前的时间,仅关注数据访问时间和顺序,忽略访问次数)。
  • allkeys-lfu:挑选最近使用次数最少的数据淘汰(强调的是时间周期内的使用次数,关注时间区间内数据访问次数)。
  • allkeys-random:随机选择数据淘汰。
    Redis默认的逐出策略是noeviction,当内存使用达到阈值的时候,所有申请内存的命令会报OOM。

LRU算法和LFU算法:

  • LRU算法:LRU(Least Recently Used)最近最少使用(最长时间不被使用)淘汰算法,LRU算法是淘汰最长时间没有使用key。
  • LFU算法:LFU(Least Frequently Used)最不经常使用(使用次数最少)淘汰算法,LFU是淘汰一段时间内,使用次数最少的key。

Reidis 碎片及原因?

内存分配器的分配策略决定操作系统无法按需分配,这是因为内存分配器一般是按固定大小来分配内存,而不是完全按照应用程序申请的内存空间大小给程序分配,Redis按照固定的大小将空间分配为例如8字节 16字节 32 字节 等等,Redis这么做的目的是减少分配次数,提高性能,比如客户端申请一个20字节的空间,Redis会分配一个32字节的空间,如果后面在追加10个字节的数据,Redis就无需再次分配空间了。而Redis内存碎片的产生也是因为这个策略,同样如客户端申请一个20字节的空间,Redis会分配一个32字节的空间,后续不在增加数据了,就浪费了12字节的空间,这就是内存碎片。
可以使用 info memory 查询内存的使用详细信息,mem_fragmentation_ratio 大于1.5表示内存碎片严重,需要处理了。

如何解决Redis的内存碎片问题?

  1. 重启Redis,数据重建,内存碎片问题会得到大大改善,线上一般不允许这么操作。
  2. 开启内存碎片自动清理,
 config set activedefrag yes;#表示内存碎片的字节数达到 100MB 时,开始清理;active-defrag-ignore-bytes 100mb;#表示内存碎片空间占操作系统分配给 Redis 的总空间比例达到 10% 时,开始清理active-defrag-threshold-lower 10;

如有不正确的地方请各位指出纠正。

相关文章:

Redis--内存回收机制详解

什么是内存回收机制? 众所周知Redis之所以性能高是因为数据都存在内存中,内存是很宝贵的,Redis的内存回收机制本质就是处理达到过期时间的key-value,以及当内存到达最大使用值时候触发的内存淘汰策略。 Redis数据删除的策略有哪些&#xf…...

win安装卸载python3.13

一、安装 访问python官网:https://www.python.org/ 点击“Downloads” 点击“Windows” 找到自己要下载的版本和位数,比如我这个是3.13版本、64位的安装包 下载好了之后,双击安装包 勾选“Add python.exe to PATH”:把python环…...

APIFox-自动获取登录状态操作

APIFox-自动获取登录状态操作 概述 作为纯后端开发码农,每次接口开发完的调试很重要,因此每次重复的手动获取登陆状态Token或者直接放行就太麻烦了。 APIFox提供了前置操作,可以很方便的自动获取登录状态,节省大量重复劳动时间。…...

【NDK系列】Android tombstone文件分析

文件位置 data/tombstone/tombstone_xx.txt 获取tombstone文件命令: adb shell cp /data/tombstones ./tombstones 触发时机 NDK程序在发生崩溃时,它会在路径/data/tombstones/下产生导致程序crash的文件tombstone_xx,记录了死亡了进程的…...

CentOS7 Hive2.3.8安装

CentOS7 Hive2.3.8 安装 建议从头用我的博客,如果用外教的文件到 一、9)步骤了,就用他的弄完,数据库不一样,在9步骤前还能继续看我的 一、 安装MySQL 0.0)查询mariadb,有就去0.1),没有就不管…...

代码随想录算法训练营第四十四天 完全背包 、零钱兑换 II 、组合总和 Ⅳ

代码随想录算法训练营第四十四天 | 完全背包 、零钱兑换 II 、组合总和 Ⅳ 完全背包 题目链接:题目页面 (kamacoder.com) 解释一、01背包 一维 :为什么要倒序遍历背包? 首先要明白二维数组的递推过程,然后才能看懂二维变一维的…...

【经验】vscode 鼠标拖曳不能选中整行文字,只能选中纵向矩形范围

1、问题描述 不知道昨天操作vscode设置界面时,误选择了啥,导致鼠标拖曳不能选中整行文字,只能选中纵向矩形范围,现象如下: 2、解决方法 1)打开设置界面 点击左下角按键,选择“设置” 2&…...

Redis--事务机制的详解及应用

Redis事务的概念: Redis事务就是将一系列命令包装成一个队列,在执行时候按照添加的顺序依次执行,中间不会被打断或者干扰,在执行事务中,其他客户端提交的命令不可以插入到执行事务的队列中,简单来说Redis事…...

路由器端口映射如何配置?

在网络通信中,路由器是一个重要的设备,它负责将数据包从一个网络传输到另一个网络。路由器的端口映射配置是一种重要的设置,可以使外部网络中的计算机通过访问路由器上的特定端口与内部网络中的计算机进行通信。本文将介绍什么是路由器端口映…...

力扣34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)

Problem: 34. 在排序数组中查找元素的第一个和最后一个位置 文章目录 题目描述思路复杂度Code 题目描述 思路 Problem: 二分查找常用解题模板(带一道leetcode题目) 直接套用上述中的寻找左、右边界的二分查找模板即可 复杂度 时间复杂度: O ( l o g n )…...

【每日一题】3.2 求逆序对

题目描述 给定一个长度为 n的整数数列&#xff0c;请你计算数列中的逆序对的数量。 逆序对的定义如下&#xff1a;对于数列的第 i个和第 j个元素&#xff0c;如果满足 i<j 且 a[i]>a[j]&#xff0c;则其为一个逆序对&#xff1b;否则不是。 输入格式 第一行包含整数 n…...

NTP时间源服务器(NTP网络时钟)助力智慧医院数字化

NTP时间源服务器&#xff08;NTP网络时钟&#xff09;助力智慧医院数字化 NTP时间源服务器&#xff08;NTP网络时钟&#xff09;助力智慧医院数字化 目前计算机网络中各主机和服务器等网络设备的时间基本处于无序的状态。 随着计算机网络应用的不断涌现&#xff0c;计算机的时…...

Benchmark学习笔记

小记一篇Benchmark的学习笔记 1.什么是benchmark 在维基百科中&#xff0c;是这样子讲的 “As computer architecture advanced, it became more difficult to compare the performance of various computer systems simply by looking at their specifications.Therefore, te…...

Linux中的动静态库

目录 一、静态库 &#xff08;1&#xff09;静态库的优缺点&#xff1a; &#xff08;2&#xff09;Linux下静态库的创建和执行 1.直接编译​编辑 2.指定路径和库名 3.用LIBRARY_PATH环境变量来配置路径 二、动态库 &#xff08;1&#xff09;动态库的优缺点 &#xff…...

C/C++基础语法

C/C基础语法 文章目录 C/C基础语法头文件经典问题链表链表基础操作 秒数转换闰年斐波那契数列打印n阶菱形曼哈顿距离菱形图案的定义大数计算 输入输出格式化输入输出getline()函数解决cin只读入一个单词的问题fgets读入整行输出字符数组&#xff08;两种方式puts和printf&#…...

Home Assistant:基于Python的智能家居开源系统详解

Home Assistant&#xff1a;基于Python的智能家居开源系统详解 在数字化和智能化的时代&#xff0c;智能家居系统成为了现代家庭的新宠。它们能够让我们更加方便地控制家中的各种设备&#xff0c;实现自动化和个性化的居住体验。其中&#xff0c;Home Assistant作为一款基于Pyt…...

使用vscode进行简单的多文件编译

安装好必要的插件后&#xff08;如C/C&#xff0c;code runner等&#xff09;默认生成task.json即可进行单文件运行 涉及到多文件情况可以修改task.json如下&#xff1a; {"version": "2.0.0","tasks": [{"type": "cppbuild&quo…...

Python实现PPT演示文稿中视频的添加、替换及提取

无论是在教室、会议室还是虚拟会议中&#xff0c;PowerPoint 演示文稿都已成为一种无处不在的工具&#xff0c;用于提供具有影响力的可视化内容。PowerPoint 提供了一系列增强演示的功能&#xff0c;在其中加入视频的功能可以大大提升整体体验。视频可以传达复杂的概念、演示产…...

Mysql学习之MVCC解决读写问题

多版本并发控制 什么是MVCC MVCC &#xff08;Multiversion Concurrency Control&#xff09;多版本并发控制。顾名思义&#xff0c;MVCC是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之&#xff0…...

Linux下如何生成coredump文件

引言 在linux下执行程序&#xff0c;当出现coredump时&#xff0c;却发现没有生成core文件&#xff0c;或者生成了core文件却不知道在哪里&#xff0c;下面就讲述如何产出core文件&#xff0c;以及指定core文件的产出格式与路径。 打开core文件的大小限制 ulimit -c unlimit…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...