高并发40问学习笔记

1.缓存穿透

缓存穿透是指大量访问不能在缓存中命中,需要去数据库访问,但数据库能支持的访问量是有限的,如果缓存命中率可能下降1%都会影响数据库的可用性。

解决缓存穿透最简单的方式是限制请求的数量,然后对于一个具体的问题:查找用户信息,如果大量对未注册信息的查找,缓存不能命中,直接就去数据库查找,会造成大量访问的问题。

一种解决思路是,缓存中存储有的用户信息,比如key,或者对于一次查找不存在的用户,在查找不存在之后就在缓存中存储不存在的用户,这样就可以当一个人反复查找相同的不存在的用户的时候,只有第一次会去访问数据库,之后都在缓存层被阻挡了。

更好的解决思路是使用布隆过滤器,布隆过滤器能告诉我们有哪些,哪些不存在,而使用的空间会缩减几十倍,布隆过滤器的特点是判断存在的有可能不存在,但是判断不存在的就一定不存在,这是可以接受的错误,如果反过来的话,判断了不存在我们也不能保证真的不存在,仍然需要去数据库确定。

2.缓存可用性问题

从客户端、中间件、服务端三个角度去考虑,在客户端可以采用多缓存,分布式的方式,这样可以避免缓存故障造成缓存不可用,也可以降低单一缓存的访问量。

中间件可以控制对数据库的直接访问量。

在服务端可以通过监控节点的可用性控制,在redis中有哨兵集群的概念,多个哨兵通过消息是否能得到回复判断主库是否下线,然后使用少数服从多数的原则来选择新的从库成为主库,通知其他从库新主库的存在。

3.消息队列

消息队列是把任务放在队列中,具体场景就是秒杀的情况,对于一个电商平台,平时的写访问是每秒100条,而当办秒杀活动的时候可能临时的突发访问是一万,是十万,是不能被承受的,如果为了这种情况单独设计分库分表的内容,然后在活动之后缩减,是很浪费的,这种突发情况很长时间才会发生一次,且发生时间比较短。

消息队列的功能有解耦、异步响应、削峰填谷,使用消息队列队列后边的任务是有一定的延迟的,只要延迟是可以接受的就可以使用消息队列,比如在秒杀系统,用户是接受等几秒,等几十秒的,使用消息队列解耦则是两个不同的系统通信,如果直接调用接口通信,如果对方的api更改,我们的处理代码也要做对应的更改,如果使用消息队列,可以把数据放在消息队列上由对方需要的时候去获取数据。

4.总结

对于缓存命中率下降的影响,我之前没有认识到重要性,然后布隆过滤器我是在数据结构与算法之美学的,是算多个哈希。

相关推荐
Alphapeople2 小时前
Isaac Sim学习
学习
天若有情6733 小时前
循环条件隐藏陷阱:我发现了「同循环双条件竞态问题」
c++·学习·算法·编程范式·while循环··竞态
Amazing_Cacao4 小时前
褪去故事滤镜:重建精品可可的“结构语言”
笔记·学习
网络工程小王4 小时前
【大数据技术详解】——Sqoop技术(学习笔记)
大数据·学习·sqoop
暖阳之下4 小时前
学习周报三十六
学习
zlpzlpzyd4 小时前
groovy学习
java·jvm·学习
泯仲5 小时前
从零起步学习MySQL 第十二章:MySQL分页性能如何优化?
数据库·学习·mysql
我要成为嵌入式大佬5 小时前
嵌入式学习找工作第十七天--第二个项目(命令行日记本)
学习
日更嵌入式的打工仔5 小时前
二值信号量 vs 互斥量
笔记