推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习
MySql有哪些提升读写性能的方式?
- 连接池 阻塞io+线程池
- 异步连接 非阻塞io
- sql执行处罚:及时执行+预编译执行
- 读写分离
- 缓存方案
主从复制解决了单点故障的问题。
读策略
- 先看cache里有没有数据,有直接返回。
- 如果没有,再去MySql里拿数据。
- 如果MySql里有数据,缓存到cache
- 如果没有,那就是没有
最终一致性以及强一致性。
写策略
- 先删除cache,再删除MySql
- 先删除cache,再修改MySql。改进后直接修改缓存,设置过期时间,修改MySql去掉过期时间。
- 先删除cache,再添加MySql。改进后直接修改缓存,设置过期时间,修改MySql去掉过期时间。
异步操作和同步操作相比,主要节约了网络传输的时间。
缓存穿透
redis和MySql中都不存在,redis没有数据就会一直请求MySql,而MySql也没有只能返回。当大量请求堆积到MySql,最后终于不堪重负。、
解决方案:
- 发现MySql不存在,将redis设置<key,nil>设置过期时间,下次访问不在访问MySql,容易造成很多无效的redis缓存数据。
- 设置布隆过滤器,不存在的热点数据直接过滤掉。
缓存击穿
redis没有,MySql有数据。当有大量并发请求,请求堆积MySql过大。某一个Key的大量请求。
- 加锁,有锁就操作,没锁就休眠。
- 将很多热key设置不过期。
缓存雪崩
redis宕机,数据全部为空,造成搞垮MySql。多个Key的大量请教。
- 高可用的集群方案,如哨兵模式,cluster模式。
- 设置随机时期值或其他机制错开失效时间。
- redis开启持久化。