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

面试题:Redis的内存策略

1 Redis内存回收

Redis之所以性能强,主要原因是基于内存存储,然而单节点的Redis内存不易过大,会影响主从同步和持久化性能

我们可以通过修改配置文件设置Redis的最大内存:

当内存存储到上限时,就无法存储更多的数据了。

1.1 过期策略

通过设置过期时间进行内存回收。

Redis内存过期两个问题?
1、 Redis如何知道数据过期了呢
2、是不是TTL到期就立即删除呢

Redis本身是一个典型的key-value内存存储数据库,因此所有的key、value都保存在之前学习过的Dict结构中。不过在其database结构体中,有两个Dict: 一个用来记录key-value;另一个用来记录key-TTL。

其结构如下:

  • Redis是如何知道一个key是否过期呢?

Redis利用两个Dict分别记录key-value对及key-ttl对

  • 是不是立即删除呢?

肯定不是的,是惰性删除,周期删除。

  • 惰性删除:

当我们访问该key时,判断是否过期,过期则删除,没有过期则返回。

  • 周期删除

是通过一个定时任务,周期性的抽样部分过期的key,然后执行删除。执行周期有两种:

  • Redis会设置一个定时任务serverCron(),按照server.hz的频率来执行过期key清理,模式为SLOW

  • Redis的每个事件循环前会调用beforesleep()函数,执行过期key清理,模式为FAST

  • SLOW模式执行频率默认为10,每次不超过25ms

  • FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms

2 Redis内存淘汰

内存淘汰:就是当Redis内存使用达到设置的闻值时,Redis主动挑选部分key删除以释放更多内存的流程。Redis会在处理客户端命令的processCommand中尝试做内存淘汰策略。

那么Redis就在任何命令执行之前做内存检查

内存淘汰策略:

  • noeviction:不淘汰任何key,但是内存满时不允许写入新数据,默认就是这种策略。(默认)

  • volatile-ttl: 对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰

  • allkeys-random:对全体key ,随机进行淘汰。也就是直接从db->dict中随机挑选

  • volatile-random: 对设置了TTL的key ,随机进行淘汰。也就是从db->expires中随机挑选

  • allkeys-lru:对全体key,基于LRU算法进行淘汰

  • volatile-lru:对设置了TTL的key,基于LRU算法进行淘汰

  • allkeys-lfu: 对全体key,基于LFU算法进行淘汰

  • volatile-lfu: 对设置了TTL的key,基于LFI算法进行淘汰

LRU(Least Recently Used)最少最近使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
LFU (Least Frequently Used),最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。

如何知道最近访问与访问频率呢?主要是看RedisObject中的一个属性

lru:是24bit的数据,低八位存入逻辑访问次数,高十六位存储最近访问时间

内存淘汰策略结构图

相关文章:

面试题:Redis的内存策略

1 Redis内存回收Redis之所以性能强,主要原因是基于内存存储,然而单节点的Redis内存不易过大,会影响主从同步和持久化性能我们可以通过修改配置文件设置Redis的最大内存:当内存存储到上限时,就无法存储更多的数据了。1.…...

idea中使用Git

目录 一、在idea中配置Git 1、打开settings,搜索git,找到本地上的git安装目录,选择git.exe 2、本地git安装目录 二、获取Git 1、本地初始化仓库 2、选中项目这层目录,点击确定 2、从远程仓库克隆 三、本地仓库操作 1、将文…...

C++派生类指针赋值给基类指针问题(虚函数和非虚函数不同)

概念 上行转换:把派生类的指针或引用转换成基类表示,简单来说就是子类指向父类 下行转换:把基类指针或引用转换成派生类表示,简单来说就是父类指向子类 上行转换是安全的的,下行转换是不安全的(最好使用…...

数据库实践LAB大纲 04 触发器

游标 系统为用户开设的一个数据缓冲区 —— 存T-SQL语句从数据库检索出来的结果集 对结果集处理:结果集一条条提取记录,这时要用游标 使用 利用基于变量的select into语句,只能处理单条记录使用游标循环处理 声明游标: DECLA…...

Win10系统电脑开机后总是蓝屏无法使用怎么办?

Win10系统电脑开机后总是蓝屏无法使用怎么办?电脑开机的时候出现了蓝屏问题,这个情况是我们的电脑系统不兼容导致的。遇到这个问题一般是需要去进行系统的重装来解决,安装一个更兼容的系统就可以解决问题了。一起来看看详细的解决方法分享吧。…...

Node——使用nvm切换node版本

1. 下载mvn安装包 https://pan.baidu.com/s/1alfyRvwVWr_TrkN0A9Er5g?pwd1v7c 2. 安装后命令输入mvn -v 验证是否安装成功 3. mvn命令 nvm list available 显示可下载的版本nvm install [node版本号] 显示可下载的版本nvm uninstall [node版本号] 删除已安装的指定版本nvm…...

go语言实现的一个基于go-zero框架的微服务影院票务系统cinema-ticket

一个基于go-zero框架的微服务影院票务系统cinema-ticket 前言 项目基本介绍 项目开源地址:butane123/cinema-ticket: 一个基于go-zero框架的微服务影院票务系统cinema-ticket (github.com) 这是一个微服务影院票务系统,基于go-zero框架实现&#xff0c…...

ArcGIS API for JavaScript 4.15系列(3)——Dojo中的css样式操作

1、前言 前一篇博客介绍了Dojo中基础的dom操作方法,主要是针对html中的常用标签和属性进行操作。而一个优秀的线上网站自然也离不开css样式的从旁辅助。在实际开发过程中,我们经常会遇到需要动态修改css样式的问题,本文就来介绍一下如何在Do…...

“赶快回家网”首页制作

“赶快回家网”首页制作一、实验名称:二、实验日期:三、实验目的:四、实验内容:五、实验步骤:六、实验结果:七、源程序:八、心得体会:一、实验名称: “赶快回家网”首页…...

JavaWEB-Servlet

目录 Servlet简介Servlet快速入门Servlet配置详解ServletContext 1 Servlet简介 Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码&a…...

springboot集成mqtt

引入jar包 <dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-mqtt</artifactId> </dependency> <dependency><groupId>com.alibaba</groupId><artifactId>fastjs…...

Lecture3 梯度下降(Gradient Descent)

目录 1 问题背景 2 批量梯度下降 (Batch Gradient Descent) 3 鞍点(Saddle Point) 3 随机梯度下降 (Stochastic Gradient Descent) 4 小批量梯度下降 (Mini-batch Gradient Descent) 1 问题背景 图1 上节课讲述的穷举法求最优权重值在Lecture2中&#xff0c;介绍了使用穷举…...

深入了解DSP

一、时钟和电源 问&#xff1a;DSP的电源设计和时钟设计应该特别注意哪些方面&#xff1f;外接晶振选用有源的好还是无源的好&#xff1f; 答&#xff1a;时钟一般使用晶体&#xff0c;电源可用TI的配套电源。外接晶振用无源的好。 问&#xff1a;TMS320LF2407的A/D转换精度保证…...

Flink反压如何排查

Flink反压利用了网络传输和动态限流。Flink的任务的组成由流和算子组成&#xff0c;那么流中的数据在算子之间转换的时候&#xff0c;会放入分布式的阻塞队列中。当消费者的阻塞队列满的时候&#xff0c;则会降低生产者的处理速度。 如上图所示&#xff0c;当Task C 的数据处…...

windows无法访问指定设备路径或文件怎么办?2个解决方案

有时候Win10电脑打不开程序或文件&#xff0c;windows无法访问指定设备路径或文件该怎么办&#xff1f;原因是什么呢&#xff1f;一般导致这种情况的出现&#xff0c;大多是因为我们的电脑缺乏相应的查看权限&#xff0c;我们只需要通过赋予权限就可以解决这个难题了。 操作环境…...

冷知识|鹤顶红还能用来修长城?

大家好&#xff0c;我是建模助手。 在上篇浅浅地蹭了波热点之后&#xff0c;我灵机一动&#xff0c;倒不如也搞一搞建筑方面的冷知识&#xff1f;冷热搭配&#xff0c;事半功倍... 问问大家&#xff0c;如果谈起古建筑&#xff0c;关键词都有什么&#xff1f;是庄严、震撼、壮…...

【GD32F427开发板试用】在IAR环境中移植RTX5

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;吴金刚 0.前言 首先感谢极术社区和兆易创新给了这次试用GD32F427开发板的机会。 板子做的虽然简约&#xff0c;但是自带了GD-link所以一根USB…...

MySQl学习(从入门到精通15)

MySQl学习&#xff08;从入门到精通15&#xff09;第 18 章_MySQL 8 其它新特性1. MySQL 8 新特性概述1. 1 MySQL 8. 0 新增特性1. 2 MySQL 8. 0 移除的旧特性2. 新特性 1 &#xff1a;窗口函数2. 1 使用窗口函数前后对比2. 2 窗口函数分类2. 3 语法结构2. 4 分类讲解1. 序号函…...

前端构建工具 Vite

文章目录参考环境构建工具构建工具的主要功能目前主流的前端构建工具Vite为什么使用 Vite冷启动WebpackVite热更新优化热更新优化预构建依赖Webpack VS ViteVite 的缺点首屏性能懒加载与 Vite 相关的基本操作获取create-vite创建项目Project nameSelect a frameworkSelect a va…...

若依框架---PageHelper分页(十)

在前几天的文章中&#xff0c;我们介绍了PageHelper的分页方法&#xff0c;研读代码定位到了ExecutorUtil.pageQuery(...)方法&#xff0c;并阅读到了其中的部分代码。 今天我们将看到重要的SQL修改代码。 getPageSql 我们接着看代码&#xff1a; if (!dialect.beforePage(…...

UE4SS终极指南:5步掌握虚幻引擎游戏修改与脚本开发

UE4SS终极指南&#xff1a;5步掌握虚幻引擎游戏修改与脚本开发 【免费下载链接】RE-UE4SS Injectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games 项目地址: https://gitcode.com/gh_mirrors/re/RE-UE4SS …...

跨平台文件自由:Free-NTFS-for-Mac 终极解决方案深度解析

跨平台文件自由&#xff1a;Free-NTFS-for-Mac 终极解决方案深度解析 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and management…...

Ruby纳米机器人框架:构建高内聚低耦合的自动化任务管道

1. 项目概述&#xff1a;当Ruby遇上纳米机器人最近在GitHub上闲逛&#xff0c;发现了一个名为icebaker/ruby-nano-bots的项目。这个标题本身就充满了想象力——Ruby&#xff0c;一门以优雅和生产力著称的动态语言&#xff1b;Nano-Bots&#xff0c;一个源自科幻、代表微观自动化…...

Anaconda环境翻车实录:从‘CondaMemoryError’到完美恢复的完整指南

Anaconda环境崩溃自救手册&#xff1a;从诊断到彻底修复的实战指南 那天下午&#xff0c;当你在终端第15次尝试运行conda update --all时&#xff0c;屏幕上突然跳出鲜红的"CondaMemoryError"字样&#xff0c;整个开发环境瞬间陷入瘫痪。这不是普通的报错&#xff0c…...

从零到一:深入拆解 I/O 多路复用的前世今生与实战选型

1. 从单线程阻塞到多路复用&#xff1a;I/O模型的进化史 第一次写网络程序时&#xff0c;你可能遇到过这样的场景&#xff1a;服务器在accept()一个客户端连接后&#xff0c;整个程序就像被冻住一样&#xff0c;直到这个客户端发送数据才能继续运行。这就是最原始的阻塞I/O模型…...

别再死记硬背公式了!用C++ STL的next_permutation玩转排列组合(附LeetCode刷题实战)

用C STL的next_permutation玩转排列组合&#xff1a;LeetCode实战指南 在算法面试和编程竞赛中&#xff0c;排列组合问题几乎无处不在。从全排列到子集生成&#xff0c;这类问题看似基础&#xff0c;却能让不少开发者陷入递归的泥潭。但你知道吗&#xff1f;C标准库中早已藏着一…...

开源硬件测试框架OpenClaw Harness:从GPIO到CI/CD的自动化测试实践

1. 项目概述&#xff1a;一个开源硬件测试框架的诞生最近在折腾一些嵌入式开发和硬件原型项目&#xff0c;发现一个挺普遍的问题&#xff1a;当你手头有一堆传感器、执行器或者自己设计的电路板时&#xff0c;怎么高效、可靠地对它们进行功能测试和性能验证&#xff1f;用万用表…...

深入u-boot目录结构:以全志V3s的LicheePi Zero为例,理解每个文件夹的作用

深入解析u-boot目录结构&#xff1a;全志V3s平台下的LicheePi Zero实践指南 当你第一次打开u-boot源码仓库时&#xff0c;面对密密麻麻的目录结构可能会感到无从下手。作为嵌入式系统开发中至关重要的启动加载程序&#xff0c;u-boot的架构设计既体现了通用性又兼顾了平台特异…...

OpenSpeedy:终极免费游戏变速工具完整使用指南

OpenSpeedy&#xff1a;终极免费游戏变速工具完整使用指南 【免费下载链接】OpenSpeedy &#x1f3ae; An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy OpenSpeedy是一款完全免费且开源的Windows游戏加速工具&#xff0c…...

程序员转智能体开发,从入门到落地,看这一篇就够了

文章目录前言一、为什么2026年是转智能体开发的最佳时机1.1 市场需求爆炸式增长&#xff0c;薪资再创新高1.2 传统程序员转型有三大天然优势二、智能体开发到底是什么&#xff1f;和传统开发有什么区别&#xff1f;2.1 从"命令式"到"声明式"的思维转变2.2 …...