2. 缓存与数据库基础:缓存工作原理、ACID 特性与常见缓存策略
在构建合规治理驱动的审计方案之前,必须深入理解缓存与数据库的核心工作原理。缓存层与持久化存储层之间的数据一致性,是审计规则设计的根本出发点。本节将系统梳理 Redis/Memcached 的缓存机制、数据库 ACID 特性,以及三种主流缓存策略的架构差异。
2.1 缓存工作原理:Redis 与 Memcached
缓存系统通过将热点数据存储在内存中,大幅降低数据库的读压力。当前生产环境中最常用的两种缓存中间件是 Redis 和 Memcached,它们在数据模型、持久化能力和一致性保障上存在显著差异。
| 特性维度 | Redis | Memcached |
|---|---|---|
| 数据结构 | String、Hash、List、Set、Sorted Set、Bitmap、HyperLogLog、Stream | 仅支持 Key-Value(String) |
| 持久化 | RDB 快照 + AOF 日志,支持数据恢复 | 纯内存,无持久化 |
| 过期策略 | 惰性删除 + 定期删除(每秒 10 次采样) | 惰性删除 + LRU 淘汰 |
| 数据一致性 | 单线程模型保证串行化,支持 Lua 脚本原子操作 | 多线程模型,无原子性保证 |
| 主从复制 | 支持主从异步复制、哨兵模式、集群模式 | 不支持原生复制 |
| 适用场景 | 复杂数据结构、排行榜、分布式锁、消息队列 | 简单 KV 缓存、Session 共享 |
审计关注点: Redis 的 AOF 日志为缓存操作提供了可追溯的审计线索,而 Memcached 由于缺乏持久化,一旦宕机所有缓存数据丢失,无法进行事后审计回放。在合规治理场景下,优先选择 Redis 并开启 AOF 全量日志。
2.2 数据库 ACID 特性
数据库事务的 ACID 特性是衡量数据一致性的黄金标准。缓存与数据库的一致性审计,本质上是在缓存层模拟或验证 ACID 中的 C(一致性) 和 I(隔离性)。
- 原子性(Atomicity): 事务中的所有操作要么全部成功,要么全部回滚。缓存操作通常不具备原子性,需要借助分布式事务或补偿机制。
- 一致性(Consistency): 事务执行前后,数据必须满足所有预定义的约束规则。缓存与数据库之间的数据不一致,本质上是违反了跨层的一致性约束。
- 隔离性(Isolation): 并发事务之间互不干扰。缓存脏读、不可重复读等问题,均源于隔离性被破坏。
- 持久性(Durability): 已提交的事务必须永久保存。Redis 的 AOF 持久化可以近似满足此要求,但存在秒级数据丢失窗口。
合规映射: 在金融、医疗等强监管行业,审计规则要求缓存层至少满足“最终一致性”且可验证。ACID 中的 C 和 I 是设计缓存一致性审计规则的核心理论依据。
2.3 常见缓存策略
不同的缓存策略决定了数据在缓存与数据库之间的流转路径,也直接影响了审计规则的复杂度。以下三种策略是业界最广泛使用的模式。
2.3.1 旁路缓存(Cache-Aside)
旁路缓存是应用层最常用的模式。应用程序同时感知缓存和数据库的存在,由业务代码显式控制读写路径。
- 读流程: 先读缓存,命中则直接返回;未命中则读数据库,将结果写入缓存后返回。
- 写流程: 先更新数据库,再删除缓存(或更新缓存)。
常见陷阱: 先更新数据库再删除缓存,存在“缓存删除失败”的风险,导致缓存中保留旧数据。生产环境通常采用“延迟双删”或“异步重试”机制来补偿。
2.3.2 读写穿透(Read/Write Through)
读写穿透模式将缓存层作为数据访问的唯一入口,应用程序只与缓存交互,由缓存组件负责与数据库同步。
- 读流程: 缓存未命中时,缓存组件自动从数据库加载数据并返回。
- 写流程: 应用程序写入缓存,缓存组件同步或异步将数据写入数据库。
该模式对应用层透明,但要求缓存组件具备数据库写入能力。Redis 本身不原生支持 Write-Through,通常需要结合中间件(如 RedisGears、自定义 Proxy)实现。
2.3.3 策略对比
| 对比维度 | 旁路缓存(Cache-Aside) | 读写穿透(Read/Write Through) |
|---|---|---|
| 应用耦合度 | 高,业务代码需显式管理缓存 | 低,应用只感知缓存 |
| 数据一致性 | 弱,依赖业务代码保证 | 中等,缓存组件可封装一致性逻辑 |
| 审计可追溯性 | 需在业务层埋点 | 可在缓存层统一记录操作日志 |
| 实现复杂度 | 低,无需额外组件 | 高,需要定制缓存中间件 |
| 适用场景 | 大多数互联网应用 | 需要统一数据访问策略的微服务架构 |
2.4 缓存策略架构对比图
下图展示了旁路缓存与读写穿透两种策略在读写路径上的核心差异,以及缓存与数据库之间的数据流向。
2.5 缓存策略选择与审计影响
选择缓存策略时,需要从合规审计的角度评估以下三个关键维度:
- 可审计性: 缓存操作是否能够被完整记录?旁路缓存需要业务代码显式打点,读写穿透可在代理层统一拦截。
- 一致性窗口: 从数据库更新到缓存失效之间存在时间窗口,审计规则需要容忍或补偿该窗口内的不一致。
- 回滚能力: 当数据库事务回滚时,缓存中的脏数据如何清除?旁路缓存依赖业务补偿,读写穿透可由代理层统一协调。
最佳实践: 在合规治理要求较高的场景(如交易流水、用户余额),推荐使用 旁路缓存 + 延迟双删 + 异步审计日志 的组合方案。该方案在保证最终一致性的同时,通过异步日志记录所有缓存操作,为审计提供完整的证据链。