Redis和Mysql数据同步方案---延迟双删

一般场景下数据库和redis的同步机制:

针对有请求来读取数据库的场景:
Redis和Mysql数据同步方案---延迟双删_第1张图片

 但是如果有想要修改数据库内容的场景该怎么保持同步呢?

在我们访问redis时,redis中的数据可能不是热点数据,即此时数据库的更新操作已经完成,但是还没有同步到redis中。

解决方案--延时双删
延时双删方案执行步骤
1.删除redis
2.更新数据库
3.延时500毫秒
4.删除redis

为什么要延时呢?

因为 mysql 和 redis 主从节点数据不是实时同步的,同步数据需要时间。

数据工作的大致流程:

  1. 服务节点删除 redis 主库数据。
  2. 服务节点修改 mysql 主库数据。
  3. 服务节点使得当前业务处理 等待一段时间,等 redis 和 mysql 主从节点数据同步成功。
  4. 服务节点从 redis 主库删除数据。
  5. 当前或其它服务节点读取 redis 从库数据,发现 redis 从库没有数据,从 mysql 从库读取数据,并写入 redis 主库。

缺点

  1. 延时双删,有等待环节,如果系统要求低延时,这种场景就不合适了。
  2. 延时双删,不适合“秒杀”这种频繁修改数据和要求数据强一致的场景。
  3. 延时双删,延时时间是一个预估值,不能确保 mysql 和 redis 数据在这个时间段内都实时同步或持久化成功了。

总结

  1. 延时双删用比较简洁的方式实现 mysql 和 redis 数据最终一致性,但它不是强一致。
  2. 延时,是因为 mysql 和 redis 主从节点数据同步不是实时的,所以需要等待一段时间,去增强它们的数据一致性。
  3. 延时 是指当前请求逻辑处理延时,而不是当前线程或进程睡眠延时。
  4. mysql 和 redis 数据一致性是一个复杂的课题,通常是多种策略同时使用,例如:延时双删、redis 过期淘汰、通过路由策略串行处理同类型数据、分布式锁等等

你可能感兴趣的:(Java基础,数据库,redis,mysql,数据库)