# 118. 在缓存服务中开发缓存穿透的保护性机制
# 缓存穿透解决方案
我们的缓存穿透解决方案,其实非常简单:每次从源服务(商品服务)查询到的数据为空,就说明这个数据根本就不存在,需要往 redis 和 ehcache 等缓存中写入一条空数据。
另外再配合缓存变更监听推送事件,能让缓存中的空商品信息及时的被变更
# 代码中解决
GetProductInfoOfMysqlCommand
@Override
protected ProductInfo run() throws Exception {
// 假设 100 的 id 是数据库中不存在的
// 这里返回一个空的
// 这里只是模拟从 mysql 查询
if (productId == 100) {
ProductInfo productInfo = new ProductInfo();
productInfo.setId(productId);
return productInfo;
}
String productInfoJSON = "{\"id\": 1, \"name\": \"iphone7手机\", \"price\": 5599, \"pictureList\":\"a.jpg,b.jpg\", \"specification\": \"iphone7的规格\", \"service\": \"iphone7的售后服务\", \"color\": \"红色,白色,黑色\", \"size\": \"5.5\", \"shopId\": 1," +
"\"modifyTime\":\"2019-05-13 22:00:00\"}";
ProductInfo productInfo = JSONObject.parseObject(productInfoJSON, ProductInfo.class);
return productInfo;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
经过尝试,访问正常,无任何报错;在本用例中其他的地方没有依赖获取到的商品进行计算什么的,所以这种缓存穿透基本上外面雾感知,只是在页面上展示时全是 null