文章目录

  • 1,缓存有效期和淘汰策略
  • 1,有效期TTL
  • 1.1设置有效期作用
  • 1.2redis过期策略
  • 1.2.1 定时过期
  • 1.2.2 惰性过期
  • 1.2.3定期过期
  • 1.3 redis过期策略相关问题
  • 2,缓存淘汰策略
  • 2.1 内存淘汰策略
  • 2.2缓存淘汰策略配置
  • 3,缓存淘汰方案


1,缓存有效期和淘汰策略

随着缓存数据的增多,最终缓存的数据量会趋于接近数据库的数据量;这个时候缓存就变成另外一个数据库了,日积月累,性能会越来越低,在设计缓存时一定要考虑使用设置缓存有效期缓存淘汰策略避免这种情况的发生

1,有效期TTL

  • 对于缓存数据,一定要设置有效期
1.1设置有效期作用
  • 节省空间
  • 做到数据弱一致性(定期更新数据)
1.2redis过期策略
  • 定时过期(手动设置)
  • 惰性过期(自动)
  • 定期过期(自动)
1.2.1 定时过期
  • 每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。
  • 可以立即清除过期的数据,对内存很友好
  • 但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量
  • 设置方法
    setex("a", 300, "value1")
1.2.2 惰性过期
  • 被动维护:只有当访问一个key时,才会判断该key是否已过期,过期则清除。
  • 该策略可以最大化地节省CPU资源,却对内存非常不友好。
  • 极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存
1.2.3定期过期
  • 每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。
  • 该策略是前两者的一个折中方案:通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
  • expires字典会保存所有设置了过期时间的key的过期时间数据,其中:
  • key是指向
键空间

中的某个键的指针

  • 键空间是指该Redis集群中保存的所有键。
  • value是该键的毫秒精度的UNIX时间戳表示的过期时间
1.3 redis过期策略相关问题
  • Redis服务自动同时使用了惰性过期和定期删除两种过期策略。
  • Redis过期删除采用的是定期删除,默认是每100ms检测一次,遇到过期的key则进行删除,这里的检测并不是顺序检测,而是随机检测。
  • 当我们去读/写一个已经过期的key时,会触发Redis的惰性删除策略,直接会干掉过期的key
  • 为啥不用定时过期?定时删除是针对某个key采取的手动措施
  • 定期删除+惰性删除是如何工作的?
  • 采用定期删除+惰性删除就没其他问题了么?

2,缓存淘汰策略

  • Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。
2.1 内存淘汰策略
  • noeviction
  • LRU 很长时间没有使用的
  • LFU 使用频率最低的
2.2缓存淘汰策略配置
# redis最大使用内存数量,如果没设置,将逐步占用全部内容
maxmemory  

# redis淘汰策略,内存达到上限将触发策略
maxmemory-policy noeviction  
    # 默认 noeviction 不采取任何策略,内存上限写入数据将直接报错
    # 可选择上述8种其中一种

3,缓存淘汰方案

  • 如何保证redis中的数据都是高频热点数据?
  • 对缓存key都设置符合业务的合理过期时间
  • 通过maxmemory-policyreids配置项选择合适的淘汰策略,比如使用volatile-lru策略
  • 在实践中可用redis-cluster进行数据的缓存,哨兵监控的主从redis可用于持久化存储当数据库来使用