mian题目

xingmeng1 / 2023-05-08 / 原文

 

 

①、如何设置Redis键的过期时间?

②、设置完一个键的过期时间后,到了这个时间,这个键还能获取到么?假如获取不到那这个键还占据着内存吗?

③、如何设置Redis的内存大小?当内存满了之后,Redis有哪些内存淘汰策略?我们又该如何选择?

 1、redis过期的删除策略

  答:有三种删除策略(redis采用组合使用:惰性删除 和 定期删除)

    惰性删除:设置该key 过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key。(db.c/expireIfNeeded 函数实现,所有键读写命令执行之前都会调用 expireIfNeeded 函数对其进行检查,如果过期,则删除该键,然后执行键不存在的操作;未过期则不作操作,继续执行原有的命令。

  优点:对 CPU友好,我们只会在使用该键时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查。

  缺点:对内存不友好,如果一个键已经过期,但是一直没有使用,那么该键就会一直存在内存中,如果数据库中有很多这种使用不到的过期键,这些键便永远不会被删除,内存永远不会释放。从而造成内存泄漏。

    定期删除:每隔一段时间,我们就对一些key进行检查,删除里面过期的key。(由redis.c/activeExpireCycle 函数实现,函数以一定的频率运行,每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键

  优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除,也能有效释放过期键占用的内存。

  缺点:难以确定删除操作执行的时长和频率。

     如果执行的太频繁,定期删除策略变得和定时删除策略一样,对CPU不友好。

     如果执行的太少,那又和惰性删除一样了,过期键占用的内存不会及时得到释放。

       定时删除:在设置某个key 的过期时间同时,我们创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作。

    优点:定时删除对内存是最友好的,能够保存内存的key一旦过期就能立即从内存中删除。

    缺点:对CPU最不友好,在过期键比较多的时候,删除过期键会占用一部分 CPU 时间,对服务器的响应时间和吞吐量造成影响

 

2、Redis过期时间的判定

   答:redis内部,每当我们设置一个键的过期时间,redis就会将改键带上过期时间存放到一个过期字典中,当我们查询一个键时,redis便首先检查该键是否存在过期字典中,如果存在,那就获取其过期时间。然后将过期时间和当前时间进行对比,比系统时间大,那就没有过期,反之过期

 

3、内存淘汰策略

 

   答:①、设置Redis最大内存

  在配置文件redis.conf 中,可以通过参数 maxmemory <bytes> 来设定最大内存

 ②、设置内存淘汰策略方法

  当现有内存大于 maxmemory 时,便会触发redis主动淘汰内存方式,通过设置 maxmemory-policy ,有如下几种淘汰方式:

  1)volatile-lru   利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used ) 。

  2)allkeys-lru   利用LRU算法移除任何key (和上一个相比,删除的key包括设置过期时间和不设置过期时间的)。通常使用该方式

  3)volatile-random 移除设置过过期时间的随机key 。

  4)allkeys-random  无差别的随机移除。

  5)volatile-ttl   移除即将过期的key(minor TTL) 

  6)noeviction 不移除任何key,只是返回一个写错误 ,默认选项,一般不会选用。

  在redis.conf 配置文件中,可以设置淘汰方式:

 

3、Redis数据同步机制

  全量复制和增量复制

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

阿达

 

优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除,也能有效释放过期键占用的内存。

  缺点:难以确定删除操作执行的时长和频率。

     如果执行的太频繁,定期删除策略变得和定时删除策略一样,对CPU不友好。

     如果执行的太少,那又和惰性删除一样了,过期键占用的内存不会及时得到释放。

     另外最重要的是,在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是业务不能忍受的错误。

回到顶部

4、Redis过期删除策略

  前面讨论了删除过期键的三种策略,发现单一使用某一策略都不能满足实际需求,聪明的你可能想到了,既然单一策略不能满足,那就组合来使用吧。

  没错,Redis的过期删除策略就是:惰性删除和定期删除两种策略配合使用。

  惰性删除:Redis的惰性删除策略由 db.c/expireIfNeeded 函数实现,所有键读写命令执行之前都会调用 expireIfNeeded 函数对其进行检查,如果过期,则删除该键,然后执行键不存在的操作;未过期则不作操作,继续执行原有的命令。

  定期删除:由redis.c/activeExpireCycle 函数实现,函数以一定的频率运行,每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。

  注意:并不是一次运行就检查所有的库,所有的键,而是随机检查一定数量的键。

  定期删除函数的运行频率,在Redis2.6版本中,规定每秒运行10次,大概100ms运行一次。在Redis2.8版本后,可以通过修改配置文件redis.conf 的 hz 选项来调整这个次数。

  

 

  看上面对这个参数的解释,建议不要将这个值设置超过 100,否则会对CPU造成比较大的压力。

  我们看到,通过过期删除策略,对于某些永远使用不到的键,并且多次定期删除也没选定到并删除,那么这些键同样会一直驻留在内存中,又或者在Redis中存入了大量的键,这些操作可能会导致Redis内存不够用,这时候就需要Redis的内存淘汰策略了。

回到顶部

5、内存淘汰策略

①、设置Redis最大内存

  在配置文件redis.conf 中,可以通过参数 maxmemory <bytes> 来设定最大内存:

  

  不设定该参数默认是无限制的,但是通常会设定其为物理内存的四分之三。(这里有个疑惑:为啥作者不考虑将此参数设定为百分比呢?)

②、设置内存淘汰方式

  当现有内存大于 maxmemory 时,便会触发redis主动淘汰内存方式,通过设置 maxmemory-policy ,有如下几种淘汰方式:

  1)volatile-lru   利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used ) 。

  2)allkeys-lru   利用LRU算法移除任何key (和上一个相比,删除的key包括设置过期时间和不设置过期时间的)。通常使用该方式

  3)volatile-random 移除设置过过期时间的随机key 。

  4)allkeys-random  无差别的随机移除。

  5)volatile-ttl   移除即将过期的key(minor TTL) 

  6)noeviction 不移除任何key,只是返回一个写错误 ,默认选项,一般不会选用。

  在redis.conf 配置文件中,可以设置淘汰方式:

  

回到顶部

6、总结

  通过上面的介绍,相信大家对Redis的过期数据删除策略和内存淘汰策略有一定的了解了。这里总结一下:

  Redis过期删除策略是采用惰性删除和定期删除这两种方式组合进行的,惰性删除能够保证过期的数据我们在获取时一定获取不到,而定期删除设置合适的频率,则可以保证无效的数据及时得到释放,而不会一直占用内存数据。

  但是我们说Redis是部署在物理机上的,内存不可能无限扩充的,当内存达到我们设定的界限后,便自动触发Redis内存淘汰策略,而具体的策略方式要根据实际业务情况进行选取。

回到顶部

资料推荐

最近又赶上跳槽的高峰期(招聘旺季),好多读者都问我要有没有最新面试题,找华为朋友整理一份内部资料《第6版:互联网大厂面试题》!

整个资料包,包括 Spring、Spring Boot/Cloud、Dubbo、JVM、集合、多线程、JPA、MyBatis、MySQL、大数据、Nginx、Git、Docker、GitHub、Servlet、JavaWeb、IDEA、Redis、算法、面试题等几乎覆盖了 Java 基础和阿里巴巴等大厂面试题等、等技术栈!

 

 

 另外,还有博主为大家整理的Java关键字解析、Java源码解析

 

 

 

 

 

据说已经有小伙伴通过这套资料,成功的入职了蚂蚁金服、字节跳动等大厂。

而且,这些资料不是扫描版的,里面的文字都可以直接复制,非常便于我们学习: 

如果你想获得完整PDF可以通过以下方式获得

面试大全怎么获取:

  1. 关注下方公众号
  2. 在下方公众号后台回复 【666】 即可。
作者:IT可乐

资源:微信搜【IT可乐】关注我,回复 【电子书】有我特别筛选的免费电子书。
本文版权归作者所有,欢迎转载,但未经作者同意不能转载,否则保留追究法律责任的权利。
 
分类: Redis详解
标签: Redis详解
好文要顶 关注我 收藏该文  
YSOcean
粉丝 - 5790 关注 - 15
 
 
8
 
 
 
« 上一篇: Redis详解(十)------ 集群模式详解
» 下一篇: Redis详解(十二)------ 缓存穿透、缓存击穿、缓存雪崩
posted @ 2020-06-01 09:06  YSOcean  阅读(26769)  评论(8)  编辑  收藏  举报
 

 
   回复 引用
#1楼 2020-06-11 17:42 鲜橙

②、设置内存淘汰方式
  当现有内存大于 maxmemory 时,便会触发redis主动淘汰内存方式,通过设置 maxmory-policy ,有如下几种淘汰方式:
“maxmory-policy”应该是“maxmemory-policy”

支持(0) 反对(0)
   回复 引用
#2楼 [楼主2020-06-12 11:53 YSOcean

@鲜橙
感谢,已更正

支持(0) 反对(0)
   回复 引用
#3楼 2020-11-06 15:00 顾前

"另外最重要的是,在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是业务不能忍受的错误。"
关于这句话,我有两个疑问:第一是在过期字典的key,在过期后还是可能存在的,如果这时候查询此key,得到的结果是什么呢?如果是为空上面那段话就不成立了,如果不为空上面的话就合理咯。盼望赐教,谢谢

支持(0) 反对(0)
   回复 引用
#4楼 2020-12-02 10:44 Hongscar

@顾前
我的理解是,如果只有定期删除策略,那么键过期,但还没删除,此时查询应该是能得到相应的value的。但Redis是惰性删除+定期删除结合起来,所以不会出现这种情况,因为惰性删除会使得已过期的键在查询的时候进行删除。

支持(0) 反对(0)
   回复 引用
#5楼 2021-02-04 17:01 杨国胜

“另外最重要的是,在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是业务不能忍受的错误。”
上面不是说会检查过期字典吗?难道是只有“惰性删除”策略的时候才会检查?

支持(0) 反对(0)
   回复 引用
#6楼 [楼主2021-02-04 17:47 YSOcean

@杨国胜
定期删除是一种策略,会删除一些过期的key,不是全部,所以如果只是定期删除这一种策略,肯定会出现使用到某些还没来得及删除的key

支持(0) 反对(0)
   回复 引用
#7楼 2022-01-13 12:01 茶余饭后聊代码

写的不错

支持(0) 反对(0)
   回复 引用
#8楼 2022-04-22 17:56 Johnnyzn

既然allkeys-lru是通常使用的方式,为什么默认选项是noeviction而不是allkeys-lru呢

支持(0) 反对(0)
 
 
刷新评论刷新页面返回顶部
发表评论
编辑预览
 

 退出 订阅评论 我的博客

 

[Ctrl+Enter快捷键提交]

 
【推荐】中国云计算领导者:阿里云轻量应用服务器2核2G低至108元/年
【推荐】面向AI开发者打造的顶级赛事:华为昇腾AI创新大赛2023全新启动
 
编辑推荐:
· 聊一聊 Valgrind 监视非托管内存泄露和崩溃
· Three.js 进阶之旅:页面平滑滚动
· 调试器是个大骗子
· [MAUI] 模仿 iOS 多任务切换卡片滑动的交互实现
· golang 中一种不常见的 switch 语句写法
即构专区:
· 如何0代码实现多人音视频通话?【内附源码/Demo】
· 音视频开发进阶|第四讲:音频自动增益控制 AGC
· 即构上线“视频面试”,让远程面试不再“远”
· 即构✖叮咚课堂:行业第一套AI课堂解决方案是怎么被实现的?
· 多路混流实操流程
历史上的今天:
2018-06-01 Redis详解(四)------ redis的底层数据结构