1 Redis 在分布式环境下的数据一致性主要是通过以下几种方式来保证的:

Redis 在分布式环境下的数据一致性是通过 Redis Cluster 实现的。Redis Cluster 是 Redis 的分布式解决方案,它将数据分散在多个节点上存储,通过一定的协调机制保证数据的一致性。以下是 Redis Cluster 实现数据一致性的方法:

 

哈希槽分配: Redis Cluster 将数据分散在多个节点上存储,每个节点存储部分数据,这些数据通过哈希槽分配算法分配到不同的节点上。哈希槽分配算法可以保证相同的 Key 始终分配到同一个节点上存储,这样就保证了数据的一致性。

 

主从同步:当一个节点的数据发生变化时,Redis Cluster 会将这些变化同步到其他节点上,保证各个节点的数据保持一致。Redis Cluster 采用主从复制的方式实现节点间数据同步,每个节点都有一个主节点和多个从节点,主节点的数据发生变化时,会将变化同步到从节点,从节点会将变化应用到自己的数据中,从而保证数据的一致性。

 

客户端路由:当客户端向 Redis Cluster 发起请求时,Redis Cluster 会根据哈希槽分配算法将请求路由到相应的节点上,保证客户端请求的数据始终从同一个节点上读取或写入,从而保证数据的一致性。

 

集群状态监控:Redis Cluster 会监控各个节点的状态,如果有节点失效或发生故障,会将其从集群中移除,从而避免因节点故障导致数据不一致的问题。 通过以上方法,Redis Cluster 实现了在分布式环境下的数据一致性。

 

事务: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

posted on 2023-03-23 15:57  colorfulworld  阅读(2784)  评论(0编辑  收藏  举报