高并发40问学习笔记

1.缓存穿透

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

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

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

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

2.缓存可用性问题

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

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

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

3.消息队列

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

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

4.总结

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

相关推荐
数智工坊6 小时前
机器人运动控制:采样、优化与学习三大流派深度对比与实战
android·学习·机器人
ZC跨境爬虫6 小时前
跟着 MDN 学JavaScript day_7:数学运算与逻辑判断实战测试
开发语言·前端·javascript·学习·ecmascript
MartinYeung59 小时前
[论文学习]隐私保护联邦特徵选择与差分隐私的的工程实践框架
学习
qeen879 小时前
【C++】类与对象之类的默认成员函数(二)
android·c语言·开发语言·c++·笔记·学习
m0_736034859 小时前
存储基础和虚拟化
笔记
Flandern111110 小时前
Pull Requests(PR)
学习·github·pr
nashane10 小时前
HarmonyOS 6学习:JsCrash“闪退”法医指南——从FaultLog堆栈还原崩溃现场的终极手册
学习·华为·harmonyos
for_ever_love__10 小时前
UI学习:UICollectionView瀑布流
学习·ui·ios·objective-c·cocoa
AOwhisky11 小时前
MySQL 学习笔记(第六期):MySQL 备份与恢复
运维·数据库·笔记·学习·mysql·云计算
_李小白11 小时前
【android opencv学习笔记】Day 32:直线检测之霍夫变换
android·opencv·学习