面试官问我:什么是讲透缓存击穿,该怎么解决?
这个问题来自于粉丝面试的时候遇到的,下面我来讲解一下。
什么是缓存击穿
对于这个问题,简单的说就是把缓存透了但数据库没透。还不明白?那么这一小节我来带大家通过一个形象的例子来讲解一下。
我们知道缓存层都会设置数据过期时间,如果不设置过期时间的话,随着查询的越来越多缓存就会越来越大,内存撑不住了服务器就炸了。但是我们设置了过期时间真的就万无一失了吗?假设数据已经到期了,那么缓存就查不到了,这时只能去数据库查。如果同一时间巨多的人发送的查询请求都是要求查这个数据。因为缓存过期了,所以这个巨多的查询都直接转向数据库去查询了,呵呵🙂,我们的数据库大哥已经大半个身子埋土里了,这种情况叫缓存击穿。如果要查询的数据要跨表查询甚至跨库查询的话,面对这么大的查询请求,数据库大哥就直接见阎罗王了,这种情况叫数据缓存穿透。
如何解决
这很好办,我们可以从两个方向思考。目前我们可以使用的工具是数据库和缓存。
从数据库角度思考
我们可以直接把流量变成原来的一百分之一甚至是十分之一,这样数据库就能轻松可以处理查询请求了。
我们需要加锁,之前不管多少数据都可以同时读,但是现在来个锁,线程要读取数据时先查询数据有没有上锁,如果上锁了那就等着,如果没上锁那就获取锁后再请求数据库。这样数据库压力瞬间就降低了。但是这样做用户体验会很差,因为数据加锁了后面的请求都要等待,如果查询很慢的话用户可以明显感受到卡顿。但是没办法,因为这个方法的出发点就是牺牲用户体验,保证数据库不挂掉。
从缓存角度思考
我们来想想为啥什么出现缓存击穿的问题,是因为缓存数据过期了,没了。那么我们可以对缓存动刀解决这个问题。
修改缓存数据的过期策略,最常见的是设置热点数据永不过期。但是这个方法在很多情况下,我们无法预知哪些时热点数据。例如某明星官宣配偶前,微博的程序员们在初始化缓存的时候不可能直接把它归为热点数据。那该怎么办呢?当然还得从数据过期策略层面出发,我们可以做这样的逻辑:如果发现这个数据快过期了,并且最近这个数据访问特别多,那么后台就可以启动一个异步线程,重新在缓存层中添加这个数据的缓存,给这个数据续续命。
评论