1、简述

关于Redis键的过期策略,首先要了解两种时间的区别,生存时间和过期时间;

生存时间:一段时长,如30秒、6000毫秒,设置键的生存时间就是设置这个键可以存在多长时间,命令有两个 expire(秒)、pexpire(毫秒)(可以参考Redis(四)--- Redis命令参考)。

过期时间:一个时间点,unix时间戳,设置键的过期时间就是设置键在之后的某个时间点过期,命令两个expreat(秒时间戳)、pexpireat(毫秒时间戳)。

无论是过期时间或生存时间,在底层存储都会转换为unix时间戳,由于过期就是设置的unix时间错,所以我们通常把两种时间都叫做过期时间。

当内存使用达到Redis限制的上限时,就会触发内存淘汰机制。

2、过期策略

通过上一章(Redis(五)--- Redis的持久化RDB和AOF)第一节可以知道,Reids键的过期时间都是存在数据库结果中的过期字典中的,那么一个键过期了,什么时候回进行删除呢?有三种策略。

(1)定时删除:在设置过期时间的同时,设置一个定时器,定时器的执行时间就是过期的时间点。

    • 优点:对内存最友好,过期的键会以最快的被删除,释放内存。
    • 缺点:对CPU时间最不友好,在大量键设置过期时间时,会创建大量的定时器,执行浪费CPU时间。

(2)惰性删除:不管键是否过期,只有每次取值的时候,才检查是否过期,过期就删除。

    • 优点:对CPU时间最友好,取值时检查,只对当前键操作,不影响其他。
    • 缺点:队内存不友好,可能会存在大量过期的未被使用的键值没有删除,无用数据占用了大量内存。

(3)定期删除:每隔一段时间,程序对数据库进行一次检查,过期的就删除。

    • 优点:前两种方案的折中,通过减少执行频率来减少对CPU时间的影响,通过定期删除减少了对内存的浪费。
    • 缺点:执行频率需要掌握好,不然太频繁则退化成定时删除,太少则退化成惰性删除。

Redis采用的是惰性删除和定期删除两种策略。

持久化和复制对过期键的处理

(1)RDB持久化

主服务器:RDB文件无论是生成或载入,都会对过期键进行检查;生成时,过期键不写入;载入时,过期键会忽略。

从服务器:载入时,不会检查是否过期,数据都会载入。

(2)AOF持久化

AOF文件写入时,键过期未删除,不影响;键过期已删除,则在AOF文件后追加DEL命令。

(3)AOF重写

AOF重写过程中会进行检查,过且的键忽略。

(4)复制

主从模式下,由主服务器进行删除过期键,并显示的向从服务器发送DEL命令;从服务器自身不具备删除过期键值行为。

3、内存淘汰机制

当Redis的内存使用达到设置的内存上限时就会触发内存淘汰机制,按照特定的淘汰算法进行数据清理,释放内存。

具体的内存淘汰算法有一以下几种:

(1)noeviction:不淘汰,内存不足时, 新写入会报错。

(2)allkeys-lru:LRU,内存不足时,淘汰最近最少使用的key。

(3)allkeys-random:随机,内存不足时,在所有key中随机选择一个key淘汰。

(4)volatile-lru:过期时间内LRU,内存不足时,在设置了过期时间的key中,淘汰最近最少使用的key。

(5)volatile-random:过期时间内随机,内存不足时,在设置了过期时间的key中,随机选择一个key淘汰。

(6)volatile-ttl:更早过期时间,内存不足时,在设置了过期时间的key中,选择有更早过期时间的key淘汰。

Redis默认使用的是LRU算法,需要注意的是LRU并不是多有的keys进行LRU,而是在所有的key中随机选择3个key,在这3个key中进行LRU算法选择;3个这个个数可以在redis配置文件中进行配置maxmeory-samples选项。

在大规模并发的情况下,我们可以使用集群方式进行内存的扩充。

4、总结

    • Redis的过期策略和内存淘汰机制是两种不同的方式,注意不要混淆
    • 在内存淘汰期间并不会影响过期删除处理,过期策略主要用于处理内存中过且的数据。

参考:

《Redis设计与实现》黄健宏著,网上对Redis的详解等

此博客为笔者使用redis很久之后,参考网络上各类文章总结性书写,原创手打,如有错误欢迎指正。

Redis(六)--- Redis过期策略与内存淘汰机制的更多相关文章

  1. 关于redis的几件小事(四)redis的过期策略以及内存淘汰机制

    1.数据为什么会过期? 首先,要明白redis是用来做数据缓存的,不是用来做数据存储的(当然也可以当数据库用),所以数据时候过期的,过期的数据就不见了,过期主要有两种情况, ①在设置缓存数据时制定了过 ...

  2. Redis的过期策略和内存淘汰机制

    过期策略 我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时,我们自己可以指定缓存到期就失效. 如果假设你设置一个一批key只能存活1个小 ...

  3. redis的过期策略以及内存淘汰机制

    redis采用的是定期删除+惰性删除策略. 为什么不用定时删除策略? 定时删除,用一个定时器来负责监视key,过期则自动删除.虽然内存及时释放,但是十分消耗CPU资源.在大并发请求下,CPU要将时间应 ...

  4. redis过期策略和内存淘汰机制

    目录 常见的删除策略 redis使用的过期策略:定期删除+惰性删除 定期删除 惰性删除 为什么要采用定期删除+惰性删除2种策略呢? redis内存淘汰机制 常见的删除策略 1.定时删除:在设置键的过期 ...

  5. redis过期策略与内存淘汰机制分析

    过期策略: 我们在set key时,可以给一个expire time,就是过期时间 这段过期时间以后,redis对key删除使用:定期删除+惰性删除 定期删除指redis默认在100ms内随机抽取一些 ...

  6. redis过期策略以及内存淘汰机制(理论+配置)

    一.redis的过期策略: redis的过期策略是:定期删除+惰性删除redis在存储数据时,可能会设置过期时间,而所谓的定期删除,指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的k ...

  7. redis过期策略、内存淘汰策略、持久化方式、主从复制

    原文链接:https://blog.csdn.net/a745233700/article/details/85413179 一.Redis的过期策略以及内存淘汰策略:1.过期策略:定期删除+惰性删除 ...

  8. Redis的过期删除策略(和内存淘汰机制)-转

    版权声明:本文为CSDN博主「奥修诺斯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/qq_39944869/ ...

  9. Redis 中的过期删除策略和内存淘汰机制

    Redis 中 key 的过期删除策略 前言 Redis 中 key 的过期删除策略 1.定时删除 2.惰性删除 3.定期删除 Redis 中过期删除策略 从库是否会脏读主库创建的过期键 内存淘汰机制 ...

随机推荐

  1. 面试还不知道BeanFactory和ApplicationContext的区别?

    接口 BeanFactory 和 ApplicationContext 都是用来从容器中获取 Spring beans 的,但是,他们二者有很大不同 我看到过很多问 BeanFactory 和 App ...

  2. System.arraycopy 和 Arrays.copyOf

    System.arraycopy /* native关键字 本地方法 System类 java.lang.System.class 参数说明: src - 源数组. srcPos - 源数组中的起始位 ...

  3. .NET开发框架(三)-高可用服务器端设计

    我们对框架功能作了简述,演示视频请点击 这里查看 ,若需要查看更多此框架的技术文章,请关注.NET框架学苑公众号! 本章节,我们专门讲解一下,如何在Window服务器下,设计高可用的框架. 我们的框架 ...

  4. 【安装】Hadoop2.8.0搭建过程整理版

    Hadoop搭建过程 前期环境搭建主要分为软件的安装与配置文件的配置,集成的东西越多,配置项也就越复杂. Hadoop集成了一个动物园,所以配置项也比较多,且每个版本之间会有少许差异. 安装的方式有很 ...

  5. Docker中使用CentOS7镜像

    因后面会将操作系统从CentOS6.4升级到CentOS7,先试用下CentOS7. 启动容器服务 systemctl start docker.service 下载CentOS7 镜像   [roo ...

  6. 苹果二代TWS无线耳机AirPods调研

    产品介绍 苹果AirPods二代自从2018年9月份上市以来,到现在将近一年的时间了,据江湖传闻,苹果AirPods的总售卖个数,已经超过了5000W部,这样价格的TWS耳机,能够卖那么多的量,估计也 ...

  7. 使用 cxf的程序 在win10 测试部署时报空指针异常

    2018-11-08 15:50:55.072 DEBUG 21524 --- [nio-8080-exec-1] o.s.b.w.s.f.OrderedRequestContextFilter  : ...

  8. Effective Java - 构造器私有、枚举和单例

    目录 饿汉式单例 静态常量 静态代码块 懒汉式单例 尝试加锁 同步代码块 双重检查 静态内部类单例 枚举单例 Singleton 是指仅仅被实例化一次的类.Singleton代表了无状态的对象像是方法 ...

  9. HDU 5775:Bubble Sort(树状数组)

    http://acm.hdu.edu.cn/showproblem.php?pid=5775 Bubble Sort Problem Description   P is a permutation ...

  10. scrapy基础知识之将item 通过pipeline保存数据到mysql mongoDB:

    pipelines.py class xxPipeline(object): def process_item(self, item, spider): con=pymysql.connect(hos ...