本期,边肖将为您带来Redis和数据库数据一致性的示例分析。文章内容丰富,从专业角度进行分析和描述。看完这篇文章,希望你能有所收获。
说到维护Redis和Mysql双银行的数据一致性,许多人想到的第一个解决方案可能是序列化读请求和写请求,并将它们串入内存队列。
然而,这种方案有一个致命的缺点:读请求和写请求的序列化将大大降低系统的吞吐量,需要比正常情况多几倍的机器来支持在线请求。为什么会出现Redis和Mysql双数据库数据一致性的问题?实际上,我们可以考虑这样一个业务场景:我们需要更新一些数据。我们首先更新数据库数据,然后清除Redis缓存中的数据。但是数据库更新操作成功,但是在清除Redis,的缓存时出现了异常,导致数据库中的数据已经更新为最新数据,但是Redis的缓存中的数据仍然是旧数据,这样就会出现Redis和Mysql的双数据库的数据一致性问题。有些喜欢机会主义的朋友会想,难道我不能先清除缓存中的旧数据,然后将新数据写入数据库,最后更新缓存吗?这样,可能会有一个。
问题:我们成功清除了Redis缓存,但在新数据写入数据库之前,会发生读取请求,这将导致数据库中的旧数据再次存储在Redis,然后等待新数据写入数据库。Redis和Mysql双数据库的数据一致性。
昨天讲到Redis,的分布式环境,其实我说的是在分布式环境下,数据读写操作是并发操作,所以一条数据读写操作的执行顺序不能保证,所以有可能读操作先于写操作执行,然后脏数据会导致数据一致性问题。此时,我们需要考虑我们读取的数据是否强一致。例如,如果账户余额必须是强一致的,我们应该读取数据库。如果我们读取的数据的实时性不是很严格,比如评分表,我们可以直接读取Redis数据。如果机器并发性不高,读取的数据会先从Redis读取,缓存中的数据只有在不存在的情况下才会从数据库中获取,从数据库中获取的数据会写入Redis.相反,在写入数据时,先清除Redis,缓存的数据,再将数据写入数据库。如果是简单的数据,可以实时写入Redis进行读取操作。如果是需要多表查询的数据,可以暂时不写入Redis,有查询操作时再写入Redis。
如果是高并发情况呢?在高并发的情况下,读取数据的操作同上,首选从Redis读取。然而,写数据的操作与刚才不同。在高并发的情况下,写入数据首先写入Redis,然后定期从Redis写入Mysql.在高并发的情况下,应该注意的是,每个读取数据的请求都需要在超时期限内返回数据。如果数据更新频繁,可能会导致Redis,出现一系列更新操作,导致大量读取数据请求超时。最后,所有这些读取数据的请求都被压到数据库中,这将导致缓存崩溃的现象,这可能会严重导致数据库宕机。此时,该解决方案通常通过添加机器来增加吞吐量,或者先将旧数据暂时返回给客户端。所以这里我们其实有一个非常明确的计划。常见的方案有两种:Redis做缓存服务器,一般做缓存有两个目的:快速处理请求,降低I/O.的频率降低I/O的频率其实就是在刚才提到的高并发的情况下,将数据实时写入数据库,然后将数据积累到一定程度,定期写入数据库。请求的快速处理意味着在处理读请求时来自Redis的访问受限。Redis支持高并发操作。因此,处理速度非常快。如果Redis,中没有数据,请在数据库中查询它,然后将其写入redis,的缓存中,以便可以直接从缓存中检索数据进行二次读取。事实上,第二种方案是异步缓存。Redis缓存热门数据,所有的增删查操作都在Mysql.只要Mysql在insert,updatedelete,kafka-related有操作就可以通过rabbitMQ或binlog等第三方消息推送工具将消息推送到Redis,分析http://www . Sina.com/http://www . Sina.com/中的数据更新Rediscache中的数据,并在http://8中建立主从备份机制
这是对Redis和上面边肖共享的数据库数据之间的一致性的示例分析。如果你恰好也有类似的疑惑,可以参考上面的分析来理解。想了解更多,请关注行业信息渠道。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/129605.html