我爱java系列---【使用redis时,如何解决缓存穿透问题?】

一、访问拓扑图

 二、什么是缓存穿透?

      1.用户通过浏览器访问nginx,nginx本地缓存中找不到数据,则从redis中找,redis中找不到数据,则从数据库中找。

      2.但是也没有这样的数据,所以redis中和nginx本地缓存中不会缓存;

      3.如果黑客利用这个逻辑漏洞,就专门找 你网站中不存在的数据,每秒高并发访问,直接会导致数据库服务器宕机。

      以上这种问题就叫做缓存穿透,因为透过了各种缓存,直接访问了数据库,最终导致数据库宕机。

三、解决方案

      1.缓存预热:通过数据库的变化,来更新redis中的数据,查询的时候如果redis中查询不到数据直接返回为null,不再直接查询数据库。(下图为做过项目中的一个广告缓存预热流程)

       2.布隆过滤器

       3.如果从数据库中查询,查询到的结果为null,可以直接将这个数据缓存进redsi,超时时间设定为1-3秒,如果黑客想以短时间高并发来访问,则被redis拦截住,因为redis中有这样的数据,但是值为null,如果黑客不访问这个数据了,因为数据设置了超时时间,超过这个时间会被redis自动销毁,也不会产生大量的垃圾数据。

猜你喜欢

转载自www.cnblogs.com/hujunwei/p/12927194.html
今日推荐