上节中将,Redis如何存储一些与用户关系不大的系统,效果特别好。因为这些系统中,每个人看到的内容都是一样的。缓存命中率非常高,没有多少请求能穿透到MySQL。
但是和用户相关的系统,缓存就没那么好了。比如订单系统,账户系统,购物车系统。这些系统查询的信息,都是和用户息息相关的。缓存命中率就不是很高了。
那么怎么办呢?
一个简单而且非常有效的方案是,我们不对数据分片,而是使用多个具有相同数据的 MySQL 实例来分担大量的查询请求,这种方法通常称为“读写分离”。
读写比一般都在几十左右,平均每发生几十次查询请求,才有一次更新请求。换句话来说,数据库需要应对的绝大部分请求都是只读查询请求。
一个分布式的存储系统,想要做分布式写是非常非常困难的,因为很难解决好数据一致性的问题。但实现分布式读就相对简单很多,我只需要增加一些只读的实例,只要能够把数据实时的同步到这些只读实例上,保证这这些只读实例上的数据都随时一样,这些只读的实例就可以分担大量的查询请求。
读写分离的另外一个好处是,实现简单,只需要修改DAO代码,把对数据库的读写请求分开,请求不同的MySQL实例就好了。
实施读写问题,需要做两步:
分离请求程序的读写请求,有三种方法: