转 孤独烟 打杂的ZRJ https://mp.weixin.qq.com/s/FG5KfyBfhonwrk7-ZOiEiQ
步骤一:建立索引与优化sql语句
首先用慢查询日志定位执行较慢的sql语句
利用explain分子语句
建立索引优化或优化sql语句
步骤二:搭建缓存(缓存过期时间保证最终一致性,但并不保证绝对一致性,根据cap原则,高可用与高一致性)
数据库和缓存双写一致性问题:
先删除缓存,再更新数据库:
线程一删除缓存,线程二读取缓存不存在去数据库读取,再设置缓存,线程一更新数据库,缓存与数据库不一致,脏数据,
解决方案,删除与更新数据库操作后,线程一休眠一秒,然后再删除缓存,把这一秒的脏数据删除(双删策略)
若是采用主从同步读写分离:也采用双删延时策略,加上主从同步时间
该策略不好的地方:若是第二次删除失败怎么办,后面读到的都是脏数据
先更新数据库,再删除缓存:
也会发生高并发下的脏数据问题,但概率较低:缓存刚好失效,线程一更新数据库,线程二查询缓存失效查询数据库得到旧值,
线程一删除缓存,线层二更新缓存,得到脏数据,但是线程二更新缓存会发生在线程一删除缓存之前,因为更新数据库操作慢于查询操作
缓存击穿,缓存穿透,缓存雪崩:高并发绕过缓存将查询全部怼在数据库上
步骤三:读写分离(主从复制读写分离)(引用层解决或者上mycat)
主从架构问题:
主从好处:实现备份,负载均衡
主从实现:主库开log dump线程将binllog发送给从库,从库开io线程将binlog写入relay log,再开sql线程执行relaylog里面的sql语句
主从架构的若已执行问题,要提高一致性还是用缓存吧
步骤四:分区(这浑水我不趟)
步骤五:利用mycat实现分表知道的不多(能不分表就不分表,减少join语句)