参考
场景一:关注取关,读多写少
在用户基数不大时:在拉取关注列表和粉丝列表时,为了提高查询效率,将某用户所有的关注列表和粉丝列表存入存入缓存。
- 列表存储数据结构:List
key:用户id,
value:关注用户列表or粉丝用户列表,对象 <--> string:序列化和反序列化
双写一致性考虑:旁路缓存
写:先写入数据库,再删除缓存
读:先读缓存,未命中则数据库
适合场景:多读,数据更新场景,
实现原理:
- 不一致性:写入数据库成功,删除缓存失败。
若更新会导致数据不一致,需要等待某一次操作执行成功才能成功数据一致。 若插入会成功,忘记写入, 改进:
数据不一致解决方法:
- 实时同步:
通过消息队列: 将数据变更操作发布到消息队列,然后在不同的服务中监听消息,进行相应的数据更新操作。 - 异步处理:通过后台任务逐步同步数据,减轻系统负担。
- 定期批量同步: 设计一个定时任务,定期检查Redis和MySQL的数据一致性,并进行同步。
- 使用缓存失效策略: 当MySQL中的数据发生变更时,通过一定的策略(如让缓存过期)使Redis中的对应数据失效,下一次访问时从MySQL中重新加载。
- 双写模式
-
Cache-Aside Pattern(也称为Lazy-Loading Pattern)旁路缓存模式:
缓存并不主动去更新或管理数据,而是由应用程序负责。具体来说,在Cache-Aside Pattern中,当需要访问数据时,应用程序首先检查缓存中是否存在所需数据,如果存在,则直接从缓存中获取;如果不存在,则从数据库(MySQL)中读取数据,并将数据写入缓存,以供后续使用。 -
问题1:写入得时候先操作数据库还是缓存:
-
问题2:操作缓存得时候为什么选择删除缓存,而不是更新缓存:
-