Niginx反向代理的作用
保护服务器:它充当客户端和后端服务器之间的屏障,增强了服务器的安全性。
负载均衡:它将来自客户端的请求分发到多个服务器,以确保资源的最佳利用率,并防止任何单个服务器过载。
缓存静态内容:它可以缓存静态资源,如图像或CSS文件,减轻后端服务器的负载并提高性能。
加密和解密SSL通信:它可以处理SSL/TLS加密和解密,将这项任务从后端服务器卸载。
缓存穿透
指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。
发生原因
业务不合理的设计,
业务、运维、开发事务操作,将缓存和数据库的数据都被误删了
黑客非法请求攻击
解决办法
如果是非法请求,我们在API入口,对参数进行校验,过滤非法值。
如果查询数据库为空,我们可以给缓存设置个空值,或者默认值。但是如有有写请求进来的话,需要更新缓存哈,以保证缓存一致性,同时,最后给缓存设置适当的过期时间。(业务上比较常用,简单有效)
使用布隆过滤器快速判断数据是否存在。即一个查询请求过来时,先通过布隆过滤器判断值是否存在,存在才继续往下查。
缓存雪崩
指缓存中数据大批量到过期时间,而查询数据量巨大,请求都直接访问数据库,引起数据库压力过大甚至down机。
解决方法
可通过均匀设置过期时间解决,即让过期时间相对离散一点。
Redis 故障宕机也可能引起缓存雪奔。这就需要构造Redis高可用集群啦。
缓存击穿
指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到db。(区别在于击穿针对某一热点key缓存,雪奔则是很多key。)
解决方案
使用互斥锁方案。缓存失效时,不是立即去加载db数据,而是先使用某些带成功返回的原子操作命令,如(Redis的setnx)去操作,成功的时候,再去加载db数据库数据和设置缓存。否则就去重试获取缓存。
“永不过期”,是指没有设置过期时间,但是热点数据快要过期时,异步线程去更新和设置过期时间。