redis缓存的一些思考内容
NOSQL数据库,缓存查询很快,那么有哪些问题需注意的呢?
1.缓存穿透
用户需要查询一个数据发现在缓存数据库中没有,也就是常说的没有击中缓存,于是向持久层去查询,发现持久层页没有,于是本次查询失败,当用户多起来的时候,缓存没有命中就会不断的去请求持久层的服务,这样就造成了持久层的很大的压力,这就相当于出现了缓存的穿透。
解决的方案:
布隆过滤器:通过这是一些常用的值的集合,不在集合中的就直接丢弃,不在对持久层进行访问和处理。
缓存空对象方案:
当缓存不命中的时候返回一个空对象,在对空对象进行一个时效性的操作。这样能在时效性范围内保护后端持久层不暴露出来,有效的保护了持久层。
2缓存击穿
缓存击穿 意思是指一个key非常热点,在不停的扛着大并发击中的进行访问,当找个key在时效的瞬间,持续的大并发访问就穿透了缓存直接发给请求持久层。造成DB的压力。就相当于在外围的防御突然出现了一个洞,洞口涌现了大量的攻击点。
3.缓存雪崩
缓存的雪崩 意思是在缓存出现问题,造成缓存不能正常的工作,所有的请求原来是在缓存挡着,现在直接调用持久层,造成持久层的访问来量暴增,突然的增加流量导致持久层的宕机。
解决方案:
1.redis的高可用
一台机器容易挂掉,宕机,多台机器组成集群不容易了。
2.限流降级
当缓存时效的时候通过枷锁,队列等方法控制读数据库写缓存的线程的数量。
3.数据预热
就是相当于在正式部署前,先将数据访问一遍,将需要大量访问的数据加载在缓存中,跟在大并发前手动将数据加载到缓存中操作。让缓存失效的时间均匀点,避免在同一个时间点缓存都时效。
如还有其他的方案和场景欢迎留言讨论研究