• Redis过期


    Redis过期

    为什么设置过期?

    1.因为内存是有限的,如果缓存中的所有数据都是一直保存的话,分分钟直接Out of memory。

    2.有些场景需要设置过期时间:比如短信验证

    如果使用传统的数据库来处理的话,一般都是自己判断过期,这样更麻烦并且性能要差很多

    如何设置过期?

    Redis中除了字符串类型有自己独有设置过期时间的命令 setex 外,其他方法都需要依靠 expire 命令来设置过期时间 。另外, persist 命令可以移除一个键的过期时间

    如何判断过期?

    Redis 通过一个叫做过期字典(可以看作是hash表)来保存数据过期的时间

    typedef struct redisDb {
        ...
        dict *dict;     //数据库键空间,保存着数据库中所有键值对
        dict *expires   // 过期字典,保存着键的过期时间
        ...
    } redisDb;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    举例:
    有三个类型数据:List类型的alphabet ,Hash类型book,string类型message

    alphabet对于值为string类型a,string类型b,string类型c

    book对应值为string类型name,string类型author,string类型publicsher

    message对应值为string类型的hello world

    alphabet过期时间为long long类型1385877600000

    在这里插入图片描述

    过期删除策略

    redis提供了以下三种删除策略,可以根据实际业务场景选择合适的删除策略

    定时删除,惰性删除,定期删除,内存淘汰机制

    • 定时删除 对内存友好,对CPU不友好
      对内存是最友好的:通过定时器,定时删除策略可以保证过期键会尽快被删除,并释放过期键所占用的内存

      对 CPU 时间不友好:在过期键比较多的情况下,删除过期键可能会占用相当一部分 CPU 时间

    • 惰性删除 对内存不友好,对CPU友好
      对 CPU 时间最友好:程序只会在取出键时才对键进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行,并且删除的目标仅限于当前处理的键,这个策略不会在删除其他无关的过期键上花费任何 CPU 时间

      对内存是最不友好的:如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会释放,这可以看作是一种内存泄漏

    • 定期删除

      定期删除策略是前两种策略的一种折中:

      • 定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响
      • 此外,通过定期删除过期键,可以有效减少内存浪费
    • 内存淘汰机制

  • 相关阅读:
    Flink1.15源码解析--任务提交流程----flink run
    每日一题:如何实现上拉加载,下拉刷新?
    题目0078-洞穴探险
    GLTF纹理贴图工具让模型更逼真
    纯血鸿蒙APP实战开发——Canvas实现模拟时钟案例
    【漏洞复现】WebLogic XMLDecoder反序列化(CVE-2017-10271)
    unity shaderGraph实例-物体线框显示
    二十一、Java 继承
    oracle数据库做好备份和数据的导入和导出
    React面试:谈谈虚拟DOM,Diff算法与Key机制
  • 原文地址:https://blog.csdn.net/mysnsds/article/details/126394235