1 Redis 在分布式环境下的数据一致性主要是通过以下几种方式来保证的:
主从复制:Redis 支持主从复制,当主节点有新的数据写入时,会自动同步到从节点,从节点与主节点的数据保持一致。
Sentinel 哨兵:Redis Sentinel 哨兵是 Redis 的高可用性解决方案,通过监控主节点的状态,当主节点出现故障时,会自动将从节点提升为主节点,从而保证数据的一致性。
Cluster 集群:Redis Cluster 是 Redis 的分布式解决方案,将数据分片存储在多个节点上,每个节点负责一部分数据,通过节点间的数据复制来保证数据的一致性。
事务:Redis 支持事务操作,将一组操作当做一个原子操作执行,要么全部执行成功,要么全部执行失败,可以通过事务来保证数据的一致性。
2. 为保证缓存和数据库数据一致性,主要考虑一下两种策略:
2.1先删除缓存数据,再更新数据库

如上图,模拟线程1更新数据过程,线程2查询数据
如果步骤5先于步骤3执行,或者步骤3更新失败,即线程1删除完缓存,步骤3还没执行完,线程2步骤5过来查询缓存,由于缓存中没有数据,则取数据库中查询数据,这是由于线程1还没有更新db中数据,则线程2从db中查询的数据仍是旧数据,旧数据更新到缓存后也是旧数据,解决思路---延时双删+失败重试
延时双删--解决查询旧数据问题;线程1在步骤4更新成功后延迟一定时间后,再次重复步骤1删除缓存
失败重试--解决数据库更新失败问题;步骤4加入更新失败机制,降低数据不一致性
2.2先更新数据库,再删除缓存

如上图,r如果步骤5先于步骤3执行或者步骤三删除缓存失败,线程1执行完步骤2,还没有删除缓存时,线程2查询数据,则查询到的是旧数据;解决思路:订阅binlog+引入消息队列+失败重试
订阅binlog--数据库每一步操作都会写入binlog,通过监听binlog实时感知数据变化,根据数据变化情况删除reids并添加重试机制
引入消息队列:上图步骤3中若Redis删除失败,则将Redis key放入消息队列,消费端监听消息队列并删除Redis直至删除成功;
参考:
https://blog.csdn.net/sxg0205/article/details/127531279