置顶
type
status
slug
summary
tags
category
icon
password
URL
date
不论是先改数据库还是先改Redis都会遇到数据不一致的问题,不可能完全解决
- 先改Redis
先改Redis,然后异步刷新MySQL。如果MySQL更新失败,事务回滚,会出现数据不一致。可以做异常回调,出现异常再去将Redis改回。
- 先改MySQL
- 先改MySQL,然后刷新Redis。Redis刷新前存在短暂不一致。
- 先删缓存,再改MySQL,再存入缓存,删除后,另一个读线程进来,又将旧数据读入缓存,脏数据
- 延时删缓存,写库前后都进行redis.del(key)操作,并且设定合理的超时时间。性能低
- 利用队列异步更新缓存
读取数据在Redis,增删改在MySQL
MySQL binlog增量订阅消费+消息队列+增量数据更新到redis
MySQL中产生了新的写入、更新、删除等操作,就把binlog相关的消息推送至Redis,Redis再根据binlog中的记录,对Redis进行更新。很类似MySQL的主从复制机制,因为MySQL的主备也是通过binlog来实现的数据一致性。
CAP中的CA是需要有取舍的 (C一致性、A可用性、P分区容错性)
要保证高正高可用,那么强一致性的要求就要降低。
要保证强一致性,那么性能就会大幅下降
对于Redis和MySQL的数据一致性来说,在不同的场景下选择不同的策略,对于强一致性的保证可以参考
参考链接: