面试时 Redis 内存淘汰总被问,但是总答不好,怎么解决

大厂面试官问我:Redis内存淘汰,LRU维护整个队列吗?【后端八股文四:Redis内存淘汰策略八股文合集】 大家第一眼看到这个标题,不知道心中是否有答案了?在面试当中,面试官经常对项目亮点进行深挖,来考察你对这个项目亮点的理解以及思考!这个时候,你如果可以回答出面试官的问题,甚至是,那在面试中是大大加分的~ 阅读详情
  • 3.1处,不是本节点处理,直接返回ask,指示客户端转向

  • 4处,判断是否设置了maxMemory,这里就是本文重点:设置了maxMemory时,内存淘汰策略

  • 4.1处,调用了下方的 freeMemoryIfNeeded

接下来,深入4.1处:

int freeMemoryIfNeeded(void) {

size_t mem_used, mem_tofree, mem_freed;

int slaves = listLength(server.slaves);

/* Remove the size of slaves output buffers and AOF buffer from the

  • count of used memory. */

// 计算出 Redis 目前占用的内存总数,但有两个方面的内存不会计算在内:

// 1)从服务器的输出缓冲区的内存

// 2)AOF 缓冲区的内存

mem_used = zmalloc_used_memory();

if (slaves) {

…

}

if (server.aof_state != REDIS_AOF_OFF) {

mem_used -= sdslen(server.aof_buf);

mem_used -= aofRewriteBufferSize();

}

/* Check if we are over the memory limit. */

//1 如果目前使用的内存大小比设置的 maxmemory 要小,那么无须执行进一步操作

if (mem_used <= server.maxmemory) return REDIS_OK;

//2 如果占用内存比 maxmemory 要大,但是 maxmemory 策略为不淘汰,那么直接返回

if (server.maxmemory_policy == REDIS_MAXMEMORY_NO_EVICTION)

return REDIS_ERR; /* We need to free memory, but policy forbids. */

/* Compute how much memory we need to free. */

// 3 计算需要释放多少字节的内存

mem_tofree = mem_used - server.maxmemory;

// 初始化已释放内存的字节数为 0

mem_freed = 0;

// 根据 maxmemory 策略,

//4 遍历字典,释放内存并记录被释放内存的字节数

while (mem_freed < mem_tofree) {

int j, k, keys_freed = 0;

// 遍历所有字典

for (j = 0; j < server.dbnum; j++) {

long bestval = 0; /* just to prevent warning */

sds bestkey = NULL;

dictEntry *de;

redisDb *db = server.db + j;

dict *dict;

if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU ||

server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_RANDOM) {

// 如果策略是 allkeys-lru 或者 allkeys-random

//5 那么淘汰的目标为所有数据库键

dict = server.db[j].dict;

} else {

// 如果策略是 volatile-lru 、 volatile-random 或者 volatile-ttl

//6 那么淘汰的目标为带过期时间的数据库键

dict = server.db[j].expires;

}

/* volatile-random and allkeys-random policy */

// 如果使用的是随机策略,那么从目标字典中随机选出键

if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_RANDOM ||

server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_RANDOM) {

de = dictGetRandomKey(dict);

bestkey = dictGetKey(de);

}

/* volatile-lru and allkeys-lru policy */

//7

else if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU ||

server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU) {

struct evictionPoolEntry *pool = db->eviction_pool;

while (bestkey == NULL) {

// 8

evictionPoolPopulate(dict, db->dict, db->eviction_pool);

/* Go backward from best to worst element to evict. */

for (k = REDIS_EVICTION_POOL_SIZE - 1; k >= 0; k–) {

if (pool[k].key == NULL) continue;

// 8.1

de = dictFind(dict, pool[k].key);

/* 8.2 Remove the entry from the pool. */

sdsfree(pool[k].key);

/* Shift all elements on its right to left. */

memmove(pool + k, pool + k + 1,

sizeof(pool[0]) * (REDIS_EVICTION_POOL_SIZE - k - 1));

/* Clear the element on the right which is empty

  • since we shifted one position to the left. */

pool[REDIS_EVICTION_POOL_SIZE - 1].key = NULL;

pool[REDIS_EVICTION_POOL_SIZE - 1].idle = 0;

/* If the key exists, is our pick. Otherwise it is

  • a ghost and we need to try the next element. */

// 8.3

if (de) {

bestkey = dictGetKey(de);

break;

} else {

/* Ghost… */

continue;

}

}

}

}

/* volatile-ttl */

// 策略为 volatile-ttl ,从一集 sample 键中选出过期时间距离当前时间最接近的键

else if (server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_TTL) {

…

}

/* Finally remove the selected key. */

// 8.4 删除被选中的键

if (bestkey) {

long long delta;

robj *keyobj = createStringObject(bestkey, sdslen(bestkey));

propagateExpire(db, keyobj);

/* We compute the amount of memory freed by dbDelete() alone.

  • It is possible that actually the memory needed to propagate

  • the DEL in AOF and replication link is greater than the one

  • we are freeing removing the key, but we can’t account for

  • that otherwise we would never exit the loop.

  • AOF and Output buffer memory will be freed eventually so

  • we only care about memory used by the key space. */

// 计算删除键所释放的内存数量

delta = (long long) zmalloc_used_memory();

dbDelete(db, keyobj);

delta -= (long long) zmalloc_used_memory();

mem_freed += delta;

// 对淘汰键的计数器增一

server.stat_evictedkeys++;

notifyKeyspaceEvent(REDIS_NOTIFY_EVICTED, “evicted”,

keyobj, db->id);

decrRefCount(keyobj);

keys_freed++;

…

}

}

if (!keys_freed) return REDIS_ERR; /* nothing to free… */

}

return REDIS_OK;

}

  • 1处,如果目前使用的内存大小比设置的 maxmemory 要小,那么无须执行进一步操作

  • 2处,如果占用内存比 maxmemory 要大,但是 maxmemory 策略为不淘汰,那么直接返回

  • 3处,计算需要释放多少字节的内存

  • 4处,遍历字典,释放内存并记录被释放内存的字节数

  • 5处,如果策略是 allkeys-lru 或者 allkeys-random 那么淘汰的目标为所有数据库键

  • 6处,如果策略是 volatile-lru 、 volatile-random 或者 volatile-ttl ,那么淘汰的目标为带过期时间的数据库键

  • 7处,如果使用的是 LRU 策略, 那么从 sample 键中选出 IDLE 时间最长的那个键

  • 8处,调用evictionPoolPopulate,该函数在下面讲解,该函数的功能是,传入一个链表,即这里的db->eviction_pool,然后在函数内部,随机找出n个key,放入传入的链表中,并按照空闲时间排序,空闲最久的,放到最后。

当该函数,返回后,db->eviction_pool这个链表里就存放了我们要淘汰的key。

  • 8.1处,找到这个key,这个key,在后边会被删除

  • 8.2处,下面这一段,从db->eviction_pool将这个已经处理了的key删掉

  • 8.3处,如果这个key,是存在的,则跳出循环,在后面8.4处,会被删除

  • 8.4处,删除这个key

选择哪些key作为被淘汰的key


前面我们看到,在7处,如果为lru策略,则会进入8处的函数:

evictionPoolPopulate。

该函数的名称为:填充(populate)驱逐(eviction)对象池(pool)。驱逐的意思,就是现在达到了maxmemory,没办法,只能开始删除掉一部分元素,来腾空间了,不然新的put类型的命令,根本没办法执行。

该方法的大概思路是,使用lru的时候,随机找n个key,类似于抽样,然后放到一个链表,根据空闲时间排序。

具体看看该方法的实现:

void evictionPoolPopulate(dict *sampledict, dict *keydict, struct evictionPoolEntry *pool) {

其中,传入的第三个参数,是要被填充的对象,在c语言中,习惯传入一个入参,然后在函数内部填充或者修改入参对象的属性。

该属性,就是前面说的那个链表,用来存放收集的随机的元素,该链表中节点的结构如下:

struct evictionPoolEntry {

unsigned long long idle; /* Object idle time. */

sds key; /* Key name. */

};

该结构共2个字段,一个存储key,一个存储空闲时间。

该链表中,共maxmemory-samples个元素,会按照idle时间长短排序,idle时间长的在链表尾部,(假设头在左,尾在右)。

void evictionPoolPopulate(dict *sampledict, dict *keydict, struct evictionPoolEntry *pool) {

int j, k, count;

dictEntry *_samples[EVICTION_SAMPLES_ARRAY_SIZE];

dictEntry **samples;

/* Try to use a static buffer: this function is a big hit…

  • Note: it was actually measured that this helps. */

if (server.maxmemory_samples <= EVICTION_SAMPLES_ARRAY_SIZE) {

samples = _samples;

} else {

samples = zmalloc(sizeof(samples[0]) * server.maxmemory_samples);

}

/* 1 Use bulk get by default. */

count = dictGetRandomKeys(sampledict, samples, server.maxmemory_samples);

// 2

for (j = 0; j < count; j++) {

unsigned long long idle;

sds key;

robj *o;

dictEntry *de;

de = samples[j];

key = dictGetKey(de);

/* If the dictionary we are sampling from is not the main

  • dictionary (but the expires one) we need to lookup the key

  • again in the key dictionary to obtain the value object. */

if (sampledict != keydict) de = dictFind(keydict, key);

// 3

o = dictGetVal(de);

// 4

idle = estimateObjectIdleTime(o);

/* 5 Insert the element inside the pool.

  • First, find the first empty bucket or the first populated

  • bucket that has an idle time smaller than our idle time. */

k = 0;

while (k < REDIS_EVICTION_POOL_SIZE &&

pool[k].key &&

pool[k].idle < idle)

k++;

…

// 6

pool[k].key = sdsdup(key);

pool[k].idle = idle;

}

if (samples != _samples) zfree(samples);

}

  • 1处,获取 server.maxmemory_samples个key,这里是随机获取的,(dictGetRandomKeys),这个值,默认值为5,放到samples中

  • 2处,遍历返回来的samples

  • 3处,调用如下宏,获取val

he的类型为dictEntry:

/*

  • 哈希表节点

*/

typedef struct dictEntry {

// 键

void *key;

// 值

union {

// 1

void *val;

uint64_t u64;

int64_t s64;

} v;

// 指向下个哈希表节点,形成链表

struct dictEntry *next;

} dictEntry;

所以,这里去

Copy

robj *o;

o = dictGetVal(de);

实际就是获取其v属性中的val,(1处):

robj *o;

o = dictGetVal(de);

  • 4处,准备计算该val的空闲时间

我们上面3处,看到,获取的o的类型为robj。我们现在看看怎么计算对象的空闲时长:

/* Given an object returns the min number of milliseconds the object was never

  • requested, using an approximated LRU algorithm. */

unsigned long long estimateObjectIdleTime(robj *o) {

//4.1 获取系统的当前时间

unsigned long long lruclock = LRU_CLOCK();

// 4.2

if (lruclock >= o->lru) {

// 4.3

return (lruclock - o->lru) * REDIS_LRU_CLOCK_RESOLUTION;

} else {

return (lruclock + (REDIS_LRU_CLOCK_MAX - o->lru)) *

REDIS_LRU_CLOCK_RESOLUTION;

}

}

这里,4.1处,获取系统的当前时间;

4.2处,如果系统时间,大于对象的lru时间

4.3处,则用系统时间减去对象的lru时间,再乘以单位,换算为毫秒,最终返回的单位,为毫秒(可以看注释。)

#define REDIS_LRU_CLOCK_RESOLUTION 1000 /* LRU clock resolution in ms */

  • 5处,这里拿当前元素,和pool中已经放进去的元素,从第0个开始比较,如果当前元素的idle时长,大于pool中指针0指向的元素,则和pool中索引1的元素比较;直到条件不满足为止。

这句话意思就是,类似于冒泡,把当前元素一直往后冒,直到idle时长小于被比较的元素为止。

  • 6处,把当前元素放进pool中。

经过上面的处理后,链表中存放了全部的抽样元素,且ide时间最长的,在最右边。

对象还有字段存储空闲时间?


前面4处,说到,用系统的当前时间,减去对象的lru时间。

大家看看对象的结构体

typedef struct redisObject {

// 类型

unsigned type:4;

// 编码

unsigned encoding:4;

//1 对象最后一次被访问的时间

unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */

// 引用计数

int refcount;

// 指向实际值的指针

void *ptr;

} robj;

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

架构学习资料

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

robj;

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-HKD1yQQm-1710439069771)]
[外链图片转存中…(img-EJKuq6Yt-1710439069773)]
[外链图片转存中…(img-Nit0bbT5-1710439069774)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-6tqqs2HR-1710439069774)]

架构学习资料

[外链图片转存中…(img-JXELLu7Y-1710439069775)]

[外链图片转存中…(img-d47LnwGf-1710439069775)]

[外链图片转存中…(img-1y2MCuLi-1710439069776)]

[外链图片转存中…(img-QQV6H5Pe-1710439069776)]

[外链图片转存中…(img-fwRPZquP-1710439069777)]

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

什么是PON(无源光纤网络)、PON的发展及演进 全球知名媒体Omdia在光纤和铜缆接入设备预测报告中对2022年2月的预测显示,PON设备端口收入预计在2020年至2027年期间以12.3%的年复合增长率增长,到2027年将达到163亿美元,远高于2020年的82亿美元。 此前,Omdia有份报告称,在3月份举行的美国OFC展会中,众多 CSP 正在顺利部署 XGS PON(10G 对称),其他 CSP 专注于基于 GPON 的低速 FTTH 服务。另外关于25G PON 和 50G PON 之间的争论仍在继续,而Omdia 认为 25G PON 和 5 阅读详情

相关推荐

Ubuntu 24.04下Loki+Alloy+Grafana日志分析系统的快速部署与实践

本文详细介绍了在Ubuntu 24.04系统上快速部署Loki+Alloy+Grafana轻量级日志分析系统的完整流程。通过二进制安装Loki、配置Alloy采集器以及设置Grafana可视化界面,构建了一套资源消耗低、易于管理的日志解决方案,并实战演示了如何采集和分析网络设备日志,特别适合资源有限的中小团队或边缘计算场景。

tensor9flow的博客 238

【redis】 redis 6.0 驱逐key Pool计算方式 如何完成采样? 阅读源码 evictionPoolPopulate(i, dict, db->dict, p

1.evictionPoolPopulate 算法 // src/evict.c 从左到右 idl time 递增 /* This is an helper function for freeMemoryIfNeeded(), it is used in order * to populate the evictionPool with a few entries every time we want to * expire a key. Keys with idle time smaller...

qfzhangwei的专栏 755

mt7601 kernel 4.19内核集成版本,以及源码编译相关问题

/os/linux/Makefile.6文件: 添加 EXTRA_CFLAGS += -Wno-incompatible-pointer-types -Wno-date-time。看下iwpriv与iwconfig的源码区别,左侧为iwconfig ,没有用到ioctl,右侧为iwpriv。1、init_timer kernel 4.19内核版本API已经改变,使用timer_setup。使用iwpriv 提示如下,iwpriv工具无法使用了,而iwconfig可以使用。makefile的修改。

1592

redis的过期键删除策略

Redis 中 key 的过期删除策略 Redis 中提供了三种过期删除的策略 1、定时删除 在设置某个 key 的过期时间同时,我们创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作。 优点: 通过使用定时器,可以保证过期 key 可以被尽快的删除,并且释放过期 key 所占用的内存 缺点: 对 CPU 是不友好的,当过期键比较多的时候,删除过期 key 会占用相当一部分的 CPU 资源,对服务器的响应时间和吞吐量造

LJZFlying的博客 5956

Spring AI + RAG 构建电商智能客服:从 PDF 文档解析到精准问答的全链路实战

核心框架:向量数据库:- PostgreSQL + pgvector (生产推荐)- Redis Stack (轻量级方案)- ChromaDB (快速原型)文档解析:- Apache PDFBox: PDF 文本提取- Spring AI Document Readers: 结构化解析大模型:- 阿里云百炼 (DashScope)- 本地部署:Qwen/ChatGLM/*** 电商领域实体*/@Data@Builder@ToString/*** 商品类型。

一起修行,不孤单。这里有编程语言、开发工具、学习方法论和踩坑笔记。用简单的话说复杂的事,陪你从小白到进阶。周更干货,欢迎一起成长! 383

宝塔面板+pbootCMS建站全流程:从服务器选购到上线优化(附常见问题排查)

本文提供了一份详尽的宝塔面板与pbootCMS建站实战指南。内容涵盖从云服务器选购、宝塔面板部署与安全加固,到pbootCMS安装、权限配置、数据库连接等核心步骤。同时深入讲解了PHP环境优化、Nginx伪静态设置、缓存开启等性能与SEO优化技巧,并附有常见问题排查与后期维护建议,帮助用户高效、稳健地完成专业网站构建。

e4f5g6h的博客 661

Redis:内存淘汰机制

参考资料:《Redis的LRU缓存淘汰算法实现》《一文读懂Redis内存淘汰策略》《Redis 的过期策略和内存淘汰机制有什么区别》《Redis内存淘汰策略》写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。目录一、内存管理二、过期策略 1、定期删除 2、惰性删除三、内存淘汰 1、LRU 2、LFU四、近似LRU Redis通过将热点数据存储到内存中实现了高效的数据读取,但是内存如果使用不当也是会造成一些问题的。

CRUD工程师 1万+

手把手教你用Deep Single-Image Portrait Relighting实现人像光影重塑(附GitHub代码)

本文提供了一份详细的实战指南,手把手教你利用Deep Single-Image Portrait Relighting技术实现人像光影重塑。文章从环境搭建、核心原理拆解出发,逐步指导构建简易重光照流程,并探讨了使用预训练模型进行效果优化的进阶方法,最后附上避坑指南与常见问题排查,帮助开发者快速上手这一AI图像处理技术。

weixin_29065015的博客 316

源码角度详解Redis缓存淘汰机制(Eviction)

本文从源码层面分析了 redis 的缓存淘汰机制,并在文章末尾描述使用 Java 实现的思路,以供参考。 相关配置 为了适配用作缓存的场景,redis 支持缓存淘汰(eviction)并提供相应的了配置项: maxmemory 设置内存使用上限,该值不能设置为小于 1M 的容量。 选项的默认值为 0,此时系统会自行计算一个内存上限。 maxmemory-policy 熟悉 redis 的朋友都知道,每个数据库维护了两个字典: db.dict :数据库中所有键值对,也被称作数据库的 keysp

weixin_50205273的博客 822

基于STM32的HC-SR04超声波模块测距(新手级)

本人是嵌入式新手,学习了STM32的部分内容,最近想找些项目做,然后顺便学习了一下HC-SR04超声波模块,学习过程中也参考了一些大佬的文章。本文记录了自己的学习方法和学习过程,同时也希望能和各位大佬交流讨论。

weixin_63758495的博客 2206

U盘无法识别?一条命令轻松修复,数据不丢失

问题描述 U盘经常会遇到提示:无法识别或者需要重新格式等问题,例如下图 修复方法 WIN+R输入cmd 输入chkdsk+盘符:/F /F是修复的意思 更多内容 U盘无法识别或提示需要格式化?别急着格式化丢失数据!本文教你使用Windows自带的命令快速修复U盘文件系统错误,简单几步就能解决问题,让你的U盘恢复正常使用💾✨

XiaoqiangClub的博客 646

redis evict.c内存淘汰机制的源码分析

redis是一个内存数据库,当数据变多之后,就要淘汰一些键值对,使得内存有足够的空间来保存新的键值对。

wade1991的专栏 2914

Qt/C++编写自定义控件49-飞机仪表盘

一、前言 飞行仪表是测定和表示飞机数据的工具,飞机中必不可少的一部分,飞行员根据飞行仪表表示的数据才能正确地做出判断。一般飞机仪表包括高度表+空速表+垂直速率表+姿态仪+航向指示表+转弯协调表。 这次要绘制的是其中的姿势仪,显示飞机相对于地平线的姿态,看姿态仪,飞行员能判断飞机姿态为偏左偏右,及偏上和偏下。姿态仪作用原理为一高度旋转的陀螺,不论飞机的姿态如何变化,此陀螺的定轴性在空间保持相同,因而...

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 7026

面试时 Redis 内存淘汰总被问,但是总答不好,怎么解决?

大家有没有更清楚一些呢?总的来说,就是,设置了max-memory后,达到该内存限制后,会在处理命令时,检查是否要进行内存淘汰;如果要淘汰,则根据maxmemory-policy的策略来。随机选择maxmemory-sample个元素,按照空闲时间排序,拉链表;挨个挨个清除。

weixin_74412978的博客 942

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

面试时 Redis 内存淘汰总被问,但是总答不好,怎么解决?(1)

在这里,由于面试中MySQL问的比较多,因此也就在此以MySQL为例为大家总结分享。但是你要学习的往往不止这一点,还有一些主流框架的使用,Spring源码的学习,Mybatis源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)一个人可以走的很快,但一群人才能走的更远!

2401_84440157的博客 1075

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

面试时 Redis 内存淘汰总被问,但是总答不好,怎么解决?(2)

2020年在匆匆忙忙慌慌乱乱中就这么度过了,我们迎来了新一年,互联网的发展如此之快,技术日新月异,更新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。更多JVM面试整理:网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)一个人可以走的很快,但一群人才能走的更远!

2401_84440199的博客 716

redis 设置不过期_面试时 Redis 内存淘汰总被问,但是总答不好,怎么解决?

什么是内存淘汰内存淘汰,和平时我们设置redis key的过期时间,不是一回事;内存淘汰是说,假设我们限定redis只能使用8g内存,现在已经使用了这么多了(包括设置了过期时间的key和没设过期时间的key),那,后续的set操作,还怎么办呢?是不是只能报错了?那不行啊,不科学吧,因为有的key,可能已经很久没人用了,可能以后也不会再用到了,那我们是不是可以把这类key给干掉呢?干掉key的过程,...

weixin_39954682的博客 214

默认库删了怎么加回来_面试时 Redis 内存淘汰总被问,但是总答不好,怎么解决?...

什么是内存淘汰内存淘汰,和平时我们设置redis key的过期时间,不是一回事;内存淘汰是说,假设我们限定redis只能使用8g内存,现在已经使用了这么多了(包括设置了过期时间的key和没设过期时间的key),那,后续的set操作,还怎么办呢?是不是只能报错了?那不行啊,不科学吧,因为有的key,可能已经很久没人用了,可能以后也不会再用到了,那我们是不是可以把这类key给干掉呢?干掉key的过程,...

weixin_39607473的博客 108

Redis 内存淘汰策略 (史上最全)

1.前言 Redis内存淘汰策略,是被很多小伙伴忽略的知识盲区,注意,是盲区。 注意,Redis如果内存淘汰策略配置不合理,可能会导致Redis无法服务。 所以,使用此文,对Redis内存淘汰策略专门进行介绍。 此文内容,将收入电子书《Java面试红宝书》的0.2版本中。看完此书,您一定会Java内力大增。 首先,介绍一下Redis过期删除策略,然后,再介绍Redis淘汰策略. 1 Redis过期删除策略 Redis对于过期的key,有两种删除策略: 定期删除 惰性删除 定期删除 redis 会

架构师尼恩 2万+

【面试题】 Redis内存淘汰机制,真是这样的吗?

博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主。

激流丶的博客 2152

5问5答:Redis 内存数据满了,会宕机吗?

亲爱的小伙伴们,你们是否在面试中遇到过这样的问题:“Redis 内存数据满了,会宕机吗?”别担心,今天我们就来深度剖析这个问题,通过详细的步骤和代码注释,让你彻底掌握 Redis 内存管理的精髓。无论你是面试新手还是经验丰富的开发者,这篇文章都能帮你轻松应对面试中的难题!🌟通过这篇详细的文章,相信你已经学会了如何处理 Redis 内存数据满了的情况。无论是在面试中还是实际工作中,这些知识都能帮助你更好地管理和优化 Redis。如果你还有任何疑问或建议,欢迎在评论区留言交流哦!

java专栏 1130

【征服redis6】Redis的内存淘汰详解

数据库存储会将数据保存到磁盘中,而Redis的核心数据是在内存中的,而Redis本身主要用来做缓存,当 Redis 的内存达到最大限制时,会发生什么情况?redis 会怎么处理呢?Redis性能很高,官方给的数据 读:110000次/s,写 81000次/s。但是长期使用,Key会不断增加,Redis作为缓存使用,物理内存也会满,内存与硬盘交换(swap)虚拟内存也会被占满,频繁的IO操作会导致性能急剧下降。

纵横千里 捭阖四方 的专栏 1323

面试必问:Redis 过期删除与内存淘汰策略,看完这篇就够了

Redis采用惰性删除+定期删除策略管理过期键值:访问时检查过期并删除(惰性删除),同时定期随机抽查20个key删除过期数据(超过25%过期则继续抽查)。内存淘汰策略在内存不足时触发,分为不淘汰(报错)和淘汰策略(随机/LRU/LFU等)。32位系统最大支持3GB内存。两种策略的区别在于:过期删除针对已过期数据,内存淘汰针对内存不足时的数据清理。不过期立即删除是为了避免大量删除操作占用CPU资源,影响系统性能。

2504_94294476的博客 1326

阿里面试让聊一聊Redis 的内存淘汰(驱逐)策略

以上是 V 哥整理的笔记,分享给你,欢迎关注威哥爱编程,专注技术学习与成长,绝不躺平。

威哥爱编程,华为 HDE,鸿蒙极客、优快云博客专家、《鸿蒙 HarmonyOS 5/6 开发之路》系列图书第一作者 1831
上一篇: 缓存穿透及解决方案(干货篇),Java程序员必备
下一篇: 17,BAT大厂最爱问的Android核心面试百题详细解析
普通网友
博客等级 码龄5年 4697粉丝 610原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值