Redis缓存设计与性能优化最佳实战

149 阅读2分钟

Redis缓存设计与性能优化最佳实战

  • Redis对于过期key有三种清除策略

    • 被动删除: 当读/写一个已经过期的key时,会触发惰性删除策略,直接删除这个过期key

      • 例子

        • key的过期时间到了就被删除了
    • 主动删除: 由于惰性删除策略无法保证冷数据被及时删除,所以Redis会定期主动淘汰一批已过期的key

      • 例子

        • 比如制定了删除策略,将top10后面的key进行删除
    • 强制删除: 当前已用内存超过maxmemory限制时,触发主动清理策略

  • 缓存过期算法

    • LRU算法

      • (Least Recently Used)最近最少使用
      • 淘汰很久没被访问过的数据,以最近一次访问时间作为参考
    • LFU算法

      • (Least Frequently Used)最近不经常使用
      • 淘汰最近一段时间被访问次数最少的数据,以次数作为参考
  • 主动清除策略

    • 针对设置了过期时间的key做处理

      • volatile-ttl: 在筛选时,会针对设置了过期的键值对,根据过期时间的先后进行删除,越早过期的越先被删除
      • volatile-random: 在设置了过期的键值对中,进行随机删除
      • volatile-lru: 会使用LRU算法筛选设置了过期时间的键值对删除
      • volatile-lfu: 会使用LFU算法筛选设置了过期时间的键值对删除
    • 针对所有的key做处理

      • allkeys-random: 从所有键值对中随机选择并删除数据
      • allkeys-lru: 使用LRU算法在所有数据中进行筛选删除
      • allkeys-lfu: 使用LFU算法在所有数据中进行筛选删除
    • 不处理

      • noevication: 不会删除任何数据,拒绝所有写入操作并返回客户端错误信息. OOM command not allowed...
      • used memory: 此时Redis只响应读操作
  • 问题: 如何选择缓存过期算法

    • 当存在热点数据时,LRU的效率很好
    • 偶发性的、周期性的批量操作会导致LRU命中率急剧下降,缓存污染情况比较严重,这时使用LFU可能更好点
    • 根据自身业务类型,配置好maxmemory-policy默认是noevication,推荐使用volatile-lru。如果不设置最大内存,当Redis内存超出内存限制时,内存的数据会开始和磁盘产生频繁的交换,会让Redis的性能急剧下降
    • 当Redis运行在主从模式时,只有主节点才会执行过期删除策略,然后把删除操作同步到从节点删除数据
  • 连接池参数

    • image.png