24 | 替换策略:缓存满了怎么办?

184 阅读2分钟

基本概念

  • 将所有数据都缓存在redis?

    • 内存资源有限
    • 数据访问局部性,82原理\
  • 因为内容资源有限,当不够用就需要按既定策略进行淘汰

    • 指定淘汰策略,筛选出不重要数据
    • 删除这些缓存

设置多大的缓存容量合适

  • 基本概念

    • 长尾效应:82原理基本概念,20%的数据提供了80%的访问
    • 重尾效应:因为个性化的定制,20%的缓存满足不了请求\
  • 因此缓存大小需要数据实际访问特征和成本开销综合考虑

  • 经验:设置为总数据量的15%至30%

  • 设置redis容量大小指令:CONFIG SET maxmemory 4gb\

\

redis缓存淘汰策略

  • 基本概念:redis4.0前有6种内存淘汰策略,4.0后增加了两种策略

    • noeviction不进行数据淘汰,直接返回错误   默认策略\

    • 其余七种淘汰策略

      • 在设置过期时间数据进行淘汰  缓存没写满,但是数据过期,也会被删除

        • volatile-random  随机删除\

        • volatile-ttl  删除最早的数据\

        • volatile-lru  采用lru算法\

        • volatile-lfu  采用lfu算法  是对lru的优化\

      • 在所有数据范围内进行淘汰

        • allkeys-lru 使用lru淘汰\

        • allkeys-random 所有数据随机删除\

        • allkeys-lfu 使用lfu淘汰\

  • LRU 最近最少使用

    • 原理

      • 把所有数据组织成链表,链表头MRU 链表尾LRU
      • 每次更新数据放入MRU
      • 淘汰数据从LRU开始
    • 缺点

      • 链表占据空间
      • 大量的链表移动操作
  • redis的LRU

    • 原理

      • 默认记录每个数据最近一次访问的时间戳
      • 淘汰数据时随机选择n个数据,将lru最小值数据淘汰
      • 再次淘汰时会选择lru 字段值必须小于候选集合中最小的 lru 值
      • 每次都淘汰lru最小的值
    • maxmemory-samples 设置选择的100个数据  CONFIG SET maxmemory-samples 100

  • 经验

    • 优先使用 allkeys-lru 策略 充分利用lru算法 有冷热数据的情况\

    • allkeys-random 策略 无冷热数据的情况\

    • volatile-lru 策略,同时不给这些置顶数据设置过期时间  不能有删除的数据时\

\

如何处理淘汰数据

  • 是干净数据即直接删除,脏数据需要写会数据库

    • 脏数据:与数据库中数据不相同,需要更新回数据库
  • 解决办法,修改redis数据后将其写会数据库,否则淘汰时没有策略保证数据不丢失

\

小结

  • redis总共有8种淘汰策略

    • 删除候选范围

      • 设置了过期时间的候选集
      • 没有设置过期时间的候选集
  • 脏数据需要写会数据库,需要在修改时写回

\