高并发40问学习笔记

1.缓存穿透

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

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

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

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

2.缓存可用性问题

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

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

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

3.消息队列

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

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

4.总结

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

相关推荐
java_logo4 小时前
SiYuan 思源笔记 Docker 部署终极指南:Windows+Linux 双平台
windows·笔记·docker·思源笔记·思源笔记部署·docker部署思源笔记·思源笔记文档
d111111111d4 小时前
了解Modbus
网络·笔记·stm32·单片机·嵌入式硬件·学习
愚昧之山绝望之谷开悟之坡5 小时前
什么agentskill.io大白话说清楚
笔记
charlie1145141915 小时前
通用GUI编程技术——图形渲染实战(三十八)——顶点缓冲与输入布局:GPU的第一个三角形
开发语言·c++·学习·图形渲染·win32
我想我不够好。5 小时前
监控学习 4.29 1.5hour
学习
晓晓hh5 小时前
JavaWeb学习——JUnit和日志
学习·junit·单元测试
小超同学你好5 小时前
Transformer 30. MoCo:用「动量编码器 + 队列字典」把对比学习做成可扩展的“字典查找”
深度学习·学习·transformer
光影少年5 小时前
前端SSR和ssg区别
前端·vue.js·人工智能·学习·react.js
筱_智5 小时前
Docker学习-超详细-通俗易懂(从入门到精通)
学习·docker·容器
其实防守也摸鱼5 小时前
带你了解与配置phpmyadmin
笔记·安全·网络安全·pdf·编辑器·工具·调试