二月份参加了蚂蚁金服商家技术部(杭州)的Java服务端后台开发面试,结果挂在了交叉面。之后仔细反思了一下,应该是缓存穿透这个问题导致的吧,当时太紧张回答成了工作中怎么使用一致性哈希+Redis解决远程分布式缓存负载均衡的,汗(⊙﹏⊙)b。

事后想找面试官再争取一下,无奈座机打不通,找客服说面试流程已经关闭了,只好暂时作罢。。 但是整个面试下来,收获很大,意识到了自己的一些不足,最遗憾的是没有和印象极其好极其好的一面和二面面试官一起工作的机会了,第一次面没有经验,花名都忘了问

了。。想想34岁还远着哪(呵呵),写代码的生涯还长,一次失败不算什么,楼主一定会回来的。

下面主要是写一下我实际工作中,解决的一个缓存数据量最大的场景的实现方案,以及怎么处理缓存穿透的。场景简单描述: 数据源是一张亿万条数据的DB Table,我要使用它在我们查询航班的API里匹配替换航班信息。实时读DB做增量Cache是肯定不行的,用这

张DB的人很多,DBA肯定会找上门的,另外会加大我们查询API的RT,最坏情况假如一个航班读一次DB做匹配替换,一个热门航线出现2000多个航段是家常便饭,再加上我们API的日均请求量已过半亿,所以我也不干。。于是综合讨论了之后,使用了如下的技术方案:

1. 数据源的存储  写一个定时任务,将DB的数据全量dump到Redis做分布式缓存

2. 数据源的获取  我们查询航班的API采用LRU+实时读取Redis补偿缓存

简单架构图如下:

下面就到缓存穿透了,对我的这个场景来说就是指,LRU缓存未命中,导致大量的请求达到了Redis上。

目前我使用的最简单的方式就是,对不存在的Key,把Value置为null放到LRU中,来保护Redis。补充一句,如果采用的map结构不支持Value为null哪?(我个人是参考的Spring注册单例Bean的方式,生成一个叫nullObject的Object来标记null对象)

如果数据量再大或QPS更大,参考业界和查资料,有总结发现两个更好的方案来解决:

1.在LRU之前加一个布隆过滤器

2.倒排索引,将冷门数据dump到本地文件中

时间不早要下班撤了,就写这么多,有时间再总结分享下我采用的LRU的实现方式、一致性哈希和布隆过滤器等等,最主要的是代码,希望有大牛指点一下不足和更好的思路。

转载于:https://www.cnblogs.com/qust/p/6642186.html

从面试蚂蚁失败反思-缓存穿透技术相关推荐

  1. 架构面试精讲第三节 分布式技术RPC、MQ、Redis、Mysql、restful详解

    07 RPC:如何在面试中展现出"造轮子"的能力? 我们知道,很多应用系统发展到一定规模之后,都会向着服务化方向演进,演进后的单体系统就变成了由一个个微服务组成的服务化系统,各个微 ...

  2. 解决Redis缓存穿透之布隆过滤器详解

    文章目录 1. 什么是Bloom Filter(布隆过滤器) 1.1 布隆过滤器优点 1.2 布隆过滤器缺点 1.3 布隆过滤器使用场景 1.4 布隆过滤器检索过程 1.5 布隆过滤器的算法描述 2. ...

  3. 【玩转Redis面试第4讲】Redis缓存雪崩、缓存穿透、缓存击穿对比看这一篇就够了

    本文 Github/javamap 已收录,有Java程序员进阶技术知识地图以及我的系列文章,欢迎大家Star. 在实际生产环境中有时会遇到缓存穿透.缓存击穿.缓存雪崩等异常场景,为了避免异常带来巨大 ...

  4. 缓存在哪里_蚂蚁金服中间件(4轮题目):MVCC+缓存穿透+悲观锁+NIO+负载均衡等

    第一轮 说说HaspMap底层原理?再说说它跟HaspTable和ConcurrentHashMap他们之间的相同点和不同点? 讲讲jdk1.7和1.8的区别? 几种内置的线程池 MySQL事务隔离级 ...

  5. mysql数据库击穿_面试中经常出现的缓存穿透、雪崩和击穿到底是什么?

    对于缓存穿透.缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是何方神圣 ​ ​ redis缓存穿透 ​理解重在穿透吧,也就是访问透过redis直接经过mysql,通常是一个不存在的key,在数据 ...

  6. 大厂面试Redis:缓存雪崩、缓存穿透、缓存击穿

    欢迎关注这个有趣的灵魂 眼光不错,小伙子,看到这篇文章了就血赚,这篇文章绝对让你学到开心,这是面试的杀器,其实Redis这个东西吧,我个人认为,真的真的很强大,但是呢,又感觉被吹得有点过头了 不过人家 ...

  7. 面试必备:缓存穿透,缓存雪崩的四种解决方案

    前言 设计一个缓存系统,不得不考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应. 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数 ...

  8. 面试官:缓存穿透、缓存雪崩和缓存击穿是什么?

    前言 原创公众号:bigsai 对于缓存穿透.缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是啥吧? redis缓存穿透 理解 重在穿透吧,也就是访问透过redis直接经过mysql,通常是一个 ...

  9. beyond compare4过期解决方法_面试必备:缓存穿透、雪崩解决方案及缓存击穿的四种解决方案...

    前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应. 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到 ...

最新文章

  1. 构建具有用户身份认证的 React + Flux 应用程序
  2. UNREFERENCED_PARAMETER的作用
  3. 三个对CS最大的谬误
  4. SAP UI5 Extension getCustomProperties
  5. python股票预测代码_python用线性回归预测股票价格的实现代码
  6. document.createElement
  7. away3d 4.0.9Gold 学习笔记 加载方法总结(4)
  8. 查找算法系列之复杂算法:哈希查找
  9. axure手机页面设计说明_产品经理原型演示——Axure制作手机登陆界面
  10. java 键盘钩子程序
  11. 如何安装Chrome OS系统
  12. SD卡驱动-基础知识
  13. oracle select into from 用法,sql select into用法
  14. xp 安装IPv6后,无法上网
  15. 《多基因病的遗传》学习笔记
  16. xmanager登陆linux黑屏,使用xmanager工具登陆linux服务器时黑屏问题
  17. 耿建超英语语法---定语从句
  18. pip install pycrypto
  19. 第二次上机作业 (数组综合)
  20. Java使用POI导出Excel .xlsx提示文件格式或文件扩展名有误

热门文章

  1. jQuery Validate 提交表单验证失败扩展方法
  2. Oracle Q-quote delimiter Quote(q) 字符串原样输出
  3. qt cef嵌入web(二)
  4. 如何从技术牛人升阶为管理牛人
  5. JFinal问题整理
  6. Lucene学习之——停用词
  7. 从默认的 _id 字段中,取得时间信息
  8. dalvik对于Java方法调用的实现
  9. C++中关于内部与外部函数
  10. python数据拼接: pd.concat