关注微信公众号“虾米聊吧”,每天更新一篇技术文章,文章内容涵盖架构师成长必经之路应掌握的技术,一起学习,一起交流。

开篇提问:你是否遇到过生产环境redis丢数据的问题?比如你刚刚写入了一堆数据到redis,然后过了一会就没了,那么这是什么原因造成的呢?接下来我们简单探讨一下这个问题。

首先要明确一点,redis是用来做缓存的并不是用来做常规存储的,千万不要什么数据都一股脑往里面丢,毕竟内存是很宝贵而有限的资源,不比磁盘,磁盘是非常廉价的。一台服务器可能内存就几十个G,但是却有几个T的磁盘空间。redis主要是基于内存操作的,用来提高高并发下的读写操作性能。

因为内存是有限的所以,如果你写入的数据超出了redis可用内存的大小,那么redis会基于LRU算法清理掉部分数据,举个例子,如果设置了你的redis是可以使用16G内存,你要是往里面写了20G数据。那么自然会清理掉4G数据,然后保留16G数据,清理掉的数据通常是不常使用的,然后保留常用数据。

因此,redis中的数据是会过期的,要么是你自己设置了过期时间,要么是redis自己给清理掉了。

说到这里,那么问题来了,redis具体是怎么清理掉我们设置了过期时间的数据的呢因为有时候你在监控内存的时候可能会发现,明明好多数据都设置了过期时间,但是redis的内存依然占用很高,这个时候你可能就会挠挠头一脸懵逼了,那么接下来我们将简单探讨一下具体redis是怎么删除那些过期key的。

因为如果不清楚redis的清理删除机制,可能会导致在高并发的场景中,redis没有有效的提升系统的性能,还有可能导致其他的问题。

redis删除清理key的一般有如下两种情况:(1)对设置过期时间redis的进行删除(2)通过内存淘汰机制删除部分key;下面我们对这两种情况的原理分别进行探讨。

01  设置过期时间redis的清理机制

redis中对某一个key设置过期时间相信我们再熟悉不过了,因为我们只要在set key的时候,就可以给一个expire time,就是过期时间,指定这个key多久后过期,到达过期时间后缓存就会失效。

那么具体redis是怎么删除我们这些已经过期的key的呢?

答案是:定期删除+惰性删除

所谓定期删除,指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注意,这里并不是每隔100ms就遍历所有的设置过期时间的key,因为如果是遍历检测所有设置过期时间的key的话那你的redis基本就挂了。简单做个比喻说明:假设redis里存放了100万个key,都设置了过期时间,你每隔几百毫秒,就检查这100万个key,那么很不幸你的redis基本上就死了,因为cpu的负载全消耗在你检查过期key上了。实际上redis是每隔100ms随机抽取一些key来检查和删除的。

但是随机抽取一些key的话又会造成另一个问题: 可能会出现很多过期key到了时间并没有被删除掉,因为随机抽取的时候并没有抽取到,那redis又是怎么解决这个问题的呢?答案就是惰性删除。惰性删除的意思就是,在你获取某个key的时候,redis会检查一下 ,这个key是否设置了过期时间,如果设置了过期时间那么是否过期了?如果过期了此时就会删除该key,并不会给你返回任何东西。因此要注意并不是key到时间就会被删除掉,而是你查询这个key的时候,redis再懒惰的检查一下

redis就是通过上述两种手段结合起来,以确保过期的key一定会被删除掉。

简单来说就是你设置的过期key,如果通过定期删除没有被删除掉,就仍然会停留在内存里,占用着你的内存,这个时候只有你的系统去主动查一下那个key,才会被redis给删除掉

但是实际上经过以上的处理机制后,如果定期删除漏掉了很多过期key的话,然后你也没及时去查,也就没走惰性删除,就会造成大量过期key堆积在内存里,最终仍然可能会导致redis内存耗尽,因此这个问题又该怎么解决呢?

答案是:走内存淘汰策略

02 内存淘汰策略

当redis的内存占用过多或者快达到redis可用内存上限一定比例的时候,此时会触发redis内存淘汰策略,具体有如下一些策略:

1)noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用

2)allkeys-lru当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)

3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key,这个一般也没人用

4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key(这个一般不太合适)

5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key

6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除

注:一般都是采用第二种策略allkeys-lru,因为删除最近最少使用key基本符合我们的业务要求

关注微信公众号“虾米聊吧”,获取更多知识资料干货~,一起交流,一起学习~,

一起打卡学习,一起交流进步吧!

微信扫描二维码,关注我的公众号

redis过期策略和淘汰机制你知道多少?相关推荐

  1. 【Redis过期策略/内存淘汰机制/对过期Key的处理】

    我是

  2. redis过期策略与淘汰策略

    redis过期策略与淘汰策略 1.过期策略 2.淘汰策略 3.在哪里配置? 4.Lazy Free 1.过期策略 1.redis中所有的key都可以通过expire命令来设置过期时间,所有被设置了过期 ...

  3. Redis 过期策略和淘汰策略

    1.Redis 过期策略 Redis 过期策略用于处理设置了缓存时间的数据,使用定时扫描和惰性删除机制删除到期的缓存数据. Redis 将设置了过期时间的 key 保存在一个独立的字典中,定时扫描就是 ...

  4. c# redis hashid如何设置过期时间_Redis中Key过期策略amp;淘汰机制

    1. Redis中设置Key过期时间 我们有两种方式设置过期时间 1.1 设置多久后过期 设置一个 key 10s 过期,可以这样 127.0.0.1:6379> SET key value E ...

  5. @cacheable 设置过期时间_缓存面试三连击——聊聊Redis过期策略?内存淘汰机制?再手写一个LRU 吧!...

    大家好,今天我和大家想聊一聊有关redis的过期策略的话题. 听到这里你也许会觉得:"我去,我只是个日常搬砖的,这种偏底层的知识点,我需要care吗?" 话虽如此·,但是兄die, ...

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

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

  7. Redis过期策略与内存淘汰机制

    参考博客:https://blog.csdn.net/u010006156/article/details/124914082 Redis过期策略与内存淘汰机制 过期策略简介 作用 redis数据都是 ...

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

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

  9. redis 过期策略

    redis 过期策略是:定期删除+惰性删除. 所谓定期删除,指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除. 假设 redis 里放 ...

最新文章

  1. C++中类的多态与虚函数的使用(转)
  2. 缓存工具类MyCacheUtil
  3. SpringMVC第五次课 SSM整合
  4. .NET Core 3.1 编写混合 C++ 程序
  5. java 圆的交点_java – 获取线条和形状的交点
  6. 基于keepalived实现haproxy高可用的双主模型配置
  7. 第十二章: 部署Django
  8. Oracel 连接远端服务器
  9. 入门深度学习,理解神经网络、反向传播算法是第一关
  10. 开发环境ubuntu16.04常用工具和设置(git、ssh、python、sh、java、Maven、mysql、postgresql)
  11. excel 第六次人口普查_第六次全国人口普查表短表
  12. 阅读笔记——凤凰架构(第1章)
  13. autoshape很多 excel_怎样清除excle中Autoshape_ExceL批注属性批量修改宏代码�9�3
  14. Python开发 CDN查询子域名查询
  15. mobi转为html,MOBI to HTML
  16. 哈工大计算机系王晓龙,林磊,讲师,2004获得哈尔滨工业大学计算机应用专业工学博士学位 ......
  17. 服务器修改客户端密码错误,服务端PAK密码错误解决方法
  18. phpexcel mysql 导出_PHPEXCEL结合MYSQL+PHP实现数据库数据导出EXCEL实例
  19. linux硬件设备操作函数 open(/dev/ietctl, O_RDWR|...)
  20. 交互式多模型-无迹卡尔曼滤波IMM-UKF算法matlab实现(跟踪场景二)

热门文章

  1. php text留言本,PHP+TEXT留言本(五)
  2. java 6 jaxb_JAVA6开发WebService (五)—— JAXB
  3. make: *** 没有规则可以创建“default”需要的目标“build”
  4. c语言中数组大小10000,C语言,怎么存一个很大的数,比方说10000的阶乘
  5. 量子计算机到底多强大?从量子运算看清楚它们的能力
  6. JavaScript取出字符串中括号里的内容
  7. Java URL协议扩展实现
  8. opensuse x64下编译Ice源码(以编译c++为例)
  9. 通过自定义配置实现插件式设计
  10. 10 个开发新人提及最多的 GitHub Repo