数据同步与缓存一致性问题
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 异步更新缓存
评论