最常见的性能问题–慢查询
原因:
1.select有 join,group,order,like等复杂的语义
2.大多数应用都是读多写少 (读写分离,分库分表,分布式数据库)
使用缓存场景
1.分布式系统远程调用,响应时间下降,降低性能
2.数据实时性要求不高的情况
三种模式
1. Cache Aside
2. Read/Write Through
3. Write Behind Caching
Cache Aside 模式
查询:
应用在 cache中查数据,有则返回,没有则从数据库中查,成功后放入缓存,返回结果
更新:
应用 先更新 数据库,成功后 让缓存失效(是失效不是更新)
注:
更新的时候是对缓存失效,不是更新,如果是更新的话,两个并发写操作会导致脏数据。
并发问题:
一个读操作,没有命中缓存 ,进入数据库查询,此刻出现写操作,写操作更新完数据库,失效缓存,这个时候,读操作出了数据库,把之前的旧数据放入缓存,导致缓存和数据库不一致。
这个出现的概率比较低,相当于一个读操作比写操作先进入数据库 ,却比写操作后出数据库。 一般情况下 写会耗费更多时间
解决方法:
1.2pc|Paxos协议保证一致性
2.降低出现概率
3.合理设置缓存过期时间
Read/Write Through 模式
应用程序只对接 缓存 ,缓存作为代理同步到数据库
更新的时候,没命中缓存,直接更新数据库
Write Behind Caching 模式
原理和操作系统linux 的write back一样
在更新数据的时候,只更新缓存,不更新数据库,而缓存会异步地批量更新数据库。
能有效提高数据库IO,但是存在数据丢失的情况,数据不是强一致性。