Redis系列11:内存淘汰策略
Redis系列1:深刻理解高性能Redis的本质
Redis系列2:数据持久化提高可用性
Redis系列3:高可用之主从架构
Redis系列4:高可用之Sentinel(哨兵模式)
Redis系列5:深入分析Cluster 集群模式
追求性能极致:Redis6.0的多线程模型
追求性能极致:客户端缓存带来的革命
Redis系列8:Bitmap实现亿万级数据计算
Redis系列9:Geo 类型赋能亿级地图位置计算
Redis系列10:HyperLogLog实现海量数据基数统计
1 前言
通过前面的一些文章我们知道,Redis的各项能力是基于内存实现的,相对其他的持久化存储(如MySQL、File等,数据持久化在磁盘上),性能会高很多,这也是高速缓存的一个优势。
但是问题来了,每一台机器内存终归是有限的,即使是集群模式,总的内存空间也是有限的,不能无限制的消耗。而在Redis的使用过程中,很有可能出现使用消耗超过内存实际大小的情况。比如以下几种情况:
- 未设置过期时间,Redis的Key将一直存在,直至我们明确将它删除。
- 过度跟不合理的持久化(无论是RDB快照 或是 AOF日志),都会在内存和磁盘中反复操作,需要一定的内存空间进行处理。
- 不及时清理过期缓存:清理过期缓存的方式主要有以下两种,并不是实时或者准实时,所以存在部分过期缓存依旧存在的问题。
- 主动定期删除: Redis 默认每 1 秒运行 10 次(平均每 100 ms 执行一次),每次随机抽取部分设置过期时间的 key,检查是否过期,若是过期就直接删除,直至过期的 key 比率低于 1/4。
- 被动惰性删除:缓存过期并不马上清理,当客户端的请求查询该 key 的时候,检查下 key 是否过期,如果过期,则删除该 key,重新获取。如果长时间未请求,就会有过期缓存滞留。
- 不合理不规范的使用缓存,导致内存耗尽,比如:
- 过度使用缓存,既缓存冷数据也能缓存热数据,导致内存占用过多,性能也没有得到有效提高
- 缓存数量过多或者单个缓存的Value体积过大
- 缓存过期时间设置过长或者根本不设置
2 Redis内存淘汰策略
所以,如果放任上面的那几种情况,内存终归会满的,Redis自身有一套比较完善的内存淘汰策略来专门应对这个问题,在Redis Memory占用超过我们配置的阈值的时候触发策略执行。
# redis.conf 配置最大内存空间占用为2gb,超过则执行内存淘汰策略
redis > CONFIG SET maxmemory 2gb
内存淘汰策略一共有8中,除了一种不执行淘汰策略之外,其他7种都是按照各自不一的算法对内存中现有的数据进行处理。
我们下面详细来看一下这些淘汰策略,把他们分成三大类,8小类来逐一讲解:
2.1 不淘汰策略
2.1.1 noeviction 不淘汰策略
noeviction指的是即使资源超过 maxmemory 限制的值也不会执行淘汰,只是不允许创建新的缓存了。
当Redis内存占用达到我们上面的配置的阈值(比如 5gb)之后,就不允许新增缓存key了,当有新的缓存要创建的时候,Redis 直接返回error。
2.2 仅淘汰配置过期时间key
这边仅针对配置了过期时间的数据进行淘汰
2.3.1 volatile-lru :删除最近最少使用的key
LRU(Least Recently Used)是按照最近最少使用原则来筛选数据,即最不常用的数据会被筛选出来。
如果我们的服务中有冷热数据隔离需求,这无疑是一个比较好的办法。可以将缓存的一些不经常使用的冷数据,而且数据size比较大的,筛选出来清理掉。而近期频繁被使用的key就被保留下来了。
常见的场景如下:
- 电商平台的冷热数据:比如冬季,保暖冬装、电暖设备的浏览次数就会升高,而相应的冷饮、制冷设备(冰箱、空调)的浏览次数就会降低,那么LRU策略下优先删除的就是最近一段时间未访问的缓存信息。
- 外卖平台:每天的1113点,1719点,一定是美食外卖品种的高频率访问时间段,而日用品、果蔬生鲜 大都会避开这个高峰期,这时如果内存不够用了,那么就会成为被优先删除的缓存类型。
2.3.2 volatile-lfu:删除访问次数最少的key(4.0 之后新增的策略)
LRU算法的不足之处在于,一个本身很少被访问的key,只是刚刚被访问了1次,就被认为是最近有使用的热点数据,导致短时间内不会被淘汰。
而LFU弥补了这个不足,LFU(Least Frequently Used)淘汰策略会根据key的最近访问频率进行淘汰,解决上面说的这个不足。
- LFU在LRU的基础上,为每个数据增加了一个计数器,用于统计该数据的访问次数。
- 当使用LFU策略淘汰数据时,会根据数据的访问次数进行筛选,把访问次数最低的数据淘汰出内存。
- 如果两个缓存数据的访问次数相同,LFU再比较这两个key最近一次的访问时间,把访问时间更早的缓存key淘汰出内存。
常见的应用场景:
- 对于电商平台中的冷门的商品,电子书App中热度较低、阅读量较低的书籍。这种类型的缓存会优先被淘汰掉。
2.3.3 volatile-random:随机删除过期key
针对有配置过期时间,但没有明显的冷热访问频率区别,所有的查询分布比较均衡的数据。这时候就使用 allkeys-random 策略吧,让它随机选择需要淘汰数据,也相对公平。
常见的使用场景有:
- 电商平台:常规时段的商品浏览。
- 钉钉之类工具:老师无差别抽查学生的作业。
2.3.4 volatile-ttl:删除过期时间内剩余时间最短的key
这个特性仅限于配置过期时间的场景,它是根据当前时间 跟 过期时间的差额进行由短到长的排序,较短的优先淘汰。
asc_sort(validate_time - current_time)
这种算法相对来说也不考虑缓存的访问频率和重要程度,仅按照创建的先后进行清理,越早的缓存越早清理。
所以不具备明显特征的业务场景都适用。
2.3.5 补充说明
业务场景有一些数据始终不需要删除,比如置顶新闻、视频,还有我们自己置顶的weibo。为了保障它们不被清理掉,就给这些数据不设置过期时间,这样的话 volatile类型的淘汰策略就不会影响了。但如果是 allkeys 开头的策略依旧会影响到。
2.3 淘汰所有缓存类型的key
无论是否配置了过期时间的数据均可进行淘汰。
从微服务拆分的角度说,不同的服务类型个方向的服务进行院子隔离会比较一点。这一点设计思维在缓存上依旧适用。
我们可以将不需要过期时间的缓存信息 和 需强制配置过期时间的缓存key分开。针对业务场景分别使用 volatile-xx策略 和 allkyes-xxx策略。
2.3.1 allkeys-lru:删除最近最少使用的key
保留最近有使用的key,类似volatile-lru
2.3.2 allkeys-lfu:删除访问次数最少的key
最不经常使用的,类似volatile-lfu
2.3.3 allkeys-random:随机删除过期key
无差别随机删除,volatile-random,为添加新数据腾出空间
2.4 策略命令的使用
# 获取当前内存淘汰策略
redis > config get maxmemory-policy
# 获取Redis能使用的最大内存大小:如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存。
redis > config get maxmemory
# 通过命令配置淘汰策略
redis > config set maxmemory-policy volatile-lru
# 设置Redis最大占用内存大小,这边最大占用内存大小配置为2000M
redis > config set maxmemory 2000mb
3 总结
一张图总结
Redis系列11:内存淘汰策略的更多相关文章
- Redis系列之-—内存淘汰策略(笔记)
一.Redis ---获取设置的Redis能使用的最大内存大小 []> config get maxmemory ) "maxmemory" ) " --获取当前内 ...
- 面试官:Redis 过期删除策略和内存淘汰策略有什么区别?
作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林. Redis 的「内存淘汰策略」和「过期删除策略」,很多小伙伴容易混淆,这两个机制虽然都 ...
- redis键的过期和内存淘汰策略
键的过期时间 设置过期时间 Redis可以为存储在数据库中的值设置过期时间,作为一个缓存数据库,这个特性是很有帮助的.我们项目中的token或其他登录信息,尤其是短信验证码都是有时间限制的. 按照传统 ...
- Redis详解(十一)------ 过期删除策略和内存淘汰策略
在介绍这篇文章之前,我们先来看如下几个问题: ①.如何设置Redis键的过期时间? ②.设置完一个键的过期时间后,到了这个时间,这个键还能获取到么?假如获取不到那这个键还占据着内存吗? ③.如何设置R ...
- Redis的过期策略和内存淘汰策略(转)
Redis的过期策略 我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间.Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理. ...
- Redis的过期策略和内存淘汰策略
Redis的过期策略:通常有三种,Redis中同时使用惰性过期和定期过期两种过期策略组合. 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除.该策略可以立即清除过期的数据 ...
- redis六种内存淘汰策略学习
当客户端会发起需要更多内存的申请,Redis检查内存使用情况,如果实际使用内存已经超出maxmemory,Redis就会根据用户配置的淘汰策略选出无用的key; 当前Redis3.0版本支持的淘汰策略 ...
- Redis的内存淘汰策略
Redis占用内存大小 我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小. 1.通过配置文件配置 ...
- Redis数据结构和使用场景,redis内存淘汰策略
什么样的数据适合放入Redis? sql执行耗时特别久,且结果不频繁变动的数据,适合放入Redis. Redis是单线程的,为什么会这么快? 纯内存操作 单线程操作,避免频繁的上下文切换 采用了非阻塞 ...
- Redis内存满了的几种解决方法(内存淘汰策略与Redis集群)
1,增加内存: 2,使用内存淘汰策略. 3,Redis集群. 重点介绍下23: 第2点: 我们知道,redis设置配置文件的maxmemory参数,可以控制其最大可用内存大小(字节). 那么当所需内存 ...
随机推荐
- 金九银十,收下这份 Java String 面试题
请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · Android-NoteBook 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭 ...
- KingbaseES R6 集群在线删除standby节点
案例环境: 操作系统: [root@node1 ~]# cat /etc/centos-releaseCentOS Linux release 7.2.1511 (Core) 数据库:tes ...
- C++ "链链"不忘@必有回响之双向链表
C++ "链链"不忘@必有回响之双向链表 1. 前言 写过一篇与单链表相关的博文(https://blog.51cto.com/gkcode/5681771),实际应用中,双向循环 ...
- .NET 反向代理 YARP 通过编码方式配置域名转发
前面介绍了 YARP 通过配置文件的方式配置代理转发(传送门),而众所周知,微软的一贯作风就是能通过配置文件做的事情,通过编码的方式也能实现!YARP 也不例外,废话不多说,直接上代码! 首先,参照官 ...
- Linux下从零开始创建lvm虚拟磁盘阵列+脚本化解决方案
逻辑卷管理器(英语:Logical Volume Manager,缩写为LVM),又译为逻辑卷宗管理器.逻辑扇区管理器.逻辑磁盘管理器,是Linux核心所提供的逻辑卷管理(Logical volume ...
- MinIO监控指南
官方文档地址:http://docs.minio.org.cn/docs/master/minio-monitoring-guide MinIO服务器通过端点公开监视数据.监视工具可以从这些端点中选择 ...
- 配置Kubelet的垃圾回收
文章转载自:https://www.kuboard.cn/learning/k8s-advanced/gc.html Kubelet的垃圾回收功能可以清理不再使用的容器和镜像,kubelet对容器进行 ...
- 2022.9.30 Java第四次课后总结
1.public class BoxAndUnbox { /** * @param args */ public static void main(String[] args) { int value ...
- struts项目向前台返回图片。
读取项目路径WebRoot下的图片 编写action package com.sadj.market.action; import java.io.BufferedInputStream; impor ...
- 微信小程序中视频的显示与隐藏
在微信小程序中实现视频的播放与暂停 需求: 视频列表中只能有一个视频在播放 点击视频实现播放与暂停功能 加载完成显示图片,点击后变为视频播放 从上次播放的位置进行播放 思路: 定义一个标记变量,控制视 ...