一般来说我们的业务场景是把Redis作为缓存来用,而把关系型数据库作为持久化来用,那么当数据修改时就存在数据一致性的问题。而解决这种一致性问题主要有两种模式:双写模式和失效模式。
-
双写模式
从上图可知,由于服务器存在网络分区问题(网络闪断、服务性能差异、CPU、内存等各种因素),存在写缓存不一致形成了短暂的脏数据。另外,可能存在更新逻辑比较复杂,如果再用复杂的逻辑去更新缓存得不偿失,因此在这种情况下双写模式并不是很合适。 -
失效模式
此模式相比复杂修改时要好一些,但同样存在缓存不一致的情况。
其实不管上面哪种模式都存在一些问题,但好在的是由于缓存只作为临时存储,一般来说可以容忍短暂的不一致性。但如果真的很在意一致性问题,可以采用分布式锁来控制;其次,如果数据更新的太频繁则没必要使用缓存,直接使用数据库即可。下面就数据一致性问题列举几种解决方案:
- 使用阿里巴巴开源的中间件——Canal