掘地三尺搞定 Redis 与 MySQL 数据一致性问题
Redis 拥有高性能的数据读写功能,被我们广泛用在缓存场景,一是能提高业务系统的性能,二是为数据库抵挡了高并发的流量请求。 把 Redis 作为缓存组件,需要防止出现以下问题,否则可能会造成生产事故。 Redis 缓存满了 缓存穿透、缓存击穿、缓存雪崩 Redis 数据过期了 Redis 突然变慢了 Redis 与 MySQL 数据一致性问题 在本文正式开始之前,需要大家先取得以下两点共识: 缓存必须要有过期时间; 保证数据库跟缓存的最终一致性即可,不必追求强一致性。 1. 什么是数据库与缓存一致性? 数据一致性指的是: 缓存中存有数据,缓存的数据值 = 数据库中的值; 缓存中没有该数据,数据库中的值 = 最新值。 反推缓存与数据库不一致: 缓存的数据值 ≠ 数据库中的值; 缓存或者数据库存在旧的数据,导致线程读取到旧数据。 为何会出现数据一致性问题呢? 把 Redis 作为缓存的时候,当数据发生改变我们需要双写来保证缓存与数据库的数据一致性。 数据库跟缓存毕竟是两套系统,如果要保证强一致性,势必要引入 2PC 或 Paxos 等分布式一致性协议,或者分布式锁等等。这个在实现上是有难度的,而且一定会对性能有影响。 如果真的对数据的一致性要求这么高,那引入缓存是否真的有必要呢? 2. 缓存的使用策略 在使用缓存时,通常有以下几种缓存使用策略用于提升系统性能: Cache-Aside 模式(旁路缓存,业务系统常用) Read-Through 模式(直读) Write-Through 模式(同步直写) Write-Behind 模式 2.1 […]