作者:微信小助手
发布时间:2023-10-12T21:41:22
本篇主要内容如下: 首先我们来回顾下本地锁的问题: 目前题目微服务被拆分成了四个微服务。前端请求进来时,会被转发到不同的微服务。假如前端接收了 10 W 个请求,每个微服务接收 2.5 W 个请求,假如缓存失效了,每个微服务在访问数据库时加锁,通过锁( 这是一种 基于上面本地锁的问题,我们需要一种支持分布式集群环境下的锁:查询 DB 时,只有一个线程能访问,其他线程都需要等待第一个线程释放锁资源后,才能继续执行。 生活中的案例:可以把锁看成房门外的一把 我们来看下分布式锁的基本原理,如下图所示: 我们来分析下上图的分布式锁: 大白话解释:所有请求的线程都去同一个地方本地加锁
的方式在分布式的场景下不适用,所以本文我们来探讨下如何引入分布式锁
解决本地锁的问题。本篇所有代码和业务基于我的开源项目 PassJava。
一、本地锁的问题
synchronzied
或 lock
)来锁住自己的线程资源,从而防止缓存击穿
。本地加锁
的方式,在分布式
情况下会带来数据不一致的问题:比如服务 A 获取数据后,更新缓存 key =100,服务 B 不受服务 A 的锁限制,并发去更新缓存 key = 99,最后的结果可能是 99 或 100,但这是一种未知的状态,与期望结果不一致。流程图如下所示:
二、什么是分布式锁
锁
,所有并发线程比作人
,他们都想进入房间,房间内只能有一个人进入。当有人进入后,将门反锁,其他人必须等待,直到进去的人出来。
“占坑”
,如果有坑位,就执行业务逻辑,没有坑位,就需要其他线程释放“坑位”。这个坑位是所有线程可见的,可以把这个坑位放到 Redis 缓存或者数据库,这篇讲的就是如何用 Redis 做