Redis3 缓存更新策略,缓存粒度控制,缓存穿透,缓存击穿,缓存雪崩

缓存更新策略

# 有LRU/LFU/FIFO三种算法
#
LRU:Least Recently Used,没有被使用时间最长的 # LRU配置 maxmemory-policy:volatile-lru (1)noeviction: 如果内存使用达到了maxmemory,client还要继续写入数据,那么就直接报错给客户端 (2)allkeys-lru: 就是我们常说的LRU算法,移除掉最近最少使用的那些keys对应的数据,ps最长用的策略 (3)volatile-lru: 也是采取LRU算法,但是仅仅针对那些设置了指定存活时间(TTL)的key才会清理掉 (4)allkeys-random: 随机选择一些key来删除掉 (5)volatile-random: 随机选择一些设置了TTL的key来删除掉 (6)volatile-ttl: 移除掉部分keys,选择那些TTL时间比较短的keys # LFU:Least Frequenty User,一定时间段内使用次数最少的 # LFU配置 Redis4.0之后为maxmemory_policy淘汰策略添加了两个LFU模式: volatile-lfu:对有过期时间的key采用LFU淘汰算法 allkeys-lfu:对全部key采用LFU淘汰算法 # 还有2个配置可以调整LFU算法: lfu-log-factor 10 lfu-decay-time 1 # lfu-log-factor可以调整计数器counter的增长速度,lfu-log-factor越大,counter增长的越慢。 # lfu-decay-time是一个以分钟为单位的数值,可以调整counter的减少速度 # FIFO:First In First Out

缓存粒度控制(了解)

 

上图中,使用Redis来做缓存,底层使用MySQL来做数据存储源,这种架构下大部分请求由Redis处理,少部分请求到达MySQL。从MySQL中获取一个用户的所有信息,然后缓存到Redis的数据结构中。

此时需要面对一个问题:缓存这个用户的所有数据信息,还是缓存用户需要的用户信息字段。

缓存粒度:
​    缓存全部属性
    缓存部分重要属性

1 通用性:全量属性更好
2 占用空间:部分属性更好
3 代码维护:表面上全量属性更好

缓存穿透,缓存击穿,缓存雪崩

# 缓存穿透:
    -缓存和数据库都没有数据,爬虫,恶意攻击
  -解决:
    -1 接口层增加校验,id小于0的直接处理掉
    -2 对应数据库中也不存在的,也在缓存中放一份,只不过value值是空
    -3 通过布隆过滤器实现,把所有用户id都放到布隆过滤器中,来了一个请求,拿着id
        去布隆过滤器看,没有表示是恶意请求,直接返回
# 缓存击穿
    -缓存没有,数据库有,缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
  -解决:
      -设置热点数据永远不过期。
# 缓存雪崩
    -缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机     
    和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
-解决方案: 1 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。 2 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。 3 设置热点数据永远不过期。
原文地址:https://www.cnblogs.com/ludingchao/p/14075231.html