# 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

经过尝试,访问正常,无任何报错;在本用例中其他的地方没有依赖获取到的商品进行计算什么的,所以这种缓存穿透基本上外面雾感知,只是在页面上展示时全是 null