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

Redis 过期删除策略、内存回收策略、单线程理解

不知从何开始Redis的内存淘汰策略也开始被人问及,卷!真的是太卷了。难不成要我们去阅读Redis源码吗,其实问题的答案,在Redis中的配置文件中全有,不需要你阅读源码、这个东西就是个老八股,估计问这个东西是想考察你们做的项目体量大不大。一般用 lru 就行。
在这里插入图片描述

内存回收策略

找到redis安装目录,找到redis.conf文件,找到如下代码,即可配置对应的内存回收策略

maxmemory-policy noeviction

至于内存策略有哪几种,文档中也写出来了,但是用洋文写的,下面用国语翻译一下。

在这里插入图片描述

当Redis使用内存超过了配置文件中设置的最大内存、或者大于物理机内存,将会触发内存回收策略

  1. volatile-lru -> remove the key with an expire set using an LRU algorithm(借助 lru 算法移除最近最少使用的过期 key)推荐
  2. allkeys-lru -> remove any key according to the LRU algorithm(移除最近最少使用的key,无论该 key 是否过期)不推荐
  3. volatile-random -> remove a random key with an expire set(从过期 key 中随机移除 key)也可以用用,但是效果没有第2种的好
  4. allkeys-random -> remove a random key, any key(随机移除 key,无论 key 是否过期)
  5. volatile-ttl -> remove the key with the nearest expire time (minor TTL) (删除快过期的 key)不推荐
  6. noeviction -> don’t expire at all, just return an error on write operations(这个是Redis默认的内存回收策略,没内存后写入会报错,建议改成 volatile-lru)

过期删除策略

这玩意我在配置文件中翻了一圈没找到对应的配置,那就肯定是要看redis源码了。我很爱看源码。但是看了下redis安装文件中的src文件,这玩意尼玛好像是用C语言写的,就好像很多人喜欢问 Synchronized 锁升级,但是这玩意的源码需要进行反编译查看,而且不是用 Java写的,叫我们怎么看呢。但是没关系,这些我都总结好了。
Redis用到的过期删除策略:惰性删除、定期删除、定时删除,这些都是前辈们的经验之谈,这玩意怎么来的?就好比Mybatis中用到了哪些设计模式,委派模式是其中的一个,同理 惰性删除、定期删除、定时删除,也是Redis用到的一部分过期删除策略。要想完全搞明白用到的所有过期删除策略,你需要把 src 文件下面所有的 .c 文件全部看一遍。

  • 惰性删除:访问某个key的时候,先检测key是否过期,过期了直接删除,返回null,没过期返回具体值。至于源码文件,在 src 目录下面有个 db.c 文件,里面有个 expireIfNeeded 函数,就 是 Redis 每次对 key 进行操作前都会调用 expireIfNeeded 函数,判断key是否过期,过期了就删除key、没过期就不删;
    在这里插入图片描述
  • 定期删除:每隔一定时间,取出部分key,筛出其中的过期key然后删除。具体源码自行翻阅 src目录中的 .c 文件
  • 定时删除:这个也很好理解,过期key到了过期时间自动删除。具体源码自行翻阅 src目录中的 .c 文件

RDB文件路径配置

修改 redis.conf 中的如下配置即可

# RDB文件名称
dbfilename dump.rdb
# RDB文件存放路径
dir /Users/zhangzixing/Desktop/redis持久化文件

在这里插入图片描述

主动生成RDB文件命令

没怎么用过这些命令,浅浅的记录一下~~~
阻塞Redis所有请求,直至RDB文件生成完成,不建议使用

SAVE

开启子线程,非阻塞生成RDB文件

BGSAVE

本机启动Redis

这个读者可以跳过,我经常忘记我电脑上Redis的安装路径,这里做个记录~

redis-server /usr/local/redis-6.0.10/etc/redis.conf
config set requirepass 123456

Redis 单线程个人理解

由于 Redis 的内存数据库,CPU不会成为Redis性能的瓶颈,内存执行指令速度非常快,是单个线程去执行指令,但是别忘了,Redis 还需要对 RDB、AOF 文件进行 IO 操作,IO 操作是多线程执行的。

到此本文结束,关注不迷路,后续分享更多经验之谈~~~~

相关文章:

Redis 过期删除策略、内存回收策略、单线程理解

不知从何开始Redis的内存淘汰策略也开始被人问及,卷!真的是太卷了。难不成要我们去阅读Redis源码吗,其实问题的答案,在Redis中的配置文件中全有,不需要你阅读源码、这个东西就是个老八股,估计问这个东西是想…...

oracle 如何把数据库 date 日期格式 的数据 改成 2021-01-27

如果您要将日期"27-12月-29"更改为"2021-01-27"格式,您可以使用Oracle的日期格式化函数和字符串替换函数来实现。 以下是一个示例SQL语句,将日期"27-12月-29"更改为"2021-01-27"格式: sql UPDATE…...

Git 使用教程(超级详细)

目录 一:Git二:SVN与Git的的区别三、安装Git四:常规操作五:远程仓库六:创建与合并分支七:bug分支八:多人协作九:git可视化工具 Git Git 是一种分布式版本控制系统,用于…...

动态规划习题

动态规划的核心思想是利用子问题的解来构建整个问题的解。为此&#xff0c;我们通常使用一个表格或数组来存储子问题的解&#xff0c;以便在需要时进行查找和使用。 1.最大字段和 #include <iostream> using namespace std; #define M 200000int main() {int n, a[M], d…...

安卓免Root做klipper上位机教程

软件说明&#xff1a;虚拟电脑可以在8.0以上没越狱的安卓系统中安装klipper上位机程序实现对已刷入klipper固件的3D打印控制板的控制欢迎下载安装测试&#xff0c;反馈碰到的问题。安装步骤&#xff1a;1). 在手机上打开浏览器&#xff0c;访问这个网址 http://droidvm.com/cn/…...

网络安全学习之信息泄露

一、背景以及泄露途径 通常我们会对数据进行备份&#xff0c;比如我们在发布网站的时候会对将要替换的版本进行备份。我们在对重要文件进行修改的时候我们也需要进行备份&#xff0c;如果我们对备份或缓存的文件或信息为做好管理&#xff0c;很容易就导致我们的敏感信息泄露。…...

Java智慧工地源码,智慧工地管理平台的技术架构和工作原理

智慧工地管理平台是将互联网的理念和技术引入建筑工地&#xff0c;从施工现场源头抓起&#xff0c;最大程度的收集人员、安全、环境、材料等关键业务数据&#xff0c;依托物联网、互联网&#xff0c;建立云端大数据管理平台&#xff0c;形成“端云大数据”的业务体系和新的管理…...

Nginx配合Vue的history模式

加上一行代码就行&#xff1a; try_files $uri $uri/ /index.html;...

持续集成交付CICD:Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前端应用的蓝绿发布

目录 一、实验 1.蓝绿发布准备 2.Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前端应用的蓝绿发布 二、问题 1.手动构建Jenkins前端项目CI流水线报错 2.如何优化手动构建流水线选项参数 一、实验 1.蓝绿发布准备 &#xff08;1&#xff09;环境 表1 蓝绿发布…...

计算机网络中的通信子网主要有哪些功能?

计算机网络中的通信子网主要具有以下功能&#xff1a; 负责全网的数据通信&#xff1a;通信子网通过使用各种通信协议和传输控制功能&#xff0c;能够确保数据从一台主机安全、准确地传输到另一台主机。这包括数据的封装、解封装、传输控制、差错控制等过程。 完成各种网络数据…...

【大数据-Hadoop】从入门到源码编译-概念篇

【大数据-Hadoop】从入门到源码编译-概念篇 Hadoop与大数据生态&#xff08;一&#xff09;Hadoop是什么&#xff1f;&#xff08;二&#xff09;Hadoop组成1. HDFS1.1 NameNode&#xff08;nn&#xff09;1.2 DataNode&#xff08;dn&#xff09;1.3 Secondary NameNode&#…...

什么是设计模式

一、概述 1、设计模式是解决某些问题的办法 2、设计模式不是凭空想象出来的&#xff0c;是经验的总结和积累 3、设计模式是不断的发展的 4、各个行业都有自己的设计模式 二、设计模式的基本要素 设计模式一般包括模式的名称、问题、目的、解决方案、效果、实例代码和相关…...

Typescript中Omit数据类型的理解

在 TypeScript 中&#xff0c;Omit 是一个内置的工具类型&#xff0c;它用于从对象类型中排除指定的属性&#xff0c;并返回剩余的属性。 Omit 的语法如下所示&#xff1a; type Omit<T, K> Pick<T, Exclude<keyof T, K>>;其中&#xff0c;T 表示原始类型…...

【ArcGIS Pro微课1000例】0055:Pro中如何处理个人数据库(.mdb)

文章目录 原因分析解决方案使用ArcGIS Pro的用户应该已经发现个人地理数据库(.mdb)不能使用了。随着ESRI的软件技术革新,在ArcGIS Pro中不再支持且将来也不会支持个人地理数据库(.mdb)。这个确实很烦人,很多项目还是在使用mdb数据库的。不过ESRI也给出了一些解决办法,不…...

【Spark精讲】Spark五种JOIN策略

目录 三种通用JOIN策略原理 Hash Join 散列连接 原理详解 Sort Merge Join 排序合并连接 Nested Loop 嵌套循环连接 影响JOIN操作的因素 数据集的大小 JOIN的条件 JOIN的类型 Spark中JOIN执行的5种策略 Shuffle Hash Join Broadcast Hash Join Sort Merge Join C…...

linux 常用脚本搜集(nginx) —— 筑梦之路

作为搜集之用 nginx acc日志分析 #!/bin/bash # 日志格式: $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" LOG_FILE$1 echo "…...

基于PCIe的NVMe学习

一&#xff1a;基本概念 1.UltraScale&#xff1a;是Xilinx ZYNQ 系列产品 2.spec&#xff1a;大家现在别纠结于具体的命令&#xff0c;了解一下就好。老板交代干活的时候&#xff0c;再找spec一个一个看吧————猜测估计是命令表之类的。 Admin指令&#xff1a;——如下&…...

循环神经网络-1

目录 1 数据集构建 1.1 数据集的构建函数 1.2 加载数据并进行数据划分 1.3 构造Dataset类 2 模型构建 2.1 嵌入层 2.2 SRN层 2.3 线性层 2.4 模型汇总 3 模型训练 3.1 训练指定长度的数字预测模型 3.2 多组训练 3.3 损失曲线展示 4 模型评价 总结 参考文献 循环神经网络&…...

MFC画折线图,基于x64系统

由于项目的需要&#xff0c;需要画一个折线图。 传统的Teechart、MSChart、HighSpeedChart一般是只能配置在x86系统下&#xff0c;等到使用x64系统下运行就是会报出不知名的错误&#xff0c;这个地方让人很苦恼。 我在进行配置的过程之中&#xff0c;使用Teechart将x86配置好…...

JDK8安装教程分享

&#x1f9cb;&#x1f9cb;今天&#xff0c;在博客社区看到一篇非常好的&#xff0c;关于JDK8的安装教程&#xff0c;亲试有用&#xff0c;现分享给大家。。。 JDK8安装...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...