缓存更新策略
1.内存淘汰:
说明 :不用自己维护,利用Redis的内存淘汰机制,当内存不足时自动淘汰部分数据,下次查询时更新缓存
一致性:差
维护成本:无
2.超时剔除:
说明 :给缓存数据添加TTL时间,到期后自动删除,下次查询时更新缓存。
一致性:一般
维护成本:低
3.主动更新:
说明 :编写业务逻辑,在修改数据库的同时,更新缓存
一致性:好
维护成本:高
业务场景:
低一致性需求:使用内存淘汰机制,例如店铺类型
高一致性需求:主动更新,并以超时剔除作为兜底方案,例如店铺详情查询的缓存
读操作:
缓存命中则直接返回
缓存未命中则查询数据库,并写入缓存,设定超时时间
写操作:
先写数据库,然后在删除缓存
要确保数据库于缓存操作的原子性
缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会失效,这些请求都会打到数据库
常见的两种解决方案:
缓存空对象
优点:实现简单 维护方便
缺点:额外的内存消耗
可能造成短期的不一致
布隆过滤器
优点:内存占用少 ,没有多余的key
缺点:实现复杂,存在误判的可能性
增强id的复杂度,避免被猜测id规律
做好数据的基础格式校验
加强用户权限校验
做好热点参数的限流
缓存雪崩
缓存雪崩是指在于同一时段大量的缓存key同时失效或者redsi服务宕机,导致大量请求到达数据库,达赖巨大压力
给不同的key的TTL添加随机值
利用redis集群提高服务的可用性
给缓存业务添加降级限流策略
给业务添加多级缓存
缓存击穿
缓存击穿问题也叫热点key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了 ,无数的请i去访问会在瞬间给数据库带来巨大的冲击。
常见的解决方案:
1.互斥锁
优点:没有额外的内存消耗 保证一致性 实现简单
缺点: 线程须要等待,性能收到影响 可能有死锁风险
2.逻辑过期
优点:线程无需等待 性能好
缺点:不能保证一致性 有额外的内存消耗 实现复杂
redis锁知识
1.不可重入redis分布式锁:
原理:利用sentx的互斥性,利用ex避免死锁,释放锁时判断线程标识
缺陷:不可重入,无法重试,锁超时失效
2.可重入的redis分布式锁:
原理:利用hash结构,纪律线程标示和重入次数,利用watchDog延续时间,利用信号量控制锁重试等待
缺陷:redis宕机引起锁失效问题
3.Redisson的mulitiLock:
原理:多个独立的redis节点,必须在所有节点都获取重入锁,才算获取锁成功
缺陷:运维成本高,实现复杂