Marvel-Site Marvel-Site
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)

Marvel

吾必当乘此羽葆盖车
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)
  • Java

  • 计算机基础

  • 框架|中间件

    • Spring

    • MyBatis

    • MySQL

    • Redis

      • Redis简介
      • Redis常用命令
      • Redis底层数据结构
      • Redis数据结构
      • Redis多线程单线程问题
      • Redis过期删除策略和缓存淘汰机制
        • Redis持久化
        • Redis分布式锁
        • Redis事务
        • Redis缓存穿透、缓存击穿、缓存雪崩
        • Redis集群 - 哨兵模式
        • Redis集群 - Redis集群
      • 消息队列

      • Zookeeper

      • Git

      • Maven

      • Gradle

    • 架构

    • 后端
    • 框架|中间件
    • Redis
    Marvel
    2022-07-16
    目录

    Redis过期删除策略和缓存淘汰机制

    # 过期删除策略和缓存淘汰机制

    如果不设置redis内存大小后设置最大内存为0,在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存。

    一般推荐设置内存为最大物理内存的四分之三

    # 1 内存满了会怎么样?

    设置maxmemory为1,然后set一个字符串,之后会报OOM的错误。

    image-20220706205435284

    # 2 Redis给缓存数据设置过期时间有啥用?

    1. 因为内存是有限的,如果缓存中的所有数据都一直保存的话,很容易造成内存溢出的问题。

    2. 业务场景需要某个数据只在某一时间段内存在,比如短信验证码只能在1分钟内有效,用户登录的token只在1天内有效。

    # 3 Redis是如何判断数据是否过期的呢?

    Redis通过一个叫过期字典(可以看作是hash表)来保存数据过期的时间。过期字典的键指向Redis数据库中的某个键,过期字典的值是一个long long类型的整数,保存了key所指向的数据库的过期时间(时间戳)。

    redis过期字典

    # 4 过期数据的删除策略?

    策略:定期删除 + 惰性删除

    • 定期删除:每隔一段时间,随机检查一部分已经过期的key,并将其删除。这个时间间隔由配置文件中的参数hz决定,默认为10秒。Redis底层会通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响。

    • 惰性删除:当客户端尝试访问一个已经过期的 key 时会立即将其删除。对CPU最友好,但是可能回造成太多过期 key 没有被删除,对内存不友好。(空间换时间)

    这两种策略相结合,可以保证Redis能够高效地清理过期的key,同时又不会对性能造成太大的影响

    但是,仅通过给 key 设置过期时间还是有问题的,因为还是可能存在定期删除和惰性删除漏掉了很多过期 key 的情况,这样就导致大量过期 key 堆积在内存中,然后就 OOM 了。使用 Redis 内存淘汰机制解决。

    # 5 Redis内存淘汰机制?

    MySQL里有2000w数据,Redis中只有20w数据,如何保证Redis中的数据都是热点数据?

    Redis提供8种淘汰策略:

    • volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。
    • volatile-lfu:从已设置过期时间的数据集中挑选最不经常使用的数据淘汰。
    • volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。
    • volatile-random:从已设置过去时间的数据集中任意选择数据淘汰。
    • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最少使用的key。(常用)
    • allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的key。
    • allkeys-random:当内存不足以容纳新写入数据时,从数据集中任意选择数据淘汰。
    • no-eviction:禁止驱逐数据,当内存不足以容纳新写入数据时,新写入操作会报错。(默认)

    lru: least recently used,最近最少使用,这种策略假设最近被访问的键值对在未来也可能被访问, 因此将最近最少被访问的键值对淘汰,可以更好地保留常用的数据。

    lfu: least frequently used,最近不经常使用,这种策略假设使用频率低的键值对在未来也可能很少被访问, 因此将使用频率较低的键值对淘汰,可以更好地保留经常被访问的数据。

    总结:

    • 2个维度:过期键中筛选(volatile)、所有键中筛选(allkey)
    • 4个方面:LRU、LFU、random、ttl

    # 6 删除策略与淘汰机制的区别

    淘汰策略(Eviction Policy)是指在内存使用达到上限时,根据一定的规则选择哪些key需要被淘汰(即删除)以释放内存空间。目的是为了保证Redis在内存不足时能够优先保留重要的数据,同时尽量减少对业务的影响。

    删除策略(Deletion Policy)是指在删除 key 时采用的具体策略。删除策略的目的是为了及时清理过期的 key,以避免占用过多的内存空间。

    总结来说,淘汰策略是在内存不足时选择哪些 key 需要被淘汰,而删除策略是在 key 过期时如何进行删除操作。淘汰策略是为了管理内存使用,而删除策略是为了清理过期的 key。

    编辑 (opens new window)
    #Redis
    上次更新: 2024/04/29, 10:25:44
    Redis多线程单线程问题
    Redis持久化

    ← Redis多线程单线程问题 Redis持久化→

    最近更新
    01
    位运算
    05-21
    02
    二叉树
    05-12
    03
    Spring三级缓存解决循环依赖
    03-25
    更多文章>
    Theme by Vdoing | Copyright © 2022-2024 Marvel
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式