刚入门redis,学到缓存击穿的解决方法是加锁
重建缓存的前提是缓存失效,并且为了防止缓存击穿,重建缓存利用加锁实现,所以能够重建缓存的线程只有一个(最先拿到锁的那一个线程),那么这个线程最先拿到锁,其他线程都没锁不可能有权力重建缓存,那么为什么拿锁之后还要检测缓存是否存在,如果存在则读取,怎么可能存在呢?
缓存击穿不是只有加锁一个方案。而加锁的目的也是不是为了重建缓存,是为了避免多线程同一时间同时访问无缓存的数据
而缓存击穿解决方案还可以有缓存预热和使用布隆过滤器等
当我们查询一个数据的时候,我们会首先查询Redis数据库中是否有该数据,如果没有的话才会向持久化数据库
中进行查找(一般是MySQL数据库),如果我们的同时访问该数据的用户数量过多(如双十一秒杀活动
,千万条请求会涌向同一个数据),且在某个时间段内突然都向我们的应用服务器发送请求,此时我们的应用服务器压力就会变大,然后他会不停地去查Redis的缓存数据,然后发现没有这条数据,于是向MySQL数据库发起请求,过大的访问请求就会导致数据库崩溃,这个过程我们就把他叫做缓存穿透
。
缓存穿透
是存在于Redis数据库中没有这条数据
,而又同时过大的访问请求访问这条数据
导致的!