高并发40问学习笔记

1.缓存穿透

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

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

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

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

2.缓存可用性问题

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

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

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

3.消息队列

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

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

4.总结

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

相关推荐
qq_2842740543 分钟前
数控铣床与加工中心笔记:铣刀与刀柄系统、G54试切对刀、镜像加工指令、孔加工工艺(钻扩铰镗)与固定循环G73/G83/G81/G76/G87/G84
笔记·学习·自动化·制造
Titan20242 小时前
MySQL访问个人学习笔记
笔记·学习·mysql
小雪崩3 小时前
嵌入式学习 day64:字符设备驱动
学习
深圳老胡3 小时前
STM32CubeMX 生成 CMake 工程,用 VSCode 编译与调试的完整流程
笔记·stm32·单片机·代码规范
个 人 练 习 生3 小时前
C++ string 类模拟实现:从底层理解字符串(上)
开发语言·c++·经验分享·学习·程序人生
坤坤子吖3 小时前
C++智能指针:RAII、shared_ptr与内存泄漏
开发语言·c++·笔记·学习
乐橙开放平台4 小时前
智慧连锁客流检测和离岗检测怎么对接
大数据·人工智能·笔记·物联网·自动化·音视频·智能家居
零基础1234 小时前
FinalShell 使用教程:从安装到高效运维
运维·经验分享·笔记·finalshell
ACP广源盛139246256734 小时前
Type‑C 扩展坞方案选型笔记|国产 DP1.4 转 HDMI2.0 桥接芯片 GSV2201S @ACP评估
c语言·开发语言·笔记·硬件架构·硬件工程·国产芯片
词却5 小时前
OpenCV学习:MediaPipe 人脸网格检测
opencv·学习