**问题描述:**多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了。或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了。 我个人认为比较好的方案是分布式锁+时间戳: **1.整体技术方案** 这种情况,主要是准备一个分布式锁,大家去抢锁,加锁的目的实际上就是把并行读写改成串行读写的方式,从而来避免资源竞争。利用SETNX非常简单地实现分布式锁。 **2.时间戳** 由于key的操作需要顺序执行,所以需要保存一个时间戳判断顺序。假设系统B先抢到锁,将key1设置为{ValueB 7:05}。接下来系统A抢到锁,发现自己的key1的时间戳早于缓存中的时间戳(7:00<=7:05),那就不做set操作了。 **3.什么是分布式锁** 分布式锁可以基于很多种方式实现,比如zookeeper、redis等,不管哪种方式实现,基本原理是不变的:用一个状态值表示锁,对锁的占用和释放通过状态值来标识。 **保证缓存与数据库双写时的数据一致性** 可能对大部分来说最先想到的方案就是读请求和写请求串行化,串到一个内存队列里去。但是这个方案有着特别大的缺点:它也会导致系统的吞吐量大幅度降低,用比正常情况下多几倍的机器去支撑线上的一个请求。 **最经典的缓存+数据库读写的模式。** 读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。 更新的时候,先更新数据库,然后再删除缓存。