From 06acdd653bf6224ef34fe6d7772287c3a0af1751 Mon Sep 17 00:00:00 2001 From: lhd <839347550@qq.com> Date: Mon, 5 Jan 2026 11:30:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8F=E9=94=81.md?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/基本框架设计/分布式锁.md | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/doc/基本框架设计/分布式锁.md b/doc/基本框架设计/分布式锁.md index 2795056..d15988c 100644 --- a/doc/基本框架设计/分布式锁.md +++ b/doc/基本框架设计/分布式锁.md @@ -1,25 +1,10 @@ -在小程序登陆的时候,在`MiniAppAuthenticationProvider`中我们看到这样一行代码 - -```java -yamiUserDetailsService.insertUserIfNecessary(appConnect); -``` - -这便是商城用户创建的代码,在`YamiUserServiceImpl#insertUserIfNecessary()`方法中,有一个这样的注解 - -```java -@RedisLock(lockName = "insertUser", key = "#appConnect.appId + ':' + #appConnect.bizUserId") -``` - -这里便用了分布式锁,为什么我们要在这里使用锁?分布式锁又是什么? - -- 由于用户是通过登录直接注册的,如果一个用户在不刻意之间,又或者前端写的东西有点问题,这就会导致整个系统创建了两个相同的用户,这是非常危险的事情,所以创建用户这里必须加锁。 -- 至于为什么使用分布式锁,是因为我们虽然没有用上spring cloud、dubbo之类的东西,实际上我们也是希望我们的商城可以多实例部署的,也就是可以搞分布式的。因此用了分布式锁 +## 实现一个简单的分布式锁注解 分布式锁,简单来说就是锁,而且还是适合分布式环境的。分布式说起来也很奇怪,要是有什么不能共享的东西,那就抽出来共享。比如本地数据缓存不能共享,那么就抽出一个如redis之类的东西,进行共享。session不能共享,那么就将session抽出来,丢到redis之类的东西,又能共享了。 锁不能共享,同样可以丢一个标记到redis,由于redis是单线程的,所以也不用担心redis的线程安全的问题。这个标记就是一个锁的标记,那样你就实现了分布式锁... -我们看回`@RedisLock` 该类,里面有个`expire()`方法 +我们看`@RedisLock` 该类,里面有个`expire()`方法 ```java /** @@ -32,7 +17,6 @@ yamiUserDetailsService.insertUserIfNecessary(appConnect); 由于网络稳定、宕机等各种原因,分布式锁,必须要有过期时间,否则锁无法释放的话,会阻塞一片的实例。 -## 实现一个简单的分布式锁注解 由于自己去实现redis的分布式锁,是比较困难的问题,还要考虑redis复制,宕机之类的问题,所以我们使用一个比较优秀的开源项目 **redisson**来实现我们的分布式锁