场景1:预防崩溃
高并发下使用锁机制解决服务器崩溃问题,虽然不是一个好方法,但绝对是一个可行的策略。
在并发的多个请求中,只有第一个请求线程能拿到锁并执行数据库查询操作,其他的线程拿不到锁就阻塞等着,等到第一个线程将数据写入缓存后,直接走缓存。
关于互斥锁的选择,网上看到的大部分文章都是选择 Redis 分布式锁,
但是其实仔细想想的话,这边其实没有必要保证只有一个请求走到数据库,只要保证走到数据库的请求能大大降低即可,所以还有另一个思路是 JVM 锁。JVM 锁保证了在单台服务器上只有一个请求走到数据库,通常来说已经足够保证数据库的压力大大降低,同时在性能上比分布式锁更好。
场景2:并发问题
这里的并发问题指的是:并发场景下数据读写带来的问题。
在分布式场景下由于多台主机共用同一数据库资源,此时必须使用更高层次的锁来解决并发数据问题,这里必须使用分布式锁。
锁的设计
无论是使用“分布式锁”,还是“JVM 锁”,加锁时要按 key 维度去加锁。
是使用一个“固定的 key”加锁,这样会导致不同的 key 之间也会互相阻塞,造成性能严重损耗。