缓存方案
如何mysql提升读写性能的方式?
1. 连接池 阻塞io + 线程池
2. 异步连接 + 非阻塞io
3.sql执行触发(两种):1即时执行 2预编译执行 prepare:提升执行效率,跳过了词法句法分析,跳过了权限验证,跳过了优化器
4. 读写分离:写操作写到主数据库,读操作读从数据库。存在一致性问题:从数据库是异步的方式从主数据库中拿到数据,同一时刻,主数据库比从数据库更新,数据库不一致。两种一致性,最终一致性和强一致性
满足强一致性:读也从主数据库读
主从复制:解决了单点故障的问题
5. 缓存方案:将热点用户数据放入缓存(用户) 区别mysql内部的缓冲池:缓存MySQL内部的热点数据(操作)
方式:memcached、redis
针对热点数据进行讨论,热点数据有哪些状态?
1.mysql有,cache没有 //通过策略避免
2.mysql没有,cache有 //不正常,避免
3. mysql和chache 都有,数据不一致 //不正常
4. mysql和cache都有,数据一致 //追求
5.mysql和cache都没有 //正常
读策略:
1.先看cache是否有数据,如果有直接返回;
2. 如果没有,去访问mysql
3. 如果mysql有,缓存数据到cache
4.如果MySQL没有,不做操作
写策略:
删除:先去删除缓存,再去删除mysql
修改:先删除缓存,再修改mysql。原因:如果有两个用户同时修改,会造成cache的混淆,因为主要依据是mysql,也容易造成cache与数据库不一致
插入:先删除缓存,再去修改mysql,原因同上,防止已经有这个数据了
这种不能频繁修改
此时还不能达到第四种情况,达到了第一种情况
强一致性:修改完mysql后,再同步到cache
另一种方案:
修改:先修改缓存,设置过期时间(200ms,这个时间大于mysql同步到cache的时间),MySQL同步到cache时,需要删除过期时间
插入同上
这个性能比上面的方案高,但是此时mysql宕机了,就会只修改cache,不会修改mysql,访问时,就会拿到一个错误数据,作为业务逻辑。
可以用的前提是:mysql宕机,业务停摆,错误没有影响数据库,但是影响客户的显示。
mysql同步数据到redis:
原理:主从复制,利用中间件伪装成从数据库。怎么伪装?仿照从数据库的协议