- 缓存击穿
- 解决方案:
- 数据库角度
- 缓存角度
- 分布式锁
在我们使用缓存时,会将从数据库里查询到的数据存到缓存中,并设置一个过期时间。就是当一个热点数据过期时,会有大量的访问到数据库中,给数据库造成很大压力,这就是缓存击穿。
解决方案:那么缓存击穿的解决,我们可以从 缓存 和 数据库两方面入手。
数据库角度对于数据库来说,就是短时间的大量请求无法承受,那么就让他承受的请求变成 1/100,1/1000,用 锁 可以达到这样的情况,之前 100 个,1000个请求都可以同时读,但是现在有了 锁, 一个线程获取锁去读取数据库,其他线程就等着,这样 数据库的压力就下来了。
用 锁 会降低用户体验,但是这个方式的出发点就是牺牲用户体验,保证数据库不死机。
缓存角度最简单的,就是热点数据永不过期。
将数据和它的过期时间一起存到缓存中,然后我查询缓存的时候,检查这个数据是否快要过期了,如果快要过期,那么就主动更新缓存,达到永不过期的
我们前面说到了 , 在数据库角度可以使用 锁来解决 。 如果只有一个服务器,那么我们直接在 代码中使用 JAVA 提供 的synchronized ,Lock即可。但是如果我们配置了集群呢,这一个服务有多个服务器,此时,一个服务器只能确保从它去查询数据库的请求有限制。但是多个服务器之间就没法限制了,这时就需要使用分布式锁。
假设使用Redis来做分布式锁,每一个请求都需要去Redis 设置一个值,设置成功才代表拥有了锁,此时,就可以达到多个服务器之间也可以限制对数据库的请求限制
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)