缓存并发问题
来源:11-5 缓存-高并发场景问题讲解
zhusx
2018-08-30
课程中缓存并发采用锁的方式,想问下锁是加在哪个位置。
假如有100个请求同时进来,
如果是加在查询缓存之后,那所有请求还是会到达数据库,
如果是加在查询缓存之前,那会不会有性能上的问题。
写回答
1回答
-
你好,如果加锁,要加在查询缓存之后。这里的锁根本上是加在:当发现数据为空时,查询数据库及更新缓存上。在拿到锁后,再查一下缓存看是否为空,为空才实际去查数据库。这样接可以保证数据库只被查询一次。
实际中,加锁确实会带来性能上的问题,但如果你的出发点是防止所有请求达到数据库的话,必要的性能损失也是值得的。因为项目中最珍贵的资源永远是DB,DB在横向扩展的难度远远高于我们的机器、缓存组件等等。我们引入缓存等的根本也是减轻DB的压力。
当然,加锁只是解决缓存并发的一种手段,还可以缓存空值或其他缓存为空的默认替代值(甚至异常)。但这不是随便返回的,需要和上游服务沟通好,返回某些值的时候,需要他们进行重试。然后这边加上某些机制,比如消息队列等,去异步更新缓存。
可选的手段很多,关键是符合自己场景,然后和自己的上下游选择,选择总体代价尽量低的。
00
相似问题