• Redis缓存穿透,背八股文 居然没用!!!


    昨天一位新朋友找我聊缓存穿透,他也背了八股文,但是还是被卡住了。

    八股文式回答:

    面试官:说说缓存穿透和解决方案

    新朋友:缓存穿透就是请求来查询的数据不在数据库中,也不在缓存中。这样每次请求过来,都会去查数据库。如果出现大量类似的请求,可能会把我们的数据库给打垮。解决方案有:第一种是使用布隆过滤器,但是布隆过滤器存在误算率 。第二种缓存空结果,设置一个空对象,推荐使用第二种。

    她觉得自己回答得还行,面试官也点头了。

    可是,面试官又继续追问了,如果一个用户恶意请求,查询都是不存在的产品信息,这样岂不是会导致大量无用缓存吗?

    她告诉我,当前就懵逼了

    ,看过的八股文里并没有这一条!

    我们来看看缓存穿透的这个流程:

     

    这位朋友采用常规背八股文的回答面试官,但是稍微再问点延伸性的问题,就不知所措了。

    其实,我们可以对这些空对象设置一个有效期,这样也就是顶多是被恶意攻击时候,出现大量的空对象缓存。

    我们对前面的流程图进行改进,请看下图:

     

    写一个伪代码,你也可以回去找个场景练练手。

    1. //缓存空对象
    2. public static final String EMPTY_PRODUCT_CACHE = "{}";
    3. public Product getProductInfo(Long productId){
    4.     Product product;
    5.     //创建缓存key
    6.     String productCacheKey = "PRODUCT_INFO_"+productId;
    7.     //查询缓存
    8.     String productCacheStr = redis.get(productCacheKey);
    9.     //判断缓存是否存在
    10.     if(!StringUtils.isEmpty(productCacheStr)){
    11.         //判断是否为空对象
    12.         if(EMPTY_PRODUCT_CACHE.equals(productCacheStr)){
    13.             //继续续命
    14.             redis.expire(productCacheKey,空对象有限期,时间单位);
    15.             return null;
    16.         }
    17.         product = JSON.parseObject(productCacheKey, Product.class); 
    18.         //继续续命
    19.         redis.expire(productCacheKey,产品有限期,时间单位);
    20.         return product;
    21.     }
    22.     
    23.     product = productDao.getProductInfoById(productId);
    24.     
    25.     if(product != null){
    26.         //放入缓存
    27.         redis.set(productCacheKey,JSON.toJSONGString(product),产品有限期,时间单位);
    28.     }else{
    29.         //缓存空对象
    30.         redis.set(productCacheKey,EMPTY_PRODUCT_CACHE,空对象有限期,时间单位);
    31.     }
    32.     
    33.     return product;
    34. }

    以上就是这位小粉丝找我聊的问题,我也给他一些忠告,被八股文只能是一种抱佛脚的应付面试。如果想比别人有所同步,光被八股文还是不够的。就像之前,一个群友找我聊分布式锁,我给他的建议是先搞清楚为什么需要分布式锁?然后,再去搞清楚目前市面上有哪些实现方案,每一种方案实现原理是什么,还要清楚这些实现方案的优缺点。


     

    如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论

    咱们下期见!答案获取方式:已赞 已评 已关~

    学习更多JAVA知识与技巧,关注与私信博主(03)

     

  • 相关阅读:
    一文教你如何通过 Stream API 批量 Mock 数据
    C++11 - 右值引用
    【游戏客户端】制作节奏大师Like音游(下)
    调用了这么久的JS方法是长在对象、类、值本身还是原型链上?
    【毕业设计】基于ESP32的在线墨水屏桌面摆件 -物联网 单片机 嵌入式
    self-attention、transformer、bert理解
    Spring框架学习-AOP操作-JdbcTemplate(概念和准备)-9
    软件加密系统Themida应用程序保护指南(四):虚拟机的选择
    8月汽车销量出炉:问界破万,智己破千,理想腰斩!埃安近创新高
    ThreadLocal
  • 原文地址:https://blog.csdn.net/weixin_70730532/article/details/125522624