首页 > 数据库 >Redis内存管理——针对实习面试

Redis内存管理——针对实习面试

时间:2024-11-07 08:48:57浏览次数:3  
标签:Key 删除 过期 Redis 内存 key 实习

目录

Redis内存管理

在这里插入图片描述

Redis的内存淘汰机制有哪些?

Redis的内存淘汰机制主要包括以下几种策略:

  1. noeviction:这是默认策略,当内存使用达到限制时,Redis会拒绝新的写入操作,并返回错误,但不会淘汰任何数据。

  2. allkeys-lru:在所有键中,基于最近最少使用(LRU)算法淘汰数据。Redis会维护一个近似的LRU列表,并不保证完全精确,但是对大多数使用场景来说是足够的。

  3. allkeys-lfu:在所有键中,基于最少频率使用(LFU)算法淘汰数据。LFU算法会跟踪每个键的访问频率,并淘汰访问频率最低的键。

  4. volatile-lru:仅在设置了过期时间的键中,基于LRU算法淘汰数据。

  5. volatile-lfu:仅在设置了过期时间的键中,基于LFU算法淘汰数据。

  6. volatile-random:在设置了过期时间的键随机选择淘汰。

  7. allkeys-random:在所有键中随机选择淘汰。

  8. volatile-ttl:在设置了过期时间的键中,淘汰那些TTL(Time To Live)值最小的键,也就是即将过期的键。

说说过期的数据的删除策略?

Redis处理过期数据的删除策略主要包括两种:惰性删除(Lazy Expiration)和定期删除(Active Expiration)。

  1. 惰性删除(Lazy Expiration)

    • 这种方式是在客户端尝试访问一个键时,Redis会检查该键是否已经过期。如果键已过期,Redis会立即删除该键并返回空值。这种方式确保了过期键不会返回给客户端,但并不保证立即从内存中删除。
  2. 定期删除(Active Expiration)

    • Redis还会使用定期删除来清除过期键。定期删除是通过每秒执行一定数量的随机键的过期检查和删除操作来实现的。Redis会在后台线程中执行这些操作,以确保过期键从内存中被及时清除。
    • Redis默认每秒进行10次过期扫描,每次从过期字典中随机选出20个key,删除这20个key中已经过期的key。如果过期的key的比例超过1/4,那就重复步骤(1)。这种定期的清理操作确保了即便某些Key长时间未被访问,也能在一定时间内被删除,防止内存过度占用。

这两种策略的结合使用,使得Redis能够在合理使用CPU时间和避免内存浪费之间取得平衡
惰性删除确保了过期键不会被访问而定期删除则确保了过期键能够及时从内存中清除
通过合理配置这两种策略,Redis能够有效地管理内存中的过期数据。

Redis是如何判断数据是否过期的?

Redis判断数据是否过期的主要机制是基于一个称为“过期字典”的数据结构。以下是具体的判断流程:

  1. 过期字典(expires dict):每当一个key被设置了一个过期时间,Redis就会将该key及其过期时间存储在一个专门的字典结构中,这个字典被称为过期字典。过期字典的键是指向数据库中的某个key对象的指针,而值是一个长整型整数,保存了该key的过期时间,这个时间是一个以毫秒为单位的UNIX时间戳。

  2. 查询时检查:当客户端尝试访问或修改一个key时,Redis会首先检查该key是否存在于过期字典中。如果存在,Redis会获取该key的过期时间,并与当前系统时间进行比较

  3. 过期时间对比:如果key的过期时间大于当前系统时间,那么Redis认为该key尚未过期,可以正常访问或修改。如果key的过期时间小于或等于当前系统时间,Redis则认为该key已经过期,需要进行删除处理

  4. 惰性删除与定期删除:Redis采用了惰性删除定期删除两种策略来处理过期的key。惰性删除是指在访问key时才检查是否过期,而定期删除则是Redis定期检查并删除过期的key

通过这种机制,Redis能够有效地管理带有过期时间的key,确保过期的数据不会被访问,并在适当的时候释放内存空间。

Redis如何处理大Key问题?

Redis处理大Key问题可以采取以下几种策略:

  1. 拆分大Key将一个大Key拆分成多个小Key,减少单个操作对性能的影响。例如,可以将一个大的列表拆分为多个小列表,或者将一个大的哈希表拆分为多个小哈希表。

  2. 使用Hash结构:对于具有多个属性的对象,使用Redis的Hash类型存储,将大Key拆分成多个Field(字段),有效减少内存使用并提高性能。

  3. 数据压缩对要存储的数据进行压缩,压缩之后再进行存储,以减少大Key的内存占用。

  4. 选择合适的数据结构根据数据的特性选择合适的Redis数据结构,比如一些用String存储的场景,可以考虑使用Hash、Set等结构进行优化。

  5. 限制大Key的大小:在应用层面,可以限制存储到Redis中的Key的最大大小,例如,在写入数据之前检查数据的大小,并进行必要的切分。

  6. 使用Redis集群:采用Redis集群方式进行部署,然后将大Key散落到不同的服务器上面,加快响应速度。

  7. 定期监控和清理:定期监控Redis实例中的大Key,并根据需要进行清理。可以使用定期的自动化脚本检查和处理大Key,以确保Redis实例的稳定性。

  8. 异步删除:使用Redis 4.0+版本的UNLINK命令异步删除大Key,减少对Redis性能的影响。

  9. 数据分页:对大集合进行分页读取,避免一次性加载大量数据。

  10. 监控和预警:通过监控工具及时发现大Key问题,并设置预警机制。

  11. 数据过期:对于大key中不经常使用的数据,可以利用Redis的过期特性,设置合理的过期时间,使其自动删除,从而降低内存占用。

  12. 数据压缩:对于大key中的数据,可以考虑使用压缩算法进行压缩存储,以减少其占用的内存空间。

这些策略可以帮助优化Redis中的大Key问题,提高Redis的性能和稳定性。

标签:Key,删除,过期,Redis,内存,key,实习
From: https://blog.csdn.net/weixin_73527957/article/details/143503288

相关文章

  • Redis4:Redis的Java客户端
    欢迎来到“雪碧聊技术”CSDN博客!在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目......
  • malloc分配内存失败会导致什么问题?
    malloc 是C标准库中的一个函数,用于动态分配内存。接下来解释分配内存失败的原因,危害以及解决方法。原因内存不足:操作系统的可用内存不足以满足请求的分配。这可能是由于系统中正在运行的程序占用了大量内存。请求的大小超出限制:请求分配的内存块过大,超出了系统的内存......
  • 操作系统:内核基础实现(三)内存分配的初步实现
    本随笔对应项目代码(更新中):https://github.com/himuhuan/HimuOS位图的实现KrBitMap结构用作任意长度的常规用途一维位图的标头.内核使用位图作为一种经济方式来跟踪一组可重用项。structKrBitMap{uint32_tLength;PRIVATE_DATA_MEMBERBYTE*_buffer;};voidKr......
  • #渗透测试#SRC漏洞挖掘# 操作系统-Linux系统基础04之内存管理
    免责声明本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅读。                            ......
  • Redis使用IO多路复用进行事件处理机制
    一、epoll多路复用这里重点要说的就是redis的IO编程模型,首先了解下为什么要有多路复用呢?案例引用知乎上一个高赞的回答来解释什么是I/O多路复用。假设你是一个老师,让30个学生解答一道题目,然后检查学生做的是否正确,你有下面几个选择:第一种选择:按顺序逐个检查,先检查A,然后是B,之后是C......
  • js内存泄漏几种方式及如何避免、内存溢出
    https://blog.csdn.net/Judy_qiudie/article/details/82845692 一、什么是内存泄漏(memoryleak)?参考阮一峰老师博客:http://www.ruanyifeng.com/blog/2017/04/memory-leak.html不再用到的内存,没有及时释放,就叫做内存泄漏(memoryleak)。程序的运行需要内存。只要程序提出要求,操......
  • 使用内存堆快照检测分离的 DOM 内存泄漏
    https://fe.okki.com/post/62cbfea7136f570343d89416/ 使用ChromeDevtools分析内存问题网页的内存限制对于Chrome浏览器,每个Tab页能使用的内存大小是有限制的。限制大小根据Chrome版本,Chrome位数(32/64),操作系统版本,会有所不同。可以通过window.performance.memory......
  • Redis集群高可用实战部署(Redis Cluster High Availability Practical Deployment)
     ......
  • Redis1:初识Redis
    欢迎来到“雪碧聊技术”CSDN博客!在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目......
  • 数据库Redis篇
    系列文章目录第一章C/C++语言篇第二章计算机网络篇第三章操作系统篇第四章数据库MySQL篇第五章数据库Redis篇第六章场景题/算法题第七篇常见HR问题篇本系列专栏:点击进入后端开发面经关注走一波秋招阶段,面过很多大中小厂,积攒了很多面经,都是高频问题!!!前言:本系......