• Redis03-过期策略和淘汰策略


    目录

    Redis数据过期策略

    Redis数据淘汰策略


    Redis数据过期策略

    Redis使用一种基于过期策略来处理键的过期和自动失效。这种策略可以确保不再需要的数据被自动删除,以释放内存并避免数据过期后仍然在缓存中存留。

    Redis的过期删除策略主要有两种:

    1. 惰性删除(Lazy Expiration):只在访问key的时候判断是否过期,如果过期就删除,不会主动检查。

      • 优点:对CPU友好,只在使用的时候检查是否过期。

      • 缺点:对内存不友好,即使过期了的Key也不会被删除,会浪费内存。

    2. 定期删除(TTL-Based Expiration):一段时间对数据库中的一些key进行检查,删除其中过期的key。

      定期删除有两种模式:

      SLOW模式是定时任务,执行频率是10hz(1秒10次),每次不超过25ms,可以通过redis.conf设置hz配置。

      FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms。

      • 优点:可以通过限制频率和时长减少删除操作对CPU的影响,定期删除也可以减少内存的占用。

      • 缺点:删除操作的频率和时长难以确定,短了消耗CPU,长了和惰性删除差不多,浪费内存。

    Redis数据淘汰策略

    Redis支持多种数据淘汰策略,用于管理内存中的数据,以便在内存不足时删除部分数据。

    LRU(Least Recently Used,最近最少使用):当内存不足时,Redis会优先删除最久未被访问的键。

    LFU(Least Frequently Used,最不经常使用):Redis会在内存不足时删除访问频率最低的键。

    TTL(Time To Live,生存时间):当键的生存时间过期时,Redis会自动删除该键。

    以下是Redis中常见的8种数据淘汰策略:

    # MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
    # is reached. You can select one from the following behaviors:
    #
    # volatile-lru -> Evict using approximated LRU, only keys with an expire set.
    # allkeys-lru -> Evict any key using approximated LRU.
    # volatile-lfu -> Evict using approximated LFU, only keys with an expire set.
    # allkeys-lfu -> Evict any key using approximated LFU.
    # volatile-random -> Remove a random key having an expire set.
    # allkeys-random -> Remove a random key, any key.
    # volatile-ttl -> Remove the key with the nearest expire time (minor TTL)
    # noeviction -> Don't evict anything, just return an error on write operations.
    1. noeviction:不淘汰任何key,当内存满时不允许写入新数据。这是默认策略。(内存不足会报错的)

    2. volatile-ttl:对设置了TTL的key,计算剩余TTL值,越小的先被淘汰。

    3. volatile-lru:对设置了TTL的key,基于LRU算法进行淘汰。

    4. allkeys-lru:对所有的key,基于LRU算法进行淘汰。

    5. volatile-lfu:对设置了TTL的key,基于LFU算法进行淘汰。

    6. allkeys-lfu:对所有的key,基于LFU算法进行淘汰。

    7. volatile-random:对设置了TTL的key,随机淘汰。

    8. allkeys-random:对所有的key,随机淘汰。

    使用建议:

    • 业务对缓存的数据有冷热数据区分的时候,建议使用allkeys-lru删除最久未被访问的key的策略。

    • 业务没有冷热数据区分,使用allkeys-random就行。

    • 业务中有置顶要求,可以设置volatile-lru,对置顶数据不设过期时间,这些数据就会一直保留。

    • 业务中有频率要求,可以使用volatile-lfu或者allkeys-lfu策略。

  • 相关阅读:
    数据结构系列学习(三) - 单链表详解(Linked_List)
    ABB变频器使用PROFINET IO通信协议时的输入和输出介绍
    11.一键分析你的上网行为(web页面可视化)
    java和大数据开发该选择哪个好就业?
    [python 刷题] 138 Copy List with Random Pointer
    mybatis字段映射的容错性
    Maven官网下载安装详细教程
    【C++面向对象侯捷下】2.转换函数 | 3.non-explicit-one-argument ctor
    C++ 创建文件并写入内容
    Android 与 Linux内核(学习ing)
  • 原文地址:https://blog.csdn.net/Elaine2391/article/details/134235942