1、缓存
设计思路:
1.什么数据应该缓存
2.什么时机触发缓存和以及触发方式是什么
3.缓存的层次和粒度( 网关缓存如 nginx,本地缓存如单机文件,分布式缓存如redis cluster,进程内缓存如全局变量)
1)缓存穿透
查询一个不存在的数据,此时会跳过缓存,直接查询数据库
解决:
采用布隆过滤器、设置缓存默认值
缓存与业务功能解耦,缓存查询不到直接返回。由应用程序触发缓存的新增、修改等
2)缓存雪崩
1、短时间内大量缓存失效:由于程序启动后,预加载大量缓存,并且设置相同时间。
2、缓存失效后,业务系统需要重新生成缓存。如果短时间内有大量请求查询该缓存,导致同时查询数据库,更新缓存。
解决:
1、不设置过期时间,由应用程序执行定时任务,手动删除
2、利用redis缓存过期,通知订阅事件
3、设置更新锁,只允许一个线程去更新失效缓存
3)热点缓存
在集群架构中,如果存在某一个热点key,导致大量请求向同一台服务器上,导致服务器压力过大
针对热点key,采用复制副本方式,将key 复制到其他集群节点中。且对每个节点不需要设置相同的过期时间