Redis用来作为应用和数据库之间的缓存层,主要目的是为了减少数据的IO,提升IO性能。当应用程序需要读取某个数据时,会先从Redis去查询,如果命中则把数据返回,否则再查询数据库,查询到数据后再把数据缓存到Redis中。
在这样的架构中,数据会同时存储在Redis和数据库中,当数据发生变化时,Redis和数据库需要同步更新,由于更新数据是有先后的,所以会出现数据一致性问题。
在这种情况下,能够选择的方法有两种:
- 先更新数据库,再更新缓存
- 先更新缓存,再更新数据库
无论选择哪种方法,由于两个操作不是原子的,都会出现一方失败导致的数据不一致问题。
数据最终一致性
如果能接受短期的数据不一致的情况,那么我们可以采用最终一致性方案,比如基于MQ的可靠性消息来实现最终一致性。比如:当先更新数据库成功后,再更新Redis的缓存失败时,我们将失败的请求写入MQ,通过异步重试机制确保Redis更新成功。
实时强一致性
如果一定要保证实时强一致性,则需要对两个操作加锁,当数据库和Redis同步更新成功后再释放锁,其中一方更新失败,则将所有操作回滚。