先看业务,业务是不是需要强一致:
弱一致:缓存设定过期时间,过期后自动从db中更新缓存;
强一致:使用分布式锁;
1、线程A先对该key加上分布式锁(锁一定要设置过期时间!!!)
2、线程A删除缓存
(其他线程在查询到缓存数据为空时,尝试去获取分布式锁,获取不到锁,说明有线程正在更新缓存数据,则等待锁或者直接查询数据库)
3、线程A更新数据库
4、线程A更新缓存
5、线程A解锁(如果是redis分布式锁,那么谁加的锁谁来解,使用lua先判断是不是自己加的,然后删除锁)
分布式锁:
1、redis:性能好,redis主从架构本身也存在数据一致性问题
2、zookeeper:大量并发情况下,性能会成为瓶颈