15 | 缓存的使用姿势(三):缓存穿透了怎么办?
15 | 缓存的使用姿势(三):缓存穿透了怎么办?
讲述:唐扬
时长14:45大小13.50M
什么是缓存穿透
缓存穿透的解决方案
回种空值
使用布隆过滤器
课程小结
一课一思
赞 34
提建议
精选留言(75)
- 公号-技术夜未眠置顶2019-10-21很实用,很赞
作者回复: 谢谢~
共 3 条评论30 - 小虎置顶2019-10-24讲的很好,很透彻,实用。老师,那么这个过滤器在微服务环境下如何部署比较好?部署好了以后是否也可以起到防止洪水攻击带来的缓存穿透问题?
作者回复: 以单独服务部署比较好,我之前团队曾经改了一下redis源码来实现这个功能,利用redis的存储机制
共 2 条评论17 - jc9090kkk2019-10-22布隆过滤器可以用在一些资讯app的新闻展示中,给用户推送新的资讯用来过滤掉那些用户已经浏览过的记录
作者回复: 是的
共 2 条评论30 - 长期规划2019-10-26老师,为什么会出现大量查询未注册用户的情况呢?是系统被攻击了?
作者回复: 可能存在扫描你的用户的爬虫请求
28 - QQ怪2019-10-21老师如何来监控缓存的命中率。
作者回复: 一般缓存会有cache miss和cache hit的统计信息,也可以自己打印日志统计
23 - jun.hai2019-12-03老师您好,请教个问题,文中讲到的缓存穿透跟缓存雪崩是一个概念么?如果不是那缓存雪崩的解决方案是什么呢?谢谢
作者回复: 穿透指的是缓存中没有数据,需要到数据库中去取;雪崩指的是一个缓存节点的故障导致全局故障,两者是不同的 之前提的一致性hash中实现虚拟节点就是一种避免雪崩的方法
共 7 条评论19 - 小喵喵2019-10-211.这两节都有提到分布式锁,请问下分布式锁和一般锁的有什么区别呢? 2.缓存适合存放什么样子的数据呢?还是数据库里面的所有数据都可以放入缓存呢? 谢谢
作者回复: 1. 一般的锁是进程中的锁,可以同步一个进程中的多个线程;分布式锁可以同步多个进程 2. 缓存适合放经常访问的热数据,不能放全量数据,而且也放不下
共 2 条评论17 - 约书亚2019-10-21bloom filter这个用法会在各种文章教程中提出,但我一直有个疑问想求教一下:基于redis这种存储的bloom filter有没有成熟的方案?因为我觉得毕竟redis不是一种完全可靠的存储,一旦crash理论上有可能丢数据,在用户的那个案例中,一旦应该出现在bloom filter中的数据丢失了,就意味着永远也查不出这个用户来了。那是否我们还应该启动一个监控进程,一旦发现redis crash了,要重新构建bloom filter呢? 回到思考题,我现在觉得文章中的三个方案都只能解决部分场景的问题,有时候需要配合使用。除此之外,合理的数据库连接池大小以及服务限流也能起到最后防线的作用吧?展开
作者回复: bloom filter需要自研,可以基于redis持久化存储到硬盘上 连接池应该解决不了问题,因为链接不是无限的;限流是有损的
共 4 条评论9 - 楼下小黑哥2019-10-23布隆过滤器单独部署服务,服务启动时需要初始化数据,将数据库中数据初始化到过滤器中。后续将布隆过滤器定期写到磁盘中,防止服务重启导致丢失。 请教下老师,文中说的布隆过滤器是否如上上面说部署?
作者回复: 是的
8 - Luciano李鑫2019-11-15“即使使用 32 位的 Hash 算法,它的值空间长度是 2 的 32 次幂减一,约等于 42 亿,用来映射 20 亿的用户数据,碰撞几率依然有接近 50%“。这50%的碰撞率是怎么得到的共 1 条评论6
- Fourty Seven2019-11-12分布式锁的方案中,有问题吧?如果第二个线程发现有这个key说明有别的线程在加载数据,但是还没有加载完,这个时候读缓存是没有的。
作者回复: 可以返回失败 不从数据库读取,或者重试
共 4 条评论5 - longslee2020-07-13对不起老师给您丢脸了,有面试官问到如何避免缓存穿透,我一下懵了,因为我觉得缓存是可以穿透的,结果他意思应该跟您这一节课差不多,我竟然没想起布隆过滤器。
作者回复: 没关系,再反复看看专栏的内容,里边都是我多年工作的经验总结,覆盖面还是比较大的……预祝下次面试好运🍀
5 - Geek_810a902019-12-10老师,还是有个疑惑 先查布隆过滤器存在,去查缓存,缓存中失效了或者是刚更新过数据删除了缓存,透过缓存查询数据库,在高并发的情况下,也还是会出现缓存穿透的吧
作者回复: 是的,缓存穿透肯定会有,只是要尽量减少
4 - 方木木2019-10-27“即使使用 32 位的 Hash 算法,它的值空间长度是 2 的 32 次幂减一,约等于 42 亿,用来映射 20 亿的用户数据,碰撞几率依然有接近 50%。”这是怎么算出来的?共 7 条评论4
- miracle2019-10-27如果设置缓存key值不过期,是否可以避免狗桩效应呢? 想请教下唐老师 什么场景下不适用于设置不过期的情况,一般频繁更新的场景也不适用缓存吧
作者回复: 一般不建议设置缓存不过期,原因有两方面,一方面是数据可能会有不一致,另一方面缓存的容量也会有限制
3 - 飞翔2019-10-21如果布隆过滤器会将集合中的元素判定为不在集合中,那么我们就不们就不确定,被布隆过滤器判定为不在集合中的元素,是不是在集合中。这句话是不是写反了,应该是判定为在集合中,就不能确定到底在不在集合中,因为有hash碰撞的问题
作者回复: 是的,是集合中的元素不一定在集合中。 我的这句应该是一个假设,表示,如果布隆过滤器可以把不是集合中的元素判定为在集合中,也就是false negative,那么就不能减少缓存穿透了。正因为布隆过滤器是false positive,所以才可以减少缓存的穿透
共 3 条评论3 - Carl2020-02-19怎么计算缓存命中率
作者回复: 命中数/请求总数
2 - 长期规划2019-10-26在使用分布式锁时,一个线程拿到了锁,加载数据的过程,另一个线程也来请求会阻塞吧
作者回复: 阻塞的话会不释放资源,如果拉取数据库的操作比较慢,会影响系统性能
共 4 条评论2 - longslee2019-10-21打卡。老师你好,请问文中介绍布隆过滤器,提到“使用多个 Hash 算法为元素计算出多个 Hash 值”,这句话怎样理解呢?如果同一个key采用多个Hash算法得出得Hash值基本不一样,那数组下标也不一样,这同一个key对应好几个下标,那跟别的key有大量冲突呀,这时该怎么判断呢。
作者回复: 比如有三个算法算出三个值,那么必须三个值都一致才算是在集合中,只有两个值一致不算
共 8 条评论2 - 良记2019-10-21最后这个分布式锁并不是十分理解,如果在数据还没有被缓存到Redis的时候,其他请求查询到了“lock.1”,那么重新取数的时候是等待新数据缓存好了还是说直接拿到空值?
作者回复: 拿到空值
2