写点什么

数据同步与缓存一致性问题

作者:Mars
  • 2022 年 2 月 21 日
  • 本文字数:810 字

    阅读完需:约 3 分钟

数据同步与缓存一致性问题

1、如何保持数据同步中间件(如 canal)的高可用?

中间件高可用大多借助 ZK 来部署集群(如 Canal),借助 ZK 的瞬时节点与 Pub/Sub 特性完成 HA 部署:

  • canal server 要启动某个 canal instance 时都先向 zookeeper 进行一次尝试启动判断 (实现:创建 EPHEMERAL 节点,谁创建成功就允许谁启动)

  • 创建 zookeeper 节点成功后,对应的 canal server 就启动对应的 canal instance,没有创建成功的 canal instance 就会处于 standby 状态

  • 一旦 zookeeper 发现 canal server A 创建的节点消失后,立即通知其他的 canal server 再次进行步骤 1 的操作,重新选出一个 canal server 启动 instance.


2、请描述缓存延迟双删策略?

假设先删除缓存,在更新数据库,在并发场景下,线程 A 删除缓存后,还没来及更新数据库 V1,而线程 B 先查询缓存,发现缓存缺失,去数据库拿数据 V0,这时 B 拿到的数据是线程 A 更新之后的数据,把此值重新缓存 V0,这时线程 A 去修改数据库为 V1,这种场景下就造成了 缓存中的数据 V0 和 数据库中的数据 V1 不一致问题。 采用延迟双删可以降低影响的请求数,伪代码如下:

redis.delKey(X)

db.update(X)

Thread.sleep(N)

redis.delKey(X)


3、通过布隆过滤器可以解决缓存穿透问题,请描述布隆过滤器的工作原理以及使用时的注意事项? 

布隆过滤器由一个初值都为 0 的 bit 数组和 N 个哈希函数组成,可以用来快速判断某个数据是否存在。当我们想标记某个数据存在时(例如,数据已被写入数据库),布隆过滤器会通过三个操作完成标记:

  • 首先,使用 N 个哈希函数,分别计算这个数据的哈希值,得到 N 个哈希值。

  • 然后,我们把这 N 个哈希值对 bit 数组的长度取模,得到每个哈希值在数组中的对应位置。

  • 最后,我们把对应位置的 bit 位设置为 1,这就完成了在布隆过滤器中标记数据的操作。


如果数据不存在(例如,数据库里没有写入数据),我们也就没有用布隆过滤器标记过数据,那么,bit 数组对应 bit 位的值仍然为 0。


4、如何保证 redis 缓存与数据库的一致性?

1、延迟双删策略

2、监听 binlog 异步更新缓存

用户头像

Mars

关注

还未添加个人签名 2018.04.26 加入

还未添加个人简介

评论

发布
暂无评论
数据同步与缓存一致性问题