缓存系统常见问题
- 缓存穿透
问题描述:
查询一个一定不存在的数据,因为这个数据不存在,所以永远不会被缓存,所以每次请求都会去请求数据库
解决方案:
(1) 采用布隆过滤器:使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤
(2) 缓存错误值:访问key未在DB查询到值,也将空值写进缓存,但可以设置较短过期时间 - 缓存击穿
问题描述:
一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增
解决方案:
(1) 采用互斥锁:缓存未命中,需要去更新时,先让程序去获取锁,只有获取到锁的线程才有资格去更新缓存KEY。其他没有获取到锁的线程则休眠片刻之后再次去获取最新的缓存数据
(2) 用不过期:缓存系统不设置过期时间,通过定时任务去同步缓存和数据库的数据 - 缓存雪崩
问题描述:
设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到数据库,最终导致数据库瞬时压力过大而崩溃。
解决方案:
在原有失效时间的基础上增加一个随机时间,这样每个缓存过期时间的重复率就会降低,从而减少缓存雪崩的发生。
Nginx和Tomcat的区别
- 存放的文件形式
Nginx是http服务器,只能解析静态文件(html css js image)。
Tomcat是web中间件(本质上是一个servlet),能解析jsp和静态文件。 - 用途
nginx可以作为反向代理服务器,负责均衡服务器,静态资源存放服务器。
tomcat能作为jsp容器使用,静态资源存放服务器。 - 性能
nginx支持5W+并发,tomcat的并发只能在200-400之间。