缓存技术
1. 缓存血崩
出现的时机,当一批量的缓存key值同时失效,导致同时查询数据库,造成数据库宕机,从而影响系统。
处理方式:
- 并发量不是很多的情况下,可以使用加锁排队的方式
- 每个缓存都有缓存标记,记录缓存是否失效,如果失效的话就去更新缓存
- 为每个key设置不同的过期时间,防止同时失效
当数据库里面查询出来没有任何数据的时候,缓存里面也不会存在任何数据。导致用户去查询的时候一直需要查询缓存和数据库。
解决办法:
- 布隆过滤器,把明确不存在的通过bitmap过滤掉(这个需要一个缓存所有的bitmap,会比较吃内存)
- 查询失效的数据也进行缓存,无论是系统错误还是数据不存在。但是注意过期时间需要设置的短一些,比如30S或者是1分钟。
3. 缓存预热
系统在上线之初,没有任何数据就需要缓存所有的数据。
场景:
秒杀场景,把固定的商品信息缓存到redis里面,防止过多查询数据库
4. 缓存更新
缓存更新除开redis的自带缓存失效策略(详见redis缓存失效策略)还能设置一些自己的的缓存策略,常见的策略有:
- 定期清理过期的缓存
- 用户请求过来判断缓存过期与否,过期去获取新的数据
5. 缓存降级
当访问量剧增的时候,服务出现了问题。可以配置人工的降级开关来保证核心业务。
降级的最终目的是保证核心业务可用。
redis缓存失效策略
常用的淘汰算法
- FIFO:First In First Out,先进先出。判断被存储的时间,离目前最远的数据优先被淘汰。
- LRU:Least Recently Used,最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。
- LFU:Least Frequently Used,最不经常使用。在一段时间内,数据被使用次数最少的,优先被淘汰。
redis的内存淘汰机制:
设置方式config set maxmemory-policy volatile-lru
maxmemory-policy 六种方式
volatile-lru:只对设置了过期时间的key进行LRU(默认值)
allkeys-lru : 删除lru算法的key
volatile-random:随机删除即将过期key
allkeys-random:随机删除
volatile-ttl : 删除即将过期的
noeviction : 永不过期,返回错误