Redis删除策略和淘汰策略[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。
1.删除策略 Redis 是一种内存级数据库,数据都存在内存中,但是针对于已经过期的数据,reids 不 会立刻删除只是会存储在 expires 中,当执行删除策略的时候,才会从 expires 中寻找对应的数据存储的地址,在存储空间中找到对应的数据进行删除。数据删除其实就是内存和 CPU 占用之间寻找平衡,CPU 才能去处理事情,针对过期数据,要进行删除的时候,一般有三种策略 1.1 定时删除 顾名思义,当 key 设置有过期时间,时间到了,定时器任务立即执行删除,相当于消 耗 CPU 来减少内存使用,拿时间换空间。
优点:节约内存,到时就删除,快速释放掉不必要的内存占用 缺点:CPU 压力大,无论 CPU 此时负载量多高,都会去占用 CPU 进行 key 的删除 操作,会影响 Redis 服务器响应时间和吞吐量,是一种比较低效的方式 结论:用 CPU 性能换取内存空间,时间换空间
1.2 惰性删除 就是说,数据到达过期时间的时候,先不做处理,等到下次访问数据的时候,进行访问, 如未过期,返回数据,如过期,则删除。这就相当于节约了 CPU 但占用了内存,拿空间换 时间。 优点:不占用 CPU 节约 CPU 性能,只在获取访问 key 的时候才判断是否过期,过期 则删除,只会删除当前获取的这一个 key,其他的 key 还是保持原样 缺点:内存占用大,如果一直没有获取它,那么数据就会长期占用内存空间,当有大量 的 key 没有被使用到,也造成了大量内存浪费,对内存数据库来说,也不太友好 结论:空间换时间
1.3 定期删除 前面说的两种方案 1.时间换空间,2.空间换时间都是两个极端方法,为避免前面方案带 来的问题,Redis 引入了定期删除策略(是他们的一个比较折中的方案)周期性轮询 Redis 库中的时效性数据,采取随机抽取的策略,利用过期数据占比的方式控制删除频度。在 Redis 服务器初始化时,读取 server.hz 的值,默认值为 10。定时轮询服务器,每秒钟执行 server.hz 次 serverCron() 函数。databaseCron() 在后台轮询处理 16 个 redis 数据库的操作,如这里的过期key 的处理activeExpireCycle(),对每个数据库的 expire 空间进行检测,每次执行250ms/server.hz 随机选取一批 expire 空间的 key(redis 有 16 个数据库,从 0 号数据库开始—15号数据库) 删除这批 key 中已过期的。如果这批 key 中已过期的占比超过 25%,那么再重复执行步骤一。(循环到小于 25%结束当前数据库的删除)如果这批 key 中已过期的占比 ≤ 25%,检测下一个数据库的 expire 空间(current_db++) 用 info 命令查看相关配置参数
每秒钟执行 hz 次 serverCron(),对服务器进行定时轮询 1.4 策略对比 1︰定时删除: 节约内存,无占用, 不分时段占用 CPU 资源, 频度高,拿时间换空间 2:惰性删除: 内存占用严重 延时执行, CPU 利用率高拿空间换时间 3:定期删除: 内存定期随机清理 每秒花费固定的 CPU 资源维护内存 随机抽查,重点抽查
2 淘汰/逐出策略 在 Redis 中经常会进行数据的增删查改操作,那么如果在添加数据的时候遇到了内存不足,该怎么办?在前面用的删除策略可以避免出现这种情况吗? 实际上,在前面所说的删除策略,它针对的是 expire 命令进行的操作,也就是说那些具有时效性的数据(已经过期,并且还在占用内存的数据),我们在这里说的是针对那些并没有过期,或者是内存中的数据没有一个带有有效期,全是永久性数据,这时候删除策略就不起作用了,所以这个时候内存满了我们再去插入数据到内存是怎么做? redis 执行命令之前,都会用 freeMemoryIfNeeded()方法,检测这次内存是否充足,如果不满足加入新数据,则会执行淘汰策略(淘汰未过期的数据) 2.1 配置文件
2.2 分类 检测带有时效性的数据进行淘汰(一般是有定时,会过期的数据的) volatile-lru:挑选最近最少使用的数据淘汰 volatile-lfu:挑选最近使用次数最少的数据淘汰 volatile-ttl:挑选将要过期的数据淘汰 volatile-random:任意选择数据淘汰 检测全库的数据进行淘汰 allkeys-lru:挑选最近最少使用的数据淘汰 allkeLyRs-lfu::挑选最近使用次数最少的数据淘汰 allkeys-random:任意选择数据淘汰,相当于随机
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179188.html原文链接:https://javaforall.cn
相关文章
- java redis锁_Java中Redis锁的实现[通俗易懂]
- 删除Redis中的元素:一种实现方法(redis删除元素)
- 架构环保的Redis:主从/哨兵架构实现服务可靠性(redis主从哨兵)
- Redis字符集详解:了解Redis支持哪些字符集和对应使用场景(redis字符集)
- 缓存破坏性行为:重塑实时数据缓存之路——删除Redis缓存(删除redis)
- Redis实现快速批量数据写入(批量写入redis)
- 利用Redis确定槽位的计算方法(计算redis的槽)
- 从Redis中获取所有数据的简单方法(获取redis中所有数据)
- 服务器接受探究远程Redis服务器是否接受连接请求(查看是否被远程redis)
- 探测Redis是否出现阻塞现象(查看redis有没有阻塞)
- 狂神点评Redis文档深度剖析细节(狂神说redis文档)
- 提升效率Redis服务器删除提升效率,改善性能(服务器redis删除可以)
- Redis上线新装置安全更可靠(新安装的redis有密码)
- 瞬间成就简单易行的Redis与Ngix下载(下载redis ngix)
- 让Redis帮你快速删除有序集合(删除有序集合 redis)
- 重塑集群掌控删除 Redis 节点(删除redis 集群节点)
- 删除Redis中的一个键的注意事项(删除redis的某个键)
- 如何快速解压Redis(如何解压redis)
- Redis不包含的特性无需担心(以下哪项不属于redis)
- 行连接多个Redis实现串行连接的稳健架构(多个redis串)
- 利用Redis按顺序获取Key的方法(redis顺序获取key)
- 快速安全地清理Redis集群中不可用数据(redis集群删除可用)
- Redis集群安全删除函数的调用(redis集群删除函数)
- 梦想即将破灭Redis集群无法删除(redis集群删不掉)
- 利用Redis锁脚本解决并发问题(redis锁脚本)
- Redis锁等待超时危机紧迫及处理建议(redis锁等待超时)
- 一个利用Redis深度阅读 删除前留住印象(redis 读完再删 写)
- 储存Redis实现定期删除数据储存(redis 设置定期删除)
- Redis订阅构建及时通知的新途径(redis 订阅 通知)
- 实现Redis远程批量删除的有效方案(redis远程批量删除)
- Redis淘汰机制面试时如何回答(redis淘汰机制面试)