网站建设模板源代码,品牌高端网站建设公司,北京网站建设认知,阿树 wordpress大家好#xff0c;今天我和大家想聊一聊有关redis的过期策略的话题。听到这里你也许会觉得#xff1a;“我去#xff0c;我只是个日常搬砖的#xff0c;这种偏底层的知识点#xff0c;我需要care吗#xff1f;”话虽如此#xff0c;但是兄die,如果你连标题上问题都不知道…大家好今天我和大家想聊一聊有关redis的过期策略的话题。听到这里你也许会觉得“我去我只是个日常搬砖的这种偏底层的知识点我需要care吗”话虽如此·但是兄die,如果你连标题上问题都不知道上来就懵了回答不出来那面试官就有可能有这样的担心“这小伙子对这些问题一无所知会不会想当然的认为写进 redis 的数据就一定会存在后面导致系统各种 bug谁来负责呢”说到这你还会觉得这样的问题毫无意义吗在开始正题之前我想问大家这样的两个问题1. 往 redis 写入的数据怎么没了可能有同学会遇到在生产环境的 redis 经常会丢掉一些数据写进去了过一会儿可能就没了。我的天同学你问这个问题就说明 redis 你就没用对啊。redis 是缓存你给当存储了是吧啥叫缓存用内存当缓存。内存是无限的吗内存是很宝贵而且是有限的磁盘是廉价而且是大量的。可能一台机器就几十个 G 的内存但是可以有几个 T 的硬盘空间。redis 主要是基于内存来进行高性能、高并发的读写操作的。那既然内存是有限的比如 redis 就只能用 10G你要是往里面写了 20G 的数据会咋办当然会干掉 10G 的数据然后就保留 10G 的数据了。那干掉哪些数据保留哪些数据当然是干掉不常用的数据保留常用的数据了。2. 数据明明过期了怎么还占用着内存这是由 redis 的过期策略来决定。有了以上的铺垫我们闲言少叙正题现在开始redis 过期策略redis 过期策略是定期删除惰性删除。所谓定期删除指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key检查其是否过期如果过期就删除。假设 redis 里放了 10w 个 key都设置了过期时间你每隔几百毫秒就检查 10w 个 key那 redis 基本上就死了cpu 负载会很高的消耗在你的检查过期 key 上了。注意这里可不是每隔 100ms 就遍历所有的设置过期时间的 key那样就是一场性能上的灾难。实际上 redis 是每隔 100ms 随机抽取一些 key 来检查和删除的。但是问题是定期删除可能会导致很多过期 key 到了时间并没有被删除掉那咋整呢所以就是惰性删除了。这就是说在你获取某个 key 的时候redis 会检查一下 这个 key 如果设置了过期时间那么是否过期了如果过期了此时就会删除不会给你返回任何东西。获取 key 的时候如果此时 key 已经过期就删除不会返回任何东西。但是实际上这还是有问题的如果定期删除漏掉了很多过期 key然后你也没及时去查也就没走惰性删除此时会怎么样如果大量过期 key 堆积在内存里导致 redis 内存块耗尽了咋整答案是走内存淘汰机制。内存淘汰机制redis 内存淘汰机制有以下几个noeviction: 当内存不足以容纳新写入数据时新写入操作会报错这个一般没人用吧实在是太恶心了allkeys-lru当内存不足以容纳新写入数据时在键空间中移除最近最少使用的 key这个是最常用的allkeys-random当内存不足以容纳新写入数据时在键空间中随机移除某个 key这个一般没人用吧为啥要随机肯定是把最近最少使用的 key 给干掉啊。volatile-lru当内存不足以容纳新写入数据时在设置了过期时间的键空间中移除最近最少使用的 key这个一般不太合适volatile-random当内存不足以容纳新写入数据时在设置了过期时间的键空间中随机移除某个 keyvolatile-ttl当内存不足以容纳新写入数据时在设置了过期时间的键空间中有更早过期时间的 key 优先移除手写一个 LRU 算法你可以现场手写最原始的 LRU 算法那个代码量太大了似乎不太现实。不求自己纯手工从底层开始打造出自己的 LRU但是起码要知道如何利用已有的 JDK 数据结构实现一个 Java 版的 LRU。END石杉的架构笔记idshishan100 作者中华石杉多年BAT架构经验倾囊相授 作者石杉的架构笔记链接http://www.imooc.com/article/289884