阿里巴巴 商城网站怎么做中国建设会计学网站
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:00
当前位置: 首页 > news >正文
阿里巴巴 商城网站怎么做,中国建设会计学网站,腾讯云服务器收费标准,做电影资源网站手机版介绍分布式锁#xff0c;我觉得从项目的背景入手把
在伙伴匹配系统中#xff0c;我创建了一个定时任务#xff0c;做为缓存预热的手段
这个具体原因在Redis-CSDN博客
接下来切入正题#xff1a;
想象每个服务器都有一个定时任务#xff0c;都要对数据库或者缓存进行操…介绍分布式锁我觉得从项目的背景入手把
在伙伴匹配系统中我创建了一个定时任务做为缓存预热的手段
这个具体原因在Redis-CSDN博客
接下来切入正题
想象每个服务器都有一个定时任务都要对数据库或者缓存进行操作
这会带来什么问题
1首先最先想到的肯定是资源浪费
2其次如果我这个定时任务是一个插入操作那是不是会导致数据库或者缓存有很多的重复数据
再或者是一个修改操作那肯定会造成结果不唯一的错误 那知道了问题我们就要去想怎么解决
解决办法
其实这个问题有点像操作系统中的临界区的问题
如果学过操作系统应该就很容易想到锁
讲到了锁那这个锁是一般的锁能锁得住嘛
锁
Java 实现锁synchronized 关键字这个在学习线程的时候学习过很容易理解
不过有个问题这个synchronized是只对一个JVM有效
我们这里的项目场景可以用这个方法解决嘛
显然不行因为你一个synchronized只能锁住一个服务器有多个服务器同时操作你还是没有办法
接下来就引出
分布式锁
但是分布式锁这个东西需要考虑的点有很多
分布式锁的注意事项
用完锁要释放腾地方锁一定要加过期时间 如果方法执行时间过长锁提前过期了连锁效应释放掉别人的锁这样还是会存在多个方法同时执行的情况
解决方案续期看门狗机制
分布式锁概述
处理多个并发操作的情况确保在分布式系统中的不同节点不同服务器上对共享资源的访问是有序的和安全的
什么意思呢
有一个房间数据库有三台服务器ABC他们都有这个定时任务想要进去操作数据库
我们规定ABC三个服务器需要抢夺一把锁抢到的才能进入进去之后并且还需要锁上门
这就和Java多线程很像。
分布式锁的实现
说了这么多我们应该怎么保证同一时间只有一个服务器能抢到锁呢
核心思想
先来的人先把数据改成自己的标识服务器 ip后来的人发现标识已存在就抢锁失败继续等待。
等先来的人执行方法结束把标识清空其他的人继续抢锁 下面介绍Redis实现分布式锁我只会这个等以后会得多了再来补充把
分布式锁的实现Redis
主要是基于命令SETNX key value
塞滕克斯 |文档 — SETNX | Docs (redis.io)
redis SETNX mykey Hello
(integer) 1
redis SETNX mykey World
(integer) 0
redis GET mykey
Hello
用了setnx将mykeykey设置为Hellovalue之后不允许再更改了
更改会返回0。
当然如果我们直接用setnx命令去操作就很麻烦就介绍下面这一个方法
Redisson 实现分布式锁
Redisson 是一个 java 操作 Redis 的客户端提供了大量的分布式数据集来简化对 Redis 的操作和使用可以让开发者像使用本地集合一样使用 Redis完全感知不到 Redis 的存在。
还是贴一个官方文档
https://github.com/redisson/redisson#quick-start
1引入依赖
dependencygroupIdorg.redisson/groupIdartifactIdredisson/artifactIdversion3.32.0/version
/dependency
2配置
package com.usercenter.usercenterproject.config;/*
Redission的配置*/import lombok.Data;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;Configuration
ConfigurationProperties
Data
public class RedissionConfiguration {private String host;private String port;Beanpublic RedissonClient redissonClient(){// 1. Create config objectConfig config new Config();String address String.format(redis://127.0.0.1:6379);config.useSingleServer().setAddress(address).setDatabase(3);// 2. Create Redisson instance// Sync and Async APIRedissonClient redisson Redisson.create(config);return redisson;}}这段直接复制官方文档改一下地址就行。
还需要配置成单机模式config.useSingleServer()
3:Redisson得使用
a.获取锁对象getLock
final RLock lock redissonClient.getLock(shayu:user:recommend:lock);
b.尝试获取锁的操作tryLock
lock.tryLock(0,-1,TimeUnit.MILLISECONDS)
tryLock 方法会立即返回 false表示获取锁失败
而当锁可用时则尝试获取锁并返回 true表示成功获取锁。 tryLock这个方法有三个参数 waitTime等待时间即尝试获取锁的最大等待时间。这个参数表示在尝试获取锁时最多愿意等待的时间长度单位可以是毫秒或者其他时间单位。如果在等待时间内未能成功获取锁则 tryLock 方法会返回 false。这个得意思就是其它没有拿到这个锁得服务器他们不能一直等待等过了这个waitTime之后就会放弃抢锁这里的waitTime可以设置为0因为我们这个定时任务只要有一个服务器获取了其它服务器就不能再操作了 leaseTime租约时间表示获取锁成功后的租约时长。这个参数指定了成功获取锁后的持有时间长度即锁的有效期单位也可以是毫秒或其他时间单位。当锁的持有时间达到租约时长后系统会自动释放锁。表示这个获得锁的服务器的最长拥有时间过了这个拥有时间这个服务器就必须释放锁这个leaseTime这里设置为-1这是因为后面的看门狗机制 unit时间单位用于指定 waitTime 和 leaseTime 的时间单位可以是 TimeUnit 中预定义的时间单位例如 TimeUnit.MILLISECONDS 表示毫秒。这个参数用于确保 waitTime 和 leaseTime 的时间粒度符合需求。
c.释放锁unlock()
获取锁之后一定要释放
还有一个点在释放锁之前要确认一下是否是自己的锁lock.isHeldByCurrentThread() finally {if(lock.isHeldByCurrentThread()){System.out.println(unlockThread.currentThread().getId());lock.unlock();}}
可以将释放锁这段代码放在finally因为创建锁需要捕获异常如果不在finally中释放就可以会发生这个锁一直存在这种现象。
Redisson的看门狗机制
我们设想一个场景假设一台服务器获取了锁之后要往数据库中插入数据全部插入完的时间是30ms不过锁的过期时间是20ms那这样就会发生问题
我操作还没做完这个锁就过期了这怎么行。
所以Redisson的看门狗机制就可以解决这个问题
这个机制可以自动延长锁的过期时间只要你不释放锁就会一直延长
如何启动这个看门狗机制呢
只要在tryLock的realseTime中传入-1就可以启动Redisson的看门狗机制。
相关文章
-
阿里 设计网站建设做网站需要具备哪些条件
阿里 设计网站建设做网站需要具备哪些条件
- 技术栈
- 2026年03月21日
-
阿里 建设网站东莞网站如何制作
阿里 建设网站东莞网站如何制作
- 技术栈
- 2026年03月21日
-
阿狸网站建设北京公司注册核名网站
阿狸网站建设北京公司注册核名网站
- 技术栈
- 2026年03月21日
-
阿里巴巴国际贸易网站官网张家港网站设计制作早晨设计
阿里巴巴国际贸易网站官网张家港网站设计制作早晨设计
- 技术栈
- 2026年03月21日
-
阿里巴巴国际站开店流程及费用我想建立一个网站不知道怎么做啊
阿里巴巴国际站开店流程及费用我想建立一个网站不知道怎么做啊
- 技术栈
- 2026年03月21日
-
阿里巴巴国际站入口网络技术公司
阿里巴巴国际站入口网络技术公司
- 技术栈
- 2026年03月21日






