对缓存击穿的一点思考前言什么是缓存击穿?避免缓存击穿的思路分析代码抽象

前言

缓存(内存 or Memcached or Redis.....)在互联网项目中广泛应用,本篇博客将讨论下缓存击穿这一个话题,涵盖缓存击穿的现象、解决的思路、以及通过代码抽象方式来处理缓存击穿。

什么是缓存击穿?

缓存击穿

上面的代码,是一个典型的写法:当查询的时候,先从Redis集群中取,如果没有,那么再从DB中查询并设置到Redis集群中。 注意,在实际开发中,我们一般在缓存中,存储的数据结构是JSON。(JDK提供的序列化方式效率稍微比JSON序列化低一些;而且JDK序列化非常严格,字段的增减,就很可能导致反序列失败,而JSON这方面兼容性较好) 假设从DB中查询需要2S,那么显然这段时间内过来的请求,在上述的代码下,会全部走DB查询,相当于缓存被直接穿透,这样的现象就称之为“缓存击穿”!

避免缓存击穿的思路分析

加synchronized?

同步方式

如果synchronized加在方法上,使得查询请求都得排队,本来我们的本意是让并发查询走缓存。也就是现在synchronized的粒度太大了。

缩小synchronized的粒度?

缩小粒度

上面代码,在缓存有数据时,让查询缓存的请求不必排队,减小了同步的粒度。但是,仍然没有解决缓存击穿的问题。 虽然,多个查询DB的请求进行排队,但是即便一个DB查询请求完成并设置到缓存中,其他查询DB的请求依然会继续查询DB!

synchronized+双重检查机制

双重检查

通过synchronized+双重检查机制: 在同步块中,继续判断检查,保证不存在,才去查DB。

代码抽象

发现没有,其实我们处理缓存的代码,除了具体的查询DB逻辑外,其他都是模板化的。下面我们就来抽象下!

一个查询DB的接口:

CacheLoader

既然查询具体的DB是由业务来决定的,那么暴露这个接口让业务去实现它。

一个模板:

Template

Spring不是有很多Template类么?我们也可以通过这种思想对代码进行一个抽象,让外界来决定具体的业务实现,而把模板步骤写好。(有点类似AOP的概念)

改进后的代码:

改进后的调用代码

从这里可以看出,我们并不关心缓存的数据从哪里加载,而是交给具体的使用方,而且使用方在使用时再也不必关注缓存击穿的问题,因为我们都给抽象了。

好了,到这里,关于缓存击穿就讨论到这里。

2017.10.28 zhangfengzhe

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏电光石火

Nexus3.x安装及配置

2K60
来自专栏微信公众号:Java团长

计算机网络基础:这是一份详细HTTP学习指南

16040
来自专栏酷玩时刻

Android依赖管理与私服搭建

*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 *本篇文章视频 慕课网之Android依赖管理与私服搭建

18750
来自专栏Java帮帮-微信公众号-技术文章全总结

单点登录原理及CAS实现【面试+工作】

单点登录原理及实现sso【面试+工作】 WEB的登录那些事 说道账户登录和注册,其实我们每天都在亲身感受着,像微博、知乎还有简书等等。我们总是需要定期的去重新登...

57890
来自专栏IT笔记

linux下 Error running javac compiler

由于Linux版本更新,虽然软件都拷贝过来了,但是系统环境重新配置。 旧系统配置了ANT一键部署功能的脚本,由于部署需要,所以这里又重新配置了下环境。 1、A...

42350
来自专栏安富莱嵌入式技术分享

【RL-TCPnet网络教程】第27章 DNS域名系统基础知识

本章节为大家讲解DNS(Domain Name System,域名系统),通过前面章节对TCP和UDP的学习,需要大家对DNS也有个基础的认识。

21930
来自专栏流柯技术学院

CAS客户端服务器端配置步骤

CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一...

74920
来自专栏运维前线

Linux中设置'sudo'的10个小技巧

在Linux和其他类Unix操作系统中,只有root用户可以运行所有命令并在系统上执行某些关键操作,如安装和更新,删除包,创建用户和组,修改重要的系统配置文件...

24260
来自专栏java一日一条

HTTP协议之HTTP的结构

会使用电脑的人基本上都会使用IE/Firefox/Chrome等网页浏览器的地址栏输入url地址来访问一个网站,那么网站页面是怎么展现到用户面前的呢?当然web...

13520
来自专栏向前进

vue-cli脚手架npm相关文件解读(1)webpack.base.conf.js

系列文章传送门: 1、build/webpack.base.conf.js 2、build/webpack.prod.conf.js 3、build/webp...

45140

扫码关注云+社区

领取腾讯云代金券