《redis学习》-- 缓存淘汰策略

用面包板实测MOSFET:手把手教你测量跨导和开关时间 本文详细介绍了如何使用面包板、Arduino和示波器搭建测试平台,实测MOSFET的跨导和开关时间。通过分步测量流程和示波器技巧,帮助电子设计初学者深入理解MOSFET的动态特性,包括跨导计算、开关时间参数解析以及米勒平台现象分析。 阅读详情

redis

缓存淘汰策略

参考:Redis 内存淘汰机制

​ 深入理解Redis主键失效原理及实现机制

  • 认识

    • 最大缓存

    在 redis 中,允许用户设置最大使用内存大小 server.maxmemory,默认为0,没有指定最大缓存,如果有新的数据添加,超过最大内存,则会使redis崩溃,所以一定要设置。redis 内存数据集大小上升到一定大小的时候,就会实行数据淘汰策略。

    • 主键失效

    作为一种定期清理无效数据的重要机制,在 Redis 提供的诸多命令中,EXPIRE、EXPIREAT、PEXPIRE、PEXPIREAT 以及 SETEX 和 PSETEX 均可以用来设置一条 Key-Value 对的失效时间,而一条 Key-Value 对一旦被关联了失效时间就会在到期后自动删除(或者说变得无法访问更为准确)

    • 淘汰机制

    随着不断的向redis中保存数据,当内存剩余空间无法满足添加的数据时,redis 内就会施行数据淘汰策略,清除一部分内容然后保证新的数据可以保存到内存中。

    内存淘汰机制是为了更好的使用内存,用一定得miss来换取内存的利用率,保证redis缓存中保存的都是热点数据。

    ​

  • 设置过期时间

    可以给redis中的key设置过期时间,当key过期的时候(生存期为0),它会被删除。

    • 对key进行覆盖会修改数据的生存时间,如set和getSet命令

    • 修改key对应的value和使用另外相同的key和value来覆盖以后,当前数据的生存时间不同。 如对一个 key 执行INCR命令,对一个列表进行LPUSH命令,或者对一个哈希表执行HSET命令,这类操作都不会修改 key 本身的生存时间。

    • 使用rename对一个 key 进行改名,那么改名后的 key 的生存时间和改名前一样。

    • 使用persist命令可以在不删除 key 的情况下,移除 key 的生存时间,让 key 重新成为一个persistent key
    • 使用expire命令可以更新key的生存时间
  • 淘汰策略

    • redis淘汰策略配置:maxmemory-policy voltile-lru,支持热配置

    • redis 提供 6种数据淘汰策略:

      1. voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
      2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
      3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
      4. allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
      5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
      6. no-enviction(驱逐):禁止驱逐数据
  • 策略规则

    1. 如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru
    2. 如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random
    3. volatile-lru策略和volatile-random策略适合我们将一个Redis实例既应用于缓存和又应用于持久化存储的时候,然而我们也可以通过使用两个Redis实例来达到相同的效果,
    4. 将key设置过期时间实际上会消耗更多的内存,因此我们建议使用allkeys-lru策略从而更有效率的使用内存
  • 非精准的LRU

    上面提到的LRU(Least Recently Used)策略,实际上Redis实现的LRU并不是可靠的LRU,也就是名义上我们使用LRU算法淘汰键,但是实际上被淘汰的键并不一定是真正的最久没用的,这里涉及到一个权衡的问题,如果需要在全部键空间内搜索最优解,则必然会增加系统的开销,Redis是单线程的,也就是同一个实例在每一个时刻只能服务于一个客户端,所以耗时的操作一定要谨慎 。为了在一定成本内实现相对的LRU,早期的Redis版本是基于采样的LRU,也就是放弃全部键空间内搜索解改为采样空间搜索最优解。自从Redis3.0版本之后,Redis作者对于基于采样的LRU进行了一些优化,目的是在一定的成本内让结果更靠近真实的LRU。

失效的内部实现

Redis 删除失效主键的方法主要有两种:

  • 消极方法(passive way),在主键被访问时如果发现它已经失效,那么就删除它

  • 积极方法(active way),周期性地从设置了失效时间的主键中选择一部分失效的主键删除

  • 主动删除:当前已用内存超过maxmemory限定时,触发主动清理策略,该策略由启动参数的配置决定

    主键具体的失效时间全部都维护在expires这个字典表中。

    typedef struct redisDb {
      dict *dict; //key-value
      dict *expires;  //维护过期key
      dict *blocking_keys;
      dict *ready_keys;
      dict *watched_keys;
      int id;
    } redisDb;
passive way 消极方法
  • 在passive way 中, redis在实现GET、MGET、HGET、LRANGE等所有涉及到读取数据的命令时都会调用 expireIfNeeded,它存在的意义就是在读取数据之前先检查一下它有没有失效,如果失效了就删除它。
  • expireIfNeeded函数中调用的另外一个函数propagateExpire,这个函数用来在正式删除失效主键之前广播这个主键已经失效的信息,这个信息会传播到两个目的地:

    1. 一个是发送到AOF文件,将删除失效主键的这一操作以DEL Key的标准命令格式记录下来;
    2. 另一个就是发送到当前Redis服务器的所有Slave,同样将删除失效主键的这一操作以DEL Key的标准命令格式告知这些Slave删除各自的失效主键。从中我们可以知道,所有作为Slave来运行的Redis服务器并不需要通过消极方法来删除失效主键,它们只需要对Master唯命是从就OK了!

代码段二:

int expireIfNeeded(redisDb *db, robj *key) {
    获取主键的失效时间
    long long when = getExpire(db,key);
    假如失效时间为负数,说明该主键未设置失效时间(失效时间默认为-1),直接返回0
    if (when < 0) return 0;
    假如Redis服务器正在从RDB文件中加载数据,暂时不进行失效主键的删除,直接返回0
    if (server.loading) return 0;
    假如当前的Redis服务器是作为Slave运行的,那么不进行失效主键的删除,因为Slave
    上失效主键的删除是由Master来控制的,但是这里会将主键的失效时间与当前时间进行
    一下对比,以告知调用者指定的主键是否已经失效了
    if (server.masterhost != NULL) {
        return mstime() > when;
    }
    如果以上条件都不满足,就将主键的失效时间与当前时间进行对比,如果发现指定的主键
    还未失效就直接返回0
    if (mstime() <= when) return 0;
    如果发现主键确实已经失效了,那么首先更新关于失效主键的统计个数,然后将该主键失
    效的信息进行广播,最后将该主键从数据库中删除
    server.stat_expiredkeys++;
    propagateExpire(db,key);
    return dbDelete(db,key);
}

void propagateExpire(redisDb *db, robj *key) {
    robj *argv[2];
    shared.del是在Redis服务器启动之初就已经初始化好的一个常用Redis对象,即DEL命令
    argv[0] = shared.del;
    argv[1] = key;
    incrRefCount(argv[0]);
    incrRefCount(argv[1]);
    检查Redis服务器是否开启了AOF,如果开启了就为失效主键记录一条DEL日志
    if (server.aof_state != REDIS_AOF_OFF)
        feedAppendOnlyFile(server.delCommand,db->id,argv,2);
    检查Redis服务器是否拥有Slave,如果是就向所有Slave发送DEL失效主键的命令,这就是
    上面expireIfNeeded函数中发现自己是Slave时无需主动删除失效主键的原因了,因为它
    只需听从Master发送过来的命令就OK了
    if (listLength(server.slaves))
        replicationFeedSlaves(server.slaves,db->id,argv,2);
    decrRefCount(argv[0]);
    decrRefCount(argv[1]);
}
Active Way

消极方法的缺点是,如果key 迟迟不被访问,就会占用很多内存空间. 所以就产生的积极的方式(Active Way):此方法利用了redis的时间事件,即每隔一段时间就中断一下完成一些指定操作,其中就包括检查并删除失效主键。

  • 时间事件

创建时间事件, 回调函数就是serverCron,它在Redis服务器启动时创建,每秒的执行次数由宏定义REDIS_DEFAULT_HZ来指定,默认每秒钟执行10次。

  • 使用activeExpireCycle 清除失效key

其实现原理是从Redis中每个数据库的expires字典表中,随机抽样REDIS_EXPIRELOOKUPS_PER_CRON(默认值为10)个设置了失效时间的主键,检查它们是否已经失效并删除掉失效的主键,如果失效主键个数占本次抽样个数的比例超过25%,它会继续进行下一轮的随机抽样和删除,直到刚才的比例低于25%才停止对当前数据库的处理,转向下一个数据库。

注意,activeExpireCycle函数不会试图一次性处理Redis中的所有数据库,而是最多只处理REDIS_DBCRON_DBS_PER_CALL(默认值为16),此外activeExpireCycle函数还有处理时间上的限制,不是想执行多久就执行多久,凡此种种都只有一个目的,那就是避免失效主键删除占用过多的CPU资源。

基于Simulink的前馈解耦SVPWM整流器仿真 本文提出了一种基于Simulink的前馈解耦SVPWM整流器仿真方案,针对传统双闭环控制存在的耦合严重、电压利用率低等问题进行优化。通过前馈补偿dq轴耦合项(ωLiq和ωLid)结合SVPWM调制算法,实现了电流跟踪误差<3%、电压利用率达0.99、THD<3%的性能指标。文章详细阐述了系统架构设计,包括前馈解耦原理推导、SVPWM算法实现步骤,并提供了完整的Simulink建模方法。仿真结果表明,该方案在动态响应速度(25ms)和直流电压纹波(1.1%)方面显著优于传统SPWM控制。同时给出了 阅读详情

相关推荐

踩坑记录:Clawdbot 对接 Minimax 报错 “401 token is unusable (1004)“ 的终极解决方案

如果你也在配置 Clawdbot 对接 Minimax 模型时,明明 API Key 是新申请的,却死活报错 `401 Unauthorized`,错误码 `1004`,提示 `token is unusable`——那么恭喜你,来对地方了。

hampeter的博客 2001

redis淘汰策略

redis 默认的最大的内存设置为0,相当于基于物理机的最大值 主要是4种算法,针对不同的key,形成的策略。 算法:key :LRU是Least Recently Used的缩写,也就是表示最近很少使用,也可以理解成最久没有使用。也就是说当内存不够的时候,每次添加一条数据,都需要抛弃一条最久时间没有使用的旧数据。标准的LRU算法为了降低查找和删除元素的时间复杂度,一般采用Hash表和双向链表结合的数据结构,hash表可以赋予链表快速查找到某个key是否存在链表中,同时可以快速删除、添加节点,如图所示。

weixin_40980639的博客 2万+

告别ZotFile!Zotero 7+百度网盘文献同步全攻略(含软链接避坑指南)

本文针对Zotero 7用户,提供了告别ZotFile插件后,利用百度网盘实现文献附件同步的完整解决方案。详细讲解了如何通过设置Zotero链接目录与创建软链接,将附件库迁移至云盘,并附有详细的避坑指南,确保数据安全与多设备同步的稳定性。

mmm90的博客 586

缓存淘汰策略(图解)

缓存淘汰策略(图解)

weixin_45845680的博客 604

LightRAG实战:5分钟快速搭建一个轻量级法律问答系统(附完整代码)

本文通过实战指南,详细介绍了如何使用LightRAG技术快速搭建一个轻量级法律问答系统。该方案通过构建扁平化实体关系网络和混合检索策略,在5分钟内即可完成从环境准备到智能问答的完整流程,并附有完整代码,为中小团队和个人开发者提供了高效、低成本的AI应用解决方案。

time3的博客 277

excel 利用SUBTOTAL函数计算筛选后数列总和、均值、最大、最小值

表里有三个人,咱们需要筛选出三个人,并分别计算他们的总和值。 先看一下数据范围(A1:B27) 通过筛选找张三。 按照上图所示输入函数,选择9,求和。 然后按照函数输入即可。 就能计算出结果。 筛选项选择王五,就会自动计算王五的总和。 筛选到李四就会自动计算李四的总和。 如果把9改成1,就是自动计算筛选出来的均值结果,如下图所示。 如果改成4就是取筛选项的最大值,选择5就是取最小值。 ...

yuanYW7556的博客 3万+

redis的删除策略和淘汰策略

redis淘汰策略

weixin_32128491的博客 2433

Cadence Allegro 17.4 保姆级教程:PCB位号重排与反标回原理图完整避坑指南

本文详细解析了Cadence Allegro 17.4中PCB位号重排与反标回原理图的全流程,包括安全工程准备、智能重排策略和反标黄金法则。特别针对芯片封装协同设计(Co-Design)场景,提供可追溯的版本管理和故障恢复方案,帮助工程师避免常见位号陷阱,确保设计文件一致性。

weixin_30613433的博客 438

Redis 内存淘汰策略详解

Redis 是一款高性能的非关系型数据库,它支持多种数据结构,如字符串、哈希、列表、集合、有序集合和 HyperLogLog。Redis 可以用于缓存、消息队列、应用程序中的数据结构存储等场景,它的优点是响应速度快、支持丰富的数据结构和扩展性好。

BXA 4857

静态时序分析(Static Timing Analysis, STA):简介及内容导航

静态时序分析(简称STA)是用来验证数字设计时序的技术之一,另外一种验证时序的方法是时序仿真,时序仿真可以同时验证功能和时序。“时序分析”这个术语就是用来指代“静态时序分析“或”时序仿真“这两种方法之一,简单来说,时序分析的目的就是为了解决设计中的各种时序问题。STA被称为静态的原因是其对于设计的分析是静态地执行的,并不依赖于施加在输入端口上的激励。相比之下,时序仿真则可以被视作动态地执行对设计的分析,具体过程描述如下:施加一组激励,观察在这组激励下电路行为是否符合要求,然后换一组激。

Starry__的博客 1986

将Keil中的变量数组导出

首先,写好导出数据的函数。

小柚子的博客 1951

Redis的数据淘汰策略

Redis的数据淘汰策略指的是在内存不足的情况下,如何决定哪些数据需要被淘汰以释放内存空间,当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉。

qq_54247497的博客 1669

数据挖掘在人力资源分析中的实战案例

在当今竞争激烈的商业环境中,人力资源管理对于企业的成功至关重要。有效的人力资源管理能够提高员工绩效、降低员工流失率、优化人才招聘等。而数据挖掘技术为人力资源管理提供了强大的工具,通过对大量人力资源数据的分析,可以发现潜在的规律和模式,为企业的决策提供有力支持。本文的目的是通过实际案例展示数据挖掘在人力资源分析中的具体应用,涵盖员工绩效预测、人才招聘筛选、员工流失分析等多个方面。通过详细的案例分析,帮助读者理解数据挖掘技术在人力资源管理中的实际操作和应用价值。

移动开发前沿的博客 489

Redis学习:1. Redlock算法(MultiLock)和底层源码分析、2. Redis缓存过期淘汰策略

Redis学习:1. Redlock算法(MultiLock)和底层源码分析、2. Redis缓存过期淘汰策略

LiuYQi的博客 1073

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Redis学习笔记---Redis的缓存过期和淘汰策略

Redis学习笔记—Redis的缓存过期和淘汰策略 1.性能简介 Redis性能高: 官方数据 读:110000次/s 写:81000次/s 长期使用,key会不断增加,Redis作为缓存使用,物理内存也会满 内存与硬盘交换(swap) 虚拟内存 ,频繁IO 性能急剧下降 2.maxmemory 不设置的场景,作为DB使用 Redis的key是固定的,不会增加 Redis作为DB使用,保证数据的完整性,不能淘汰 , 可以做集群,横向扩展 缓存淘汰策略:禁止驱逐 (默认) 设置的场景 Redis

qq_39314972的博客 285

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

redis学习笔记七:redis缓存淘汰策略

redis 提供 6种数据淘汰策略: voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰 ...

qq_38311489的博客 212

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Redis核心技术与实战【学习笔记】 - 15.Redis 缓存的淘汰策略

Redis 缓存使用内存来保存数据,避免业务应用直接从数据库读取数据,可以提升应用的访问速度。但是,我们又没有办法做到把所有的数据都放入缓存,因为这样做的性价比不高,而且缓存也存不下数据库中的所有数据。例如,Mysql 中有 1TB 的数据,如果使用 Redis 把这些数据都缓存起来,虽然应用都能在内存中访问数据了,但是这样配置并不合理,因为性价比低。一方面内存的价格比磁盘的价格贵很多。另一方面,数据访问都是有局部性的,也就是“二八原理”,80% 的请求实际只访问了 20% 的数据。

chenjian723122704的专栏 1601

Redis学习篇3:缓存更新策略与数据更新、淘汰策略

文章简述了缓存更新策略与数据更新、淘汰策略

jialuosi的博客 2382

Redis应用学习——缓存过期与淘汰策略

redis 过期策略 redis 过期策略是:定期删除+惰性删除。 所谓定期删除,指的是 redis 默认是每隔 一定时间 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除。 假设 redis 里放了 10w 个 key,都设置了过期时间,如果每隔几百毫秒,就检查 10w 个 key的过期时间,那 redis 基本上就死了,cpu 负载会很高的,消耗在你的检查过期 ke...

江左煤郎的博客 209

Redis核心技术与实战【学习笔记】 - 18.Redis 缓存被污染了,如何选择淘汰策略

在一些常见下,有些数据被访问的次数非常少,甚至只会被访问一次。当这些数据请求后,还继续留存在缓存中的话,只会白白占用缓存的空间。这种情况就是缓存污染。当缓存污染不严重时,只有少量数据占据缓存空间,此时对缓存系统的影响不大。但是,缓存污染一旦变得验证后,就会有大量不在访问的数据滞留在缓存中。

chenjian723122704的专栏 1383

Redis学习(二)redis的发布订阅模式-事务-持久化-缓存淘汰策略-主从复制-哨兵模式

文章目录1、发布订阅模式2、Redis中事务问题3、rdb模式实现持久化4、aof实现持久化5、混合持久化的问题6、缓存的淘汰策略7、主从复制问题8、哨兵模式 1、发布订阅模式 例子:比如说你们家有个收音机 你收听了 xxxxx 频道 那么只要你打开这个频道 你就能收听到这个频道的所有的内容 你的收音机-----------接收方(订阅方) 频道的内容发送方-------内容的发布者 subs...

孔明的博客 567

Redis与AI结合:如何用AI优化缓存策略

最终,将这些功能集成到现有的Redis实例中,形成一个智能缓存优化工具。然而,传统的缓存策略往往依赖手动配置,难以应对动态变化的访问模式。通过以上步骤,我们可以构建一个基于AI的Redis缓存优化工具,实现自动化的缓存管理,显著提升系统性能。这种结合AI与Redis的方法,不仅减少了人工干预的需求,还能更灵活地应对动态变化的访问模式。上创建和部署类似的项目。这些数据将作为AI模型的输入,帮助我们理解当前的缓存使用情况。AI模型还可以用于检测异常的访问模式,如突然的流量激增或异常的缓存未命中率。

GoldEagle19的博客 643

基于Redis的热点数据缓存优化

热点数据缓存问题是指在分布式系统中,针对访问频率高、更新速度快的数据进行高效缓存和管理的挑战。问题定义数据访问模式:热点数据在系统中的访问频率明显高于其他数据,且其访问模式具有动态变化的特点。缓存策略:如何选择合适的缓存数据、确定合理的缓存大小以及设计有效的缓存淘汰策略,以最大化缓存命中率。数据一致性:在多节点系统中,如何保证缓存数据与后端存储数据的一致性。现状分析缓存数据选择:传统的缓存数据选择方法多基于固定规则,难以适应动态变化的访问模式。缓存大小确定。

m0_51770140的博客 282

从一道 LRU 算法题说到缓存淘汰策略

双向链表节点的类型的基本属性如下:/***//***//***//***/HashMap用来存储 key 值对应的节点,为的是快速定位 key 值在链表中的位置,我们都知道,这是因为HashMap的 get 方法的时间复杂度为 O(1)。而如果不借助 HashMap,那这个过程可就慢了。如果要想找一个 key,要从链表头或链表尾遍历才行。按上图的展示, head 是链表头,也是最长时间未被访问的节点,tail 是最近被访问的元素,假设缓存最大容量是 4。插入元素。

2401_84046895的博客 947

2024年最新版68道Redis面试题,20000字干货,赶紧收藏起来备用!(1)

其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。Kafka入门为什么选择KafkaKafka的安装、管理和配置。

2401_84584375的博客 535

redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿

缓存是一种临时存储数据的技术,用于在后续请求中快速获取先前检索或计算的数据,从而加速访问速度。在计算机系统中,缓存可以出现在多个层次,包括硬件缓存、操作系统缓存和应用程序级别的缓存。这种机制的基本思想是通过存储一些计算结果或频繁访问的数据,减少对更慢的存储系统(如数据库或磁盘)的访问次数,从而提高系统的性能和响应速度其实缓存是相对的概念比如拿读取速度排序:CPU寄存器 > 内存 > 硬盘 > 网络速度快的设备,可以作为速度慢的设备的缓存最常见的是,使用内存作为硬盘的缓存(redis定位)

dream_ready的博客 1715
上一篇: 《redis学习》-- 缓存穿透和缓存雪崩的预防和解决
下一篇: 《mysql学习》-- MySQL数据库设计总结
fight_zhi
博客等级 码龄14年 27粉丝 66原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值