我是靠谱客的博主 满意中心,最近开发中收集的这篇文章主要介绍【Redis学习笔记】第八章 Redis删除策略1、过期数据2、数据删除策略–针对有时效性的数据3、逐出算法—与数据是否有时效性无关,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 1、过期数据
  • 2、数据删除策略--针对有时效性的数据
  • 3、逐出算法---与数据是否有时效性无关

在这里插入图片描述



1、过期数据

Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态:

  • xx某数值:具有时效性的数据
  • -1 :永久有效的数据
  • -2 :已经过期的数据 或 被删除的数据 或 未定义的数据

在这里插入图片描述

过期数据会立即被删除吗?
在这里插入图片描述
这与我们设置的删除策略有关(定时删除、惰性删除、定期删除)
在这里插入图片描述

2、数据删除策略–针对有时效性的数据

Redis中,具有时效性的数据的存储结构如下:
在这里插入图片描述

数据删除策略,通俗的说就是CPU忙的时候别添乱,CPU不忙的时候去维护一下,把过期的处理掉。为的是在内存占用和CPU占用之间找到一种平衡,顾此失彼则会导致Redis性能的下降甚至服务器宕机。

2.1 定时删除

创建一个定时器,当key设置的过期时间到了的时候,由定时器任务立即进行删除
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

优点:
节省内存,到点就删除

缺点:
CPU压力大,不管此时CPU忙不忙,到点干活儿,会影响Redis服务器的响应时间以及指令的吞吐

总结:
用CPU的性能换取存储空间(用时间换空间)


2.2 惰性删除

数据到达过期时间也不做处理,等下次访问这个数据的时候,若未过期,则返回数据。若过期,则删除并返回不存在。

在这里插入图片描述

在这里插入图片描述

优点:
节省CPU性能,发现必须删除的时候才删除

缺点:
内存压力大,出现长期占用内存的数据

总结:
用存储空间换取CPU性能(拿空间换时间)

2.3 定期删除

周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度.

示意图中展示了8个redis的库,expires[*]即每个库中设置有时效性的值,定期删除的实现步骤如下:
在这里插入图片描述

  • Redis启动服务器初始化时,读取配置文件中#server中的 hz 的值,默认为10
  • 每秒钟执行 hz 次serverCron()---->其中的databasesCron()负责对每个库进行轮询—>再对每个库进行activeExpireCycle()
  • activeExpireCycle()对每个expires[*]逐一进行检测,每次执行250ms/server.hz
  • 对每个expires[*]进行检测,随机挑选其中的W个key来检测
  • 删除超时的key,如果一轮中删除的key的数量 > W*25%(说明这个库有时效性的数据中过期比例高,需要重点清理),则对这个库继续循环这两步
  • 如果一轮中删除的key的数量 <= W*25%,则说明这个库过期数据相对较少,去检查下一个库的expires[*],共0-15号库
    在这里插入图片描述

注:

  • W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值
  • 参数current_db用于记录activeExpireCycle() 进入哪个expires[*] 执行,若activeExpireCycle()执行时间到期,下次从current_db继续向下执行

特点:

CPU性能占用设置有峰值,检测频度可自定义设置。内存压力不是很大,长期占用内存的冷数据会被持续清理。

总结:

周期性抽查存储空间(随机抽查,重点抽查)

三种删除策略对比如下:

策略内存CPU总结
定时删除节约内存,无占用不分时段占用CPU资源,频度高拿时间换空间
惰性删除内存占用严重延时执行,CPU利用率高拿空间换时间
定期删除内存定期随机清理每秒花费固定的CPU资源维护内存随机抽查、重点抽查

3、逐出算法—与数据是否有时效性无关


3.1 概念

Redis使用内存存储数据,在执行每一个命令前,会调用freeMemoryIfNeeded()检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为逐出算法

注:
逐出数据后,若还没清理出足够的空间,则反复执行,当所有数据尝试完毕后,还没达到要求的空间,则抛错:
在这里插入图片描述


3.2 配置文件中的相关参数

  • maxmemory
    最大可使用内存,占用物理内存的比例,默认为0,表示不限制

  • maxmemory-samples
    每次选取的待删除的数据的个数。逐出算法选数据并不是全盘扫描,而是随机获取。这个值过小,则导致每次逐出算法反复执行,过大则导致严重的性能消耗

  • maxmemory-policy
    达到最大内存后的,对被挑选出来的数据进行删除的策略

maxmemory-policy可选

  • 检测易失数据(可能会过期的数据集server.db[i].expires )
    ① volatile-lru:挑选最近最少使用的数据淘汰, Least Recently Used
    ② volatile-lfu:挑选最近使用次数最少的数据淘汰, Least Frequently Used
    ③ volatile-ttl:挑选将要过期的数据淘汰
    ④ volatile-random:任意选择数据淘汰
    在这里插入图片描述
    通俗的说:LRU就是最近好几天没来上班的人,LFU就是来上班了但是用处很少的人

  • 检测全库数据(所有数据集server.db[i].dict )
    ⑤ allkeys-lru:挑选最近最少使用的数据淘汰
    ⑥ allkeys-lfu:挑选最近使用次数最少的数据淘汰
    ⑦ allkeys-random:任意选择数据淘汰

  • 放弃数据驱逐
    ⑧ no-enviction(驱逐):
    禁止驱逐数据(redis4.0中默认策略),会引发错误OOM(Out Of Memory)

以上八种策略的选择:

使用info指令,查询缓存 hit 和 miss (命中和丢失)的次数,根据业务需求调优Redis配置

在这里插入图片描述

最后

以上就是满意中心为你收集整理的【Redis学习笔记】第八章 Redis删除策略1、过期数据2、数据删除策略–针对有时效性的数据3、逐出算法—与数据是否有时效性无关的全部内容,希望文章能够帮你解决【Redis学习笔记】第八章 Redis删除策略1、过期数据2、数据删除策略–针对有时效性的数据3、逐出算法—与数据是否有时效性无关所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部