缓存
使用了缓存,就意味着不需要强一致性
缓存是持久化数据的冗余存储
常见的缓存模式:
1. **缓存即写 (Write-Through Cache)**
• **定义**:每当有数据写入时,数据同时写入缓存和后端存储。
• **优点**:确保缓存和后端存储数据的一致性。
• **缺点**:写操作的性能较差,因为每次写入都需要更新两个地方。
2. **缓存写入 (Write-Back Cache)**
• **定义**:数据首先写入缓存,定期或在特定条件下将数据批量写入后端存储。
• **优点**:写操作性能较高,减少了写入后端存储的频率。
• **缺点**:可能会导致数据丢失,因为缓存中的数据在写入后端存储前可能会丢失。
3. **缓存旁路 (Write-Around Cache)**
• **定义**:写操作直接写入后端存储,不经过缓存。
• **优点**:避免了缓存的写入负担,适合写操作较多的场景。
• **缺点**:第一次读取数据时,缓存命中率较低,可能导致较高的延迟。
4. **读取缓存 (Read-Through Cache)**
• **定义**:读取数据时,首先检查缓存,如果缓存中没有数据,再从后端存储读取并缓存。
• **优点**:提高了读取操作的性能,减少了后端存储的负载。
• **缺点**:需要额外的缓存空间来存储读取的数据。
5. **预热缓存 (Cache Preloading)**
• **定义**:在应用启动或特定时间点,预先将常用的数据加载到缓存中。
• **优点**:提高了应用启动后的初始性能,减少了第一次访问时的延迟。
• **缺点**:需要额外的时间和资源来预加载数据。
6. **缓存失效 (Cache Invalidation)**
• **定义**:在数据更新或删除时,手动或自动地使缓存中的相应数据失效。
• **优点**:确保缓存中的数据与后端存储数据的一致性。
• **缺点**:需要额外的逻辑来管理缓存失效。
7. **分布式缓存 (Distributed Cache)**
• **定义**:将缓存数据分布到多个节点上,形成一个统一的缓存系统。
• **优点**:提高了缓存系统的扩展性和可用性,适合大规模应用场景。
• **缺点**:需要额外的网络通信和一致性管理。
8. **本地缓存 (Local Cache)**
• **定义**:缓存数据存储在本地节点中,不共享给其他节点。
• **优点**:读取和写入操作性能高,适合单节点或小规模应用。
• **缺点**:无法在多节点间共享数据,扩展性较差。一致性保证
以旁路缓存为基础,探讨以下方式
**更新MySQL后,不管Redis,以过期时间兜底**: • **特点**:只更新数据库,不立即处理缓存,依赖缓存的过期时间来自动刷新缓存。 • **优点**:实现简单,避免了并发问题。 • **缺点**:在缓存未过期期间,读取到的仍然是旧数据。 **更新MySQL之后,操作Redis**: • **特点**:在更新数据库后立即更新或删除缓存,以确保缓存中的数据与数据库中的数据一致。 • **具体操作**: • **更新缓存**:直接将新的数据写入缓存。这种方法可能会有并发问题,导致缓存和数据库不一致(写库+写缓存,双写在并发时导致脏写)。 • **删除缓存**:删除缓存中的数据,确保下次读取时从数据库中获取最新的数据,并将其写入缓存。这是推荐的方法,能有效避免并发问题。在**缓存击穿**情况下,可考虑使用**乐观锁**的方式写入缓存(不存在则写入) • **优点**:缓存与数据库数据一致性高。 • **缺点**:实现复杂度较高,尤其在高并发场景下。 **异步将MySQL的更新同步到Redis**: • **特点**:在更新数据库后,将更新操作记录下来,通过异步任务将数据同步到缓存中。 • **优点**:降低了数据库操作和缓存操作之间的耦合度,提高系统的异步处理能力。 • **缺点**:实现复杂度高,需要处理异步任务的可靠性和数据一致性问题。 其中,方式 3 可用 阿里巴巴开源组件 canal