缓存的有效期和淘汰策略【Redis和其他缓存】【刘新宇】
缓存有效期与淘汰策略
有效期 TTL (Time to live)
设置有效期的作用:
- 节省空间
- 做到数据弱一致性,有效期失效后,可以保证数据的一致性
Redis的过期策略
过期策略通常有以下三种:
定时过期
每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
setex('a', 300, 'aval') setex('b', 600, 'bval')
惰性过期
只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
定期过期
每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。
Redis中同时使用了惰性过期和定期过期两种过期策略。
Redis过期删除采用的是定期删除,默认是每100ms检测一次,遇到过期的key则进行删除,这里的检测并不是顺序检测,而是随机检测。那这样会不会有漏网之鱼?显然Redis也考虑到了这一点,当我们去读/写一个已经过期的key时,会触发Redis的惰性删除策略,直接回干掉过期的key
为什么不用定时删除策略?
定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应用在处理请求,而不是删除key,因此没有采用这一策略.
定期删除+惰性删除是如何工作的呢?
定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。
于是,惰性删除派上用场。也就是说在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。
采用定期删除+惰性删除就没其他问题了么?
不是的,如果定期删除没删除key。然后你也没即时去请求key,也就是说惰性删除也没生效。这样,redis的内存会越来越高。那么就应该采用内存淘汰机制。
缓存淘汰 eviction
Redis自身实现了缓存淘汰
Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。
- noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
- allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。
- allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
- volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
- volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
- volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
redis 4.x 后支持LFU策略,最少频率使用
allkeys-lfu
volatile-lfu
LRU
LRU(Least recently used,最近最少使用)
LRU算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
基本思路
新数据插入到列表头部;
每当缓存命中(即缓存数据被访问),则将数据移到列表头部;
当列表满的时候,将列表尾部的数据丢弃。
LFU
LFU(Least Frequently Used 最近最少使用算法)
它是基于“如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小”的思路。
LFU需要定期衰减。不然有一些数据会倚老卖老
Redis淘汰策略的配置
maxmemory 最大使用内存数量
maxmemory-policy noeviction 淘汰策略
转载于:https://www.cnblogs.com/LiuXinyu12378/p/11328598.html
缓存的有效期和淘汰策略【Redis和其他缓存】【刘新宇】相关推荐
- 缓存模式【缓存使用几种模式】【刘新宇】
缓存模式 1) Cache Aside 更新方式 先更新数据库,再更新缓存.这种做法最大的问题就是两个并发的写操作导致脏数据.如下图(以Redis和Mysql为例),两个并发更新操作,数据库先更新的反 ...
- 什么是缓存穿透和缓存雪崩?【缓存问题】【刘新宇】
缓存问题 1 缓存穿透 缓存只是为了缓解数据库压力而添加的一层保护层,当从缓存中查询不到我们需要的数据就要去数据库中查询了.如果被黑客利用,频繁去访问缓存中没有的数据,那么缓存就失去了存在的意义,瞬间 ...
- Redis缓存过期和淘汰策略
题记: 文章内容输出来源:拉勾教育Java高薪训练营. 本篇文章是 Redis 学习课程中的一部分笔记. Redis缓存过期和淘汰策略 Redis性能高: 官方数据 读:110000次/s 写:810 ...
- redis缓存的雪崩、击穿、穿透,淘汰策略,持久化
1.redis缓存的雪崩.击穿.穿透,在实际中如何处理? 雪崩:缓存不存在,数据库存在,高并发,大量的key 原因:大量数据同时过期,Redis宕机 解决方案:给缓存数据的过期时间上加上小的随机数,避 ...
- Redis的持久化机制、过期策略、淘汰策略
文章目录 一.持久化机制 1. RDB机制 2. AOF机制 RDB的优缺点 AOF的优缺点 持久化机制选择 二.过期策略 常见过期策略 Redis过期策略 1. 定期删除 2. 惰性删除 RDB对过 ...
- Redis 过期策略和淘汰策略
1.Redis 过期策略 Redis 过期策略用于处理设置了缓存时间的数据,使用定时扫描和惰性删除机制删除到期的缓存数据. Redis 将设置了过期时间的 key 保存在一个独立的字典中,定时扫描就是 ...
- 【2020尚硅谷Java大厂面试题第三季 04】Redis 9种数据类型使用场景,分布式锁演变步骤,lua脚本,redis事务,Redisson,Redis内存占用,删除策略,内存淘汰策略,手写LRU
1.安装redis6.0.8 2023 02 02 为:redis-7.0.8.tar.gz 2.redis传统五大数据类型的落地应用 3.知道分布式锁吗?有哪些实现方案?你谈谈对redis分布式锁的 ...
- Redis的内存回收机制和数据过期淘汰策略
本文来说下Redis的内存回收机制和数据过期淘汰策略 文章目录 概述 为什么需要内存回收 过期删除策略 定时删除 惰性删除 定期删除 删除策略比对 过期删除策略原理 redisDb结构体定义 expi ...
- 广义表head tail 运算_双链表实现LRU缓存淘汰策略
1.背景 LRU(Least Recently Used)是一种常用的缓存淘汰策略,即当缓存满了之后,删除最近最少使用的数据. LRU的实现,常用的编程语言在语言层面都有实现,可以直接使用.为了深入理 ...
最新文章
- ssl 接收到一个超出最大准许长度的记录_我所经历的一次Dubbo服务雪崩,这是一个漫长的故事...
- 利用python模块paramiko在CentOS 6.3 64上搭建SFTP环境
- UIScrollView属性和用法
- 【Python之旅】第七篇(二):Redis使用基础
- Android init.rc文件解析过程详解(二)
- openssl 添加自定义算法_GitHub:用PyTorch实现17种深度强化学习算法
- Centerface:开源实用的边缘设备无锚人脸检测与对齐算法
- ssms安装_SQLServer 2019下载及安装教程
- socket编程-客户端向服务器发送字符串,传文件
- 通用html解析器,razor-从外部存储的.cshtml解析Rarzor HTML帮助器
- 最全最新cpu显卡天梯图_2018 年新近详细CPU、显卡天梯图
- 深圳大学本科毕业论文答辩PPT模板
- 超级实习生计划项目练习——JavaScript 利用Ajax制作一个汇率转换器
- 平面设计师okr_掌握OKR工作法,教你快速提升工作效率
- 初探flask debug生成pin码
- 学习笔记 | 演化简单的程序用于玩 Atari 游戏
- WeBRTC IOS视频采集流程
- Cannot run code from this file in conjunction with non encoded files
- [网站建设] 深度解析搜索引擎的原理结构
- oracle数据库设计思维导图,Oracle
热门文章
- 微信小程序中引入ttf字体
- 自己搭建IOC容器(C#)(二)实现Ioc容器基本功能
- 查看mysql最大连接数_Mysql查看最大连接数和修改最大连接数
- 高德地图--- 会动的小汽车(行动轨迹回放)demo效果(整理)
- 合创视觉科技交互设计学的是什么东西?
- 2023江西理工大学考研择校
- 人工智能-浅谈人工智能
- 改善开发人员的工作环境-仅分三个阶段
- Bean named XXX is expected to be of type XXX but was actually of type 'com.sun.proxy.$Proxy28'
- 每次都戳到我的笑点,那个不同寻常的自黑达人,雷军