缓存并发问题

来源:11-5 缓存-高并发场景问题讲解

zhusx

2018-08-30

课程中缓存并发采用锁的方式,想问下锁是加在哪个位置。

假如有100个请求同时进来,

如果是加在查询缓存之后,那所有请求还是会到达数据库,

如果是加在查询缓存之前,那会不会有性能上的问题。

写回答

1回答

Jimin

2018-08-30

你好,如果加锁,要加在查询缓存之后。这里的锁根本上是加在:当发现数据为空时,查询数据库及更新缓存上。在拿到锁后,再查一下缓存看是否为空,为空才实际去查数据库。这样接可以保证数据库只被查询一次。

实际中,加锁确实会带来性能上的问题,但如果你的出发点是防止所有请求达到数据库的话,必要的性能损失也是值得的。因为项目中最珍贵的资源永远是DB,DB在横向扩展的难度远远高于我们的机器、缓存组件等等。我们引入缓存等的根本也是减轻DB的压力。

当然,加锁只是解决缓存并发的一种手段,还可以缓存空值或其他缓存为空的默认替代值(甚至异常)。但这不是随便返回的,需要和上游服务沟通好,返回某些值的时候,需要他们进行重试。然后这边加上某些机制,比如消息队列等,去异步更新缓存。

可选的手段很多,关键是符合自己场景,然后和自己的上下游选择,选择总体代价尽量低的。

0
0

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程