MySQL和Redis双写数据一致性(待)

287 阅读2分钟

参考

  1. (49条消息) Redis列表(list)使用_redis list使用_蜗牛-的博客-CSDN博客

  2. (49条消息) redis 列表缓存_redis 缓存列表数据_小猪快点跑的博客-CSDN博客

  3. 阿里三面:Redis与MySQL双写一致性如何保证? - 知乎 (zhihu.com)

  4. (49条消息) Mysql与Redis双写一致性问题_mysql redis双写一致性_汐梦聆海的博客-CSDN博客

场景一:关注取关,读多写少

在用户基数不大时:在拉取关注列表和粉丝列表时,为了提高查询效率,将某用户所有的关注列表和粉丝列表存入存入缓存。

  • 列表存储数据结构:List
    key:用户id,
    value:关注用户列表or粉丝用户列表,

对象 <--> string:序列化和反序列化

双写一致性考虑:旁路缓存
写:先写入数据库,再删除缓存
读:先读缓存,未命中则数据库

适合场景:多读,数据更新场景,

实现原理:

  1. 不一致性:写入数据库成功,删除缓存失败。
    若更新会导致数据不一致,需要等待某一次操作执行成功才能成功数据一致。 若插入会成功,忘记写入, 改进:

数据不一致解决方法:

  1. 实时同步:
    通过消息队列: 将数据变更操作发布到消息队列,然后在不同的服务中监听消息,进行相应的数据更新操作。
  2. 异步处理:通过后台任务逐步同步数据,减轻系统负担。
    • 定期批量同步: 设计一个定时任务,定期检查Redis和MySQL的数据一致性,并进行同步。
    • 使用缓存失效策略: 当MySQL中的数据发生变更时,通过一定的策略(如让缓存过期)使Redis中的对应数据失效,下一次访问时从MySQL中重新加载。
  3. 双写模式
    • Cache-Aside Pattern(也称为Lazy-Loading Pattern)旁路缓存模式:
      缓存并不主动去更新或管理数据,而是由应用程序负责。具体来说,在Cache-Aside Pattern中,当需要访问数据时,应用程序首先检查缓存中是否存在所需数据,如果存在,则直接从缓存中获取;如果不存在,则从数据库(MySQL)中读取数据,并将数据写入缓存,以供后续使用。

    • 问题1:写入得时候先操作数据库还是缓存:

    • 问题2:操作缓存得时候为什么选择删除缓存,而不是更新缓存: