Redis的缓存击穿:
热点的key,在不停的扛着大并发,当这个key失效时,一瞬间大量的请求冲到持久层的数据库中,就像在一堵墙上某个点凿开了一个洞!
解决方法:
1.热点key永不过期:
统计访问量,当访问的数据成为热点,设置不过期
从缓存层面来看,没有设置过期时间,所以不会出现热点 key 过期后产生的问题。
2.加锁排队
JVM锁或者分布式锁
当在redis查询到的数据为空,则线程访问数据库前加锁,只有一个线程可以访问数据库,获取到数据在再更新缓存。
Redis的缓存雪崩:
缓存的key大量集中同时过期了或者缓存服务器挂掉,所有的请求全部冲到持久层数据库上,导致持久层数据库挂掉,导致整个应用都不可用。
解决方法:
1.数据预热:数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。
2.加锁排队
3.设置随机的失效时间
4.redis高可用
Redis的缓存击穿:
需要查询一个数据,但是redis中没有(比如说mysql中id=-1的数),直接去请求MySQL,当很多用户同时请求并且都么有命中!于是都去请求了持久层的数据库,那么这样会给持久层数据库带来非常大的压力。一般出现这样的情况都不是正常用户,基本上都是恶意用户!
解决方法:
1.参数校验:对于不存在的值过滤掉请求
2.缓存空值并设置过期时间
3.布隆过滤器:实现黑名单或者白名单,黑名单:数据库不存在的数据放到过滤器,白名单:数据库存在的数据放到过滤器。
redis查询商品信息的伪代码: