2020-08-19 07:23:23
Redis 作为缓存时感知数据库变化的核心机制包括以下几种:
1. KEYS 命令 + 主动轮询在数据库更新时,记录变更的记录 ID 或表名。
定时任务(如每分钟)执行 KEYS 命令匹配相关键(如 user:*),并调用 DEL 删除。
写入缓存时设置 EXPIRE key 300。
数据库更新后,不主动删除缓存,而是等待自然过期。
数据库触发器:在数据库更新时(如 MySQL 的 binlog 或触发器),将变更事件(如 user:123:updated)发布到 Redis 频道。
缓存服务订阅:Redis 订阅该频道,收到消息后删除对应键(如 DEL user:123)。
缓存数据时存储版本号或时间戳(如 SET user:123 "data" EX 3600 和 SET user:123:version 1)。
读取时通过 Lua 脚本比较版本号,若版本不一致则返回空并触发缓存更新。
Spring Cache + Redis:通过 @CacheEvict 注解在数据库更新时自动清除缓存。
Canal:监听 MySQL 的 binlog,解析变更后操作 Redis。
Redisson:提供分布式锁和缓存失效的封装 API。
通过组合上述机制,可以平衡性能、一致性和实现复杂度。例如,用 Canal 监听 binlog + Redis Pub/Sub 通知,既能保证实时性,又避免频繁轮询。