为什么会存在缓存三剑客的问题
我们要知道我是引路缓存的主要目的是减少大量对数据库的直接访问请求导致数据库扛不住这么多并发而宕机。如果单单只把数据放入缓存这个操作,在某些情况下还是会发生大量请求打在数据库。
缓存击穿
比如当我们一个热点key(经常被访问的数据)突然过期了,从缓存中获取不到数据就会从数据库中查,如果此时有大量的请求,这些请求都会打在数据库层面而数据库扛不住。
解决方案:
1.很容易想到的就是不给这个热key设置过期时间,让他们永不过期。
2.提前通过缓存预热的方式将他们全部写入缓存可以避免大量的请求访问
3.使用分布式锁来控制访问数据库的请求数量。
下面我用代码演示一下第3种方案
//分布式锁解决缓存击穿问题
public CoursePublish getCoursePublishCache2(Long courseId) {
//查询缓存不存在在查数据库
Object o = redisTemplate.opsForValue().get("course" + courseId);
if(o!=null){
String s = o.toString();
return JSON.parseObject(s, CoursePublish.class);
}else{
RLock lock = redissonClient.getLock("coursqueeylock" + courseId);
lock.lock();
try {
//从数据库中查
缓存三剑客问题及解决方案

最低0.47元/天 解锁文章
1171

被折叠的 条评论
为什么被折叠?



