理解Redis的内存回收机制和过期淘汰策略

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 还在等什么,快来一起讨论关注吧,公众号【八点半技术站】,欢迎加入社群

Hello,大家好。我是公众号 “八点半技术站” 的创作者 - Bruce.D。

今天是周二(2020-06-17),分享一句谚语 “读书有三到,心到口到眼到分享给大家的是 「缓存服务 模块」- 理解Redis的内存回收机制和过期淘汰策略。

欢迎热爱 IT编程的各位精英,欢迎进入wechat技术群(底部有二维码)一起交流成长。

花几分钟时间去浏览 redis 技术干货,或许对你有用!!!

底部有本篇文章的思维导图 ,供大家收藏使用~~~

image.gif编辑

01

今天写这篇文章的灵感,来自之前一位好友投稿的面试题:redis 的过期策略有哪些?内存淘汰机制有哪些?我将工作中遇到的问题分析,整理成一篇文章提供大家学习,希望对大家有所帮助。

我们从一次广告数据问题说起:一个依赖定时器任务的生成接口数据,有时候会有,有时候没有。

然后我们分析应该是redis过期删除策略导致。

排查过程中,因为手动执行定时器,set数据没有报错,但是set后不生效。这就狠尴尬。

发现,set 没有报错,但是 set 完毕在查的情况下,发现没有数据。开始怀疑 redis 的过期策略(准确来说应该是 redis 的内存回收机制中的数据淘汰策略触发内存上限淘汰数据),导致新加入的的redis的数据都被丢弃了。

最终发现故障是因为配置问题,导致数据错误。(有时候也会因为内存满)

在这里我主要希望大家明白,我们遇到类似问题,如何有效证明正确性,以及什么情况下怀疑内存回收才是合理,所以内存回收机制的一系列问题,你也要知道了解。

02

Q:为什么需要内存回收?

A:第一种:在redis 中,set 指令可以指定 key 的过期时间,当过期时间达到以后,key 就会失效。

第二种:redis 是基于内存操作的,所有的数据都是保存在内存中,一台机器的内存是很宝贵的。

分析:根据以上这俩种,为了保证 redis 提供有效可靠的服务,redis 需要一种机制清理不常用的、无效的、多余的数据,失效后的数据需要及时清理,这就需要内存回收。

03

redis 的内存回收主要分为:过期删除策略 与 内存淘汰策略 俩部分。

过期删除策略:删除到达过期时间的 key 。(过期删除策略原理 - 结合文章,百度自行搜索)

第一种:定时删除

对于每一个设置了过期时间的 key 都会创建一个定时器,一旦达到过期时间都会删除。这种方式立即清除过期数据,对内存比较好,

但是有缺点是:占用了大量 CPU 的资源去处理过期数据,会影响 redis 的吞吐量 和 响应时间。

第二种:惰性删除

当访问一个 key 的时候,才会判断该 key 是否过期,如果过期就删除。该方式能最大限度节省 CPU 的资源。

但是对内存不太好,有一种比较极端的情况:出现大量的过期 key 没有被再次访问,因为不会被清除,导致占用了大量的内存。

第三种:定期删除

每隔一段时间,扫描redis 中过期key 的字典,并清除部分过期的key。这种方式是前俩种一种折中方法。

不同的情况下,调整定时扫描时间间隔,让CPU 与 内存达到最优。

内存淘汰策略:redis 内存淘汰策略是指达到maxmemory极限时,使用某种算法来决定来清理哪些数据,以保证新数据存入。(原理同上)

redis的内存淘汰机制分为:

(1)noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。

(2)allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。

(3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key。

(4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key。

(5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。

(6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。

04

总结:看完这些,我们得知道一点,如何证明故障不是由于内存回收机制引起的?

根据上述分析,set 没有报错,但是不生效,那么就2种情况:

(1)设置过期时间过短

(2)内存超过最大限制,且设置的是noeviction或者allkeys-random。

因此,在遇到这种情况,首先看set的时候是否加了过期时间,且过期时间是否合理,如果过期时间较短,那么应该检查一下设计是否合理。

如果过期时间没问题,那就需要查看Redis的内存使用率,查看Redis的配置文件或者在Redis中使用info命令查看Redis的状态,maxmemory属性查看最大内存值。

如果是0,则没有限制,此时是通过total_system_memory限制,对比used_memory与Redis最大内存,查看内存使用率。

如果当前的内存使用率较大,那么就需要查看是否有配置最大内存,如果有且内存超了,那么就可以初步判定是内存回收机制导致key设置不成功,还需要查看内存淘汰算法是否noeviction或者allkeys-random.

如果是,则可以确认是redis的内存回收机制导致。

如果内存没有超,或者内存淘汰算法不是上面的两者,则还需要看看key是否已经过期,通过ttl查看key的存活时间。

如果运行了程序,set没有报错,则ttl应该马上更新,否则说明set失败,如果set失败了那么就应该查看操作的程序代码是否正确了。

全文思维导图:

image.gif编辑

恭喜你,又读完了一篇文章。

在这里,希望你看完的 每篇文章 都能对自己有所提升(哪怕是帮助你再次巩固记忆)。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 缓存 NoSQL
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
38 2
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
|
1月前
|
存储 缓存 NoSQL
Redis Quicklist 竟让内存占用狂降50%?
【10月更文挑战第11天】
40 2
|
1月前
|
设计模式 NoSQL 网络协议
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
37 2
|
2月前
|
缓存 NoSQL 算法
14)Redis 在内存用完时会怎么办?如何处理已过期的数据?
14)Redis 在内存用完时会怎么办?如何处理已过期的数据?
56 0
|
2月前
|
存储 缓存 NoSQL
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
71 0
|
2月前
|
存储 NoSQL Redis
Redis的RDB快照:保障数据持久性的关键机制
Redis的RDB快照:保障数据持久性的关键机制
53 0
|
2月前
|
存储 缓存 NoSQL
深入探究Redis的AOF持久化:保障数据安全与恢复性能的关键机制
深入探究Redis的AOF持久化:保障数据安全与恢复性能的关键机制
88 0
|
存储 NoSQL Redis
Redis内存使用优化与存储
Redis数据类型  最为常用的数据类型主要有五种:String, Hash, List, Set和SortedSet. redis内部使用一个redisObject对象来表示所有的key和value。
2070 0
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
74 6
|
7天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题