CSDN话题挑战赛第2期
参赛话题:面试宝典

金九银十之际,一定有很多朋友出去面试,通过每一次的面试,都可以检查一下自己的技术能力是什么样的,所以在面试前的准备是必不可少的环节。
俗话说的好:从不打无准备的仗,方能立于不败之地。面试也是一样,做足够的准备,就一定能够面试成功,所以接来下总结一篇Redis的过期策略相关的面试会问到点和回答方式。

面试时可能会问到Redis的过期策略

  • 面试官:Redis为什么要内存回收?
  • 面试官:Redis的内存回收策略有哪些?
  • 面试官:过期删除策略是什么实现的呢?
  • 面试官:内存淘汰策略是什么实现的呢?
  • 面试官:什么时候会进行淘汰?
  • 面试官:Redis在项目中的哪些地方有用到?
  • 个人经验总结

上一篇有回顾Redis事务机制Redis
可以点链接回顾下这一块的知识点,都知道Redis具备查询效率高,使用简单,方便,基于内存存储的。

面试官:Redis为什么要内存回收?

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

面试官:Redis的内存回收策略有哪些?

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

面试官:过期删除策略是什么实现的呢?

过期删除策略就是删除set时设置的过期时间超过当前时间的key。主要有三种实现方式:

  • 定时删除:
    对于每一个设置了过期时间的key都会创建一个定时器,一旦到达过期时间就立即删除。该策略可以立即清除过期的数据,对内存较友好,但是缺点是占用了大量的CPU资源去处理过期的数据,会影响Redis的吞吐量和响应时间。

  • 惰性删除:
    当访问一个key时,才判断该key是否过期,过期则删除。该策略能最大限度地节省CPU资源,但是对内存却十分不友好。有一种极端的情况是可能出现大量的过期key没有被再次访问,因此不会被清除,导致占用了大量的内存。

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

在计算机科学中,懒惰删除(英文:lazy deletion)指的是从一个散列表(也称哈希表)中删除元素的一种方法。在这个方法中,删除仅仅是指标记一个元素被删除,而不是整个清除它。被删除的位点在插入时被当作空元素,在搜索之时被当作已占据。

在Redis中,同时使用了定期删除和惰性删除。不过Redis定期删除采用的是随机抽取的方式删除部分Key,因此不能保证过期key 100%的删除。

面试官:内存淘汰策略是什么实现的呢?

Redis的内存淘汰策略,是指内存达到maxmemory极限时,使用某种算法来决定清理掉哪些数据,以保证新数据的存入。

Redis的内存淘汰机制包括:

  • noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错。
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间(server.db[i].dict)中,移除最近最少使用的 key(这个是最常用的)。
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间(server.db[i].dict)中,随机移除某个 key。
  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间(server.db[i].expires)中,移除最近最少使用的 key。
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间(server.db[i].expires)中,随机移除某个 key。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间(server.db[i].expires)中,有更早过期时间的 key 优先移除。

在配置文件中,通过maxmemory-policy可以配置要使用哪一个淘汰机制。

面试官:什么时候会进行淘汰?

Redis会在每一次处理命令的时候(processCommand函数调用freeMemoryIfNeeded)判断当前redis是否达到了内存的最大限制,如果达到限制,则使用对应的算法去处理需要删除的key。

在淘汰key时,Redis默认最常用的是LRU算法(Latest Recently Used)。Redis通过在每一个redisObject保存lru属性来保存key最近的访问时间,在实现LRU算法时直接读取key的lru属性。

具体实现时,Redis遍历每一个db,从每一个db中随机抽取一批样本key,默认是3个key,再从这3个key中,删除最近最少使用的key。

面试官:Redis在项目中的哪些地方有用到?

(1)共享session

在分布式系统下,服务会部署在不同的tomcat,因此多个tomcat的session无法共享,以前存储在session中的数据无法实现共享,可以用redis代替session,解决分布式系统间数据共享问题。

(2)数据缓存

Redis采用内存存储,读写效率较高。我们可以把数据库的访问频率高的热点数据存储到redis中,这样用户请求时优先从redis中读取,减少数据库压力,提高并发能力。

(3)异步队列

Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。而且Redis中还有pub/sub这样的专用结构,用于1对N的消息通信模式。

(4)分布式锁

Redis中的乐观锁机制,可以帮助我们实现分布式锁的效果,用于解决分布式系统下的多线程安全问题

个人经验总结

面试过程中不要紧张,找工作面试是双向选择的嘛,心态要好。面试官提的问题对自己知道的呢要表达的有逻辑性,尽量回到问题的点上,不要答非所问这样的话就很难通过面试的。对于不会的呢要巧妙的告知面试官,在其他方面比较占优势一些。面试结束之后要不断的总结归纳,可能同一个问题在下一次面试时又会被问到。所以总结复盘准不会错的,这样空了时候可以找出来查阅一下,才会的记得更牢固一些。

【Redis】回顾下Redis的过期策略相关推荐

  1. Redis系列(三)--过期策略

    制定Redis过期策略,是整个Redis缓存策略的关键之一,因为内存来说,公司不可能无限大,所以就要对key进行一系列的管控. 文章结构: (1)理解Redis过期设置API(命令与Java描述版本) ...

  2. redis同步效率秒_redis过期策略、内存淘汰策略、持久化方式、主从复制

    一.Redis的过期策略以及内存淘汰策略: 1.过期策略:定期删除+惰性删除: ①定期删除:redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果有过期就删除.注意这里 ...

  3. Redis的持久化机制、过期策略、淘汰策略

    文章目录 一.持久化机制 1. RDB机制 2. AOF机制 RDB的优缺点 AOF的优缺点 持久化机制选择 二.过期策略 常见过期策略 Redis过期策略 1. 定期删除 2. 惰性删除 RDB对过 ...

  4. Redis(五)Redis内存维护方案(过期策略及淘汰策略)

    目录 内存维护解决方案 过期策略 内存淘汰策略 内存维护解决方案 在Redis的配置文件中redis.conf 中memeory managment # maxmemory <bytes> ...

  5. Redis和Memcached:数据类型 过期策略 持久策略 虚拟内存 Value大小

    1.Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash.bitmaps.hyperloglog.geo  2.虚拟内存Redis当物理内存用完时,可以将一些很久没用到的v ...

  6. 【Redis扩展篇(一)】过期策略

    Redis过期策略 0. 前言 Redis所有的数据结构都可以设置过期时间,时间一到就会被自动删除.但是会不会因为统一时间太多的key过期,导致Redis执行执行出现卡顿.因为Redis是单线程的,收 ...

  7. Redis学习笔记--Redis数据过期策略详解==转

    本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存sessi ...

  8. Redis主从模式下从库过期的key仍然能够被读到的解决方案

    大家在使用redis的时候,经常会用expire来设置key的过期时间,以为某个key到期就会马上清除.如果只是在单个redis(即一个主redis)下是没有问题的.但是如果为了实现读写分离,搭建了主 ...

  9. redis 的6种过期策略

    redis 官方提供的 conf https://raw.github.com/antirez/redis/2.2/redis.conf 中6中过期策略的具体方式. redis 中的默认的过期策略是v ...

最新文章

  1. linux svn missingargument -m,缺少參數-m在windows powershell中使用svn。
  2. C#:设置当前线程的区域性
  3. linux shell程序代码,linux shell实用程序源代码pidof
  4. node+ejs模板引擎的应用
  5. ▲我的css架构理念
  6. PHP中迭代器是什么?
  7. mac svn 使用
  8. java abstractnumlist_如何从List集合中删除对象
  9. python gevent async_详解python之协程gevent模块
  10. Spring在多线程中bean的注入问题
  11. CFA2019notes的PDF版本,热乎乎的百度网盘分享
  12. VMware ESXi安装mac os
  13. “天鹅”类谜解大全!-
  14. matlab 无刷电机,无刷直流电机MATLAB仿真模型
  15. Java成员变量和局部变量
  16. android解压rar方法,Android以编程方式解压缩RAR文件
  17. 深度剖析Java集合之Stack
  18. Excel如何从单元格中提取中文汉字
  19. 计算机网络物理层测试2
  20. 劝告所有人,特别是中年人,不要轻易离职

热门文章

  1. DirectUI学习笔记(1)
  2. 换博客拉 http://vergilwang.iteye.com/
  3. java如何处理excel的读取
  4. win10系统开启局域网共享
  5. 吐血整理!140种Python标准库、第三方库和外部工具都有了
  6. 费马小定理【模板例题】
  7. MPSOC之8——启动及错误处理
  8. 计科之路--linux学习
  9. 免费图片转pdf的方法?学会图片转pdf很重要
  10. 一球从h米高度自由下落,每次落地后返回原高度的一半,再落下。它在第N次落地时共经过多少米?反弹多高?