|
|
|
|
移动端

88游戏平台体育:Redis内存回收机制,把我整懵了...

本文来源:http://www.ib556.com/health_sina_com_cn/

申博现金充值登入,她自嘲从小就是个胖妹儿,刚出生就有8斤多,这是我最瘦的时候了,无法逾越的人生巅峰!喜欢吃各种各样的零食、饮料,最爱的是烧烤,最不爱的是运动。19世纪工业革命的到来带来了社会生活方式和工作效率的巨大改变,踢足球成为了工人们为了缓解工作的压力的一项颇受欢迎的运动。今年英超竞争空前激烈,诸多强队都有不俗的战力,争夺前四的难度可能是空前的。各地共查处景区价格违法案件88件,其中包括不按规定内容和方式明码标价32件、不落实门票价格减免优惠政策15件、通过捆绑销售变相涨价11件、擅自提高价格8件、自立项目收费5件、其它价格违法违规行为17件,共实施行政处罚2030万元。

  一旦相关评估和听证过程完成,国际奥委会执委会将在奥运框架下采取相关制裁措施。  震中距乌鲁木齐市区约100公里。比起在江苏队的张常宁,李静的任务很明确,那就是专心进攻。还有疑问,询问请到

  文印才子走歪路  办案民警带领李某某找到其租住的房屋及制假窝点,当场搜出制作假币的彩色打印机20余台,电脑两台及其他物品。国外选手只需凭参赛确认函便可在票厅优惠购票。把过去认为不正常的事认为是正常的事,认为随大流就是顺人意,独善其身则悖常理。  >>发布  相应审查核验仍须进行  市规划国土委相关负责人表示,继承(受遗赠)不动产是否公证,由申请人自行选择这一规定,既是《不动产登记暂行条例》相关规定在北京落实的具体措施,也是一项便民举措,更是一项探索性的措施。

之前看到过一道面试题:Redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?

作者:hoohack来源:hoohack|2019-09-27 09:13

之前看到过一道面试题:Redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?

图片来自 Pexels

笔者结合在工作上遇到的问题学习分析,希望看完这篇文章能对大家有所帮助。

从一次不可描述的故障说起

问题描述:一个依赖于定时器任务的生成的接口列表数据,时而有,时而没有。

怀疑是 Redis 过期删除策略

排查过程长,因为手动执行定时器,Set 数据没有报错,但是 Set 数据之后不生效。

Set 没报错,但是 Set 完再查的情况下没数据,开始怀疑 Redis 的过期删除策略(准确来说应该是 Redis 的内存回收机制中的数据淘汰策略触发内存上限淘汰数据),导致新加入 Redis 的数据都被丢弃了。

最终发现故障的原因是因为配置错了,导致数据写错地方,并不是 Redis 的内存回收机制引起。

通过这次故障后思考总结,如果下一次遇到类似的问题,在怀疑 Redis 的内存回收之后,如何有效地证明它的正确性?如何快速证明猜测的正确与否?以及什么情况下怀疑内存回收才是合理的呢?

下一次如果再次遇到类似问题,就能够更快更准地定位问题的原因。另外,Redis 的内存回收机制原理也需要掌握,明白是什么,为什么。

花了点时间查阅资料研究 Redis 的内存回收机制,并阅读了内存回收的实现代码,通过代码结合理论,给大家分享一下 Redis 的内存回收机制。

为什么需要内存回收?

原因有如下两点:

  • 在 Redis 中,Set 指令可以指定 Key 的过期时间,当过期时间到达以后,Key 就失效了。
  • Redis 是基于内存操作的,所有的数据都是保存在内存中,一台机器的内存是有限且很宝贵的。

基于以上两点,为了保证 Redis 能继续提供可靠的服务,Redis 需要一种机制清理掉不常用的、无效的、多余的数据,失效后的数据需要及时清理,这就需要内存回收了。

Redis 的内存回收机制

Redis 的内存回收主要分为过期删除策略和内存淘汰策略两部分。

过期删除策略

删除达到过期时间的 Key。

①定时删除

对于每一个设置了过期时间的 Key 都会创建一个定时器,一旦到达过期时间就立即删除。

该策略可以立即清除过期的数据,对内存较友好,但是缺点是占用了大量的 CPU 资源去处理过期的数据,会影响 Redis 的吞吐量和响应时间。

②惰性删除

当访问一个 Key 时,才判断该 Key 是否过期,过期则删除。该策略能最大限度地节省 CPU 资源,但是对内存却十分不友好。

有一种极端的情况是可能出现大量的过期 Key 没有被再次访问,因此不会被清除,导致占用了大量的内存。

在计算机科学中,懒惰删除(英文:lazy deletion)指的是从一个散列表(也称哈希表)中删除元素的一种方法。

在这个方法中,删除仅仅是指标记一个元素被删除,而不是整个清除它。被删除的位点在插入时被当作空元素,在搜索之时被当作已占据。

③定期删除

每隔一段时间,扫描 Redis 中过期 Key 字典,并清除部分过期的 Key。该策略是前两者的一个折中方案,还可以通过调整定时扫描的时间间隔和每次扫描的限定耗时,在不同情况下使得 CPU 和内存资源达到最优的平衡效果。

在 Redis 中,同时使用了定期删除和惰性删除。

过期删除策略原理

为了大家听起来不会觉得疑惑,在正式介绍过期删除策略原理之前,先给大家介绍一点可能会用到的相关 Redis 基础知识。

①RedisDB 结构体定义

我们知道,Redis 是一个键值对数据库,对于每一个 Redis 数据库,Redis 使用一个 RedisDB 的结构体来保存,它的结构如下:

  1. typedef struct redisDb { 
  2.         dict *dict;                 /* 数据库的键空间,保存数据库中的所有键值对 */ 
  3.         dict *expires;              /* 保存所有过期的键 */ 
  4.         dict *blocking_keys;        /* Keys with clients waiting for data (BLPOP)*/ 
  5.         dict *ready_keys;           /* Blocked keys that received a PUSH */ 
  6.         dict *watched_keys;         /* WATCHED keys for MULTI/EXEC CAS */ 
  7.         int id;                     /* 数据库ID字段,代表不同的数据库 */ 
  8.         long long avg_ttl;          /* Average TTL, just for stats */ 
  9. } redisDb; 

从结构定义中我们可以发现,对于每一个 Redis 数据库,都会使用一个字典的数据结构来保存每一个键值对,dic