首页 > 其他分享 >八、删除与淘汰策略

八、删除与淘汰策略

时间:2023-06-08 15:36:24浏览次数:28  
标签:策略 删除 过期 Redis 链表 淘汰 数据

删除策略

定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键的过期时间来临时,立即执行对键的删除操作

定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。

惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键

淘汰策略

6 种数据淘汰策略

  • volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选 最近最少使用的数据淘汰

  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选 将要过期的数据淘汰

  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

  • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘 汰

  • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

  • no-enviction(驱逐):禁止驱逐数据

Redis 4.0 后新增2种内存淘汰策略

volatile-lfu(Redis 4.0 后新增的内存淘汰策略):从已设置过期时间的数据集,挑选最近最少使用的键值

allkeys-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰整个键值中最少使用的键值

LRU算法

传统LRU

基于最后一次访问时间淘汰最久未被使用的元素

传统 LRU 算法的实现是基于「链表」结构,链表中的元素按照操作顺序从前往后排列,最新操作的键会被移动到表头,当需要内存淘汰时,只需要删除链表尾部的元素即可,因为链表尾部的元素就代表最久未被使用的元素

存在问题:

  • 需要用链表管理所有的缓存数据,这会带来额外的空间开销;

  • 当有数据被访问时,需要在链表上把该数据移动到头端,如果有大量数据被访问,就会带来很多链表移动操作,会很耗时,进而会降低 Redis 缓存性能

Redis如何实现LRU

Redis 实现的是一种近似 LRU 算法,目的是为了更好的节约内存,它的实现方式是在 Redis 的对象结构体中添加一个额外的字段lru,用于记录此数据的最后一次访问时间

当 Redis 进行内存淘汰时,会使用随机采样的方式来淘汰数据,它是随机取 5 (此值可配置)个值,然后淘汰最久没有使用的那个

优点:

  • 不用为所有的数据维护一个大链表,节省了空间占用;

  • 不用在每次数据访问时都移动链表项,提升了缓存的性能

存在问题:

无法解决缓存污染问题,比如应用一次读取了大量的数据,而这些数据只会被读取这一次,那么这些数据会留存在 Redis 缓存中很长一段时间,造成缓存污染

LFU算法

根据数据访问次数来淘汰最少被使用的数据的

核心思想是如果数据过去被访问多次,将来被访问的频率也更高

Redis如何实现LFU

实现方式是在 Redis 的对象结构体中添加一个额外的字段lru,用于记录此数据的访问次数

对比删除策略

Redis 使用的过期删除策略是「惰性删除+定期删除」,删除的对象是已过期的 key

内存淘汰策略是解决内存使用过大的问题

标签:策略,删除,过期,Redis,链表,淘汰,数据
From: https://www.cnblogs.com/yogayao/p/17466608.html

相关文章

  • 网格交易策略
    网格交易是一种非常稳定的仓位管理策略,理论上胜率可以达到100%。策略思想:以相对下跌的价格为基准划定若干挡位,随后将每天的价格与前一天进行比较,根据挡位变化进行补仓或减仓。【投资标的】处于震荡市(价格整体在一个区间内反复波动)价格波动幅度足够大(交易有成本,波动幅度太小,获得的......
  • mysql安全策略
    基于8.x版本安装插件mysql>installpluginCONNECTION_CONTROLsoname'connection_control.so';QueryOK,0rowsaffected(0.01sec)mysql>installpluginCONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTSsoname'connection_control.so';QueryOK,......
  • timesten删除实例
     1.修改环境变量让环境变量指向目前的实例[instanceadmin@localhost~]$more.bash_profile#.bash_profile#Getthealiasesandfunctionsif[-f~/.bashrc];then.~/.bashrcfi#UserspecificenvironmentandstartupprogramsexportTIMESTEN_HOM......
  • visio边缘出现空白如何删除
    方法1:1.打开Visio对象后在[文件]菜单[选项]菜单项上单击,然后单击[自定义功能区]。2.在[自定义功能区]的主选项卡中找到[开发工具]复选框,打上勾,单击确定。3.在Visio对象的菜单栏,找到[开发工具]菜单,在[显示形状表]"显示ShapeSheet"工具栏的下拉菜单中单击[页]。4.在Pageproperties......
  • 从嵌套对象中删除属性
     您可以直接从每个模型中删除disabled和error键,而不是遍历每个模型的键和值:Object.entries(myObject.initialState.models).forEach(([key,value])=>{deletevalue.disabled;deletevalue.error;});......
  • liunx查找并删除历史文件
    find路径-mtime+天数-typef-name"文件名"-execrm-rf{};find/tmp-mtime+30-typef-name"*"-execrm-rf{}\;/tmp--设置查找的目录;-mtime+30--设置修改时间为30天前;-typef--设置查找的类型为文件;其中f为文件,d则为文件夹-name"*"--设置文件名称,可......
  • GreatSQL删除分区慢的跟踪
    GreatSQL删除分区慢的跟踪背景某业务系统,每天凌晨会删除分区表的一个分区(按天分区),耗时较久,从最开始的30秒,慢慢变为1分钟+,影响到交易业务的正常进行。在测试环境进行了模拟,复现了删除分区慢的情况,本次基于GreatSQL8.0.25-17进行测试,官方mysql版本也存在相同问题。测试环境$......
  • K8S批量删除指定的pod
    K8S批量删除指定的pod应用场景:我自己建了100个test-exporter,生成名称随机,然后我想删除掉这一百个pod,流程如下:1.先看pod,命令kubectlgetpod-nmonitor(这里的-nmonitor指的是我自己pod的容器名称,可以百度一下),如图2.筛选出自己想要删除的pod,我这里通过名称筛选:kubectlgetpod......
  • 删除字符串中相邻的重复字母
    题目:去除字符串中相邻且相等的两个字母,得到一个新字符串,并重复进行该操作,知道不能删除为止。思路:这道题首先想到的是利用循环,定义一个空的结果数组,遍历字符串的每一个元素,与结果数组中的最后一个元素比较,如果不相同,则追加该元素,反之删除数组最后一个元素。实现如下:constfilterD......
  • 不能在foreach 循环中添加或删除元素
    迭代器在遍历map的时候,会先拿到modCount存起来然后遍历,在遍历的时候会判断当前modCount的值与我第一次进来存的值是否一样,不一样就报错如果在循环中添加或删除元素,是直接调用集合的add,remove方法【导致了modCount增加或减少】,但这些方法不会修改迭代实例中的expectedModCount,导......