1. 写在前头
大家好,我是方圆
。从这篇博客儿开始就是对秒杀系统进行逐步优化。
先进行缓存的设计,我想把它写成多篇,分别对应本地缓存
、分布式缓存
、库存的缓存
、缓存的更新
,逐步完善,条理也更加清晰。 本篇对应本地缓存,代码改动最终以increase_local_cache分支
为准,它是在base_function分支上进行开发的,另请注意库存的缓存没在此处涉及,在以后单独放一篇来讲解。
缓存生效的整体流程如图所示:
- 读取缓存的顺序:本地缓存,分布式缓存,数据库
- 注意其中的
分布式锁
,在查询数据库前要拿到它,避免数据库压力过大。但是《高并发秒杀的设计精要与实现》这本书在更新本地缓存时使用了ReentrantLock限制本地缓存的并发更新,我不明白其中的道理,一是觉得分布式锁已经将冲击数据库的流量限制住了,二是本地缓存Cache基于ConcurrentHashMap实现,支持并发操作,所以我觉得本地缓存更新时可以考虑将锁去掉,只让分布式锁生效即可。