当前位置: 首页 > news >正文

Redisson分布式锁和同步器详解-官方原版

一、锁定

基于Redis的Java分布式可重入锁对象,并实现了锁接口。

如果获取锁的Redisson实例崩溃,则此类锁可能会在获取状态下永久挂起。为了避免这种Redisson维护锁看门狗,当锁持有者Redisson实例处于活动状态时,它会延长锁的到期时间。默认情况下,锁看门狗超时为30秒,可以通过Config.lockWatchdogTimeout设置进行更改。

可以定义锁获取期间的leaseTime参数。在指定的时间间隔后,锁定的锁将自动释放。

RLock对象的行为符合Java Lock规范。这意味着只有锁所有者线程才能解锁它,否则将引发IllegalMonitorStateException。否则,请考虑使用RSemaphore对象。

代码示例:

RLock lock = redisson.getLock("myLock");// traditional lock method
lock.lock();// or acquire lock and automatically unlock it after 10 seconds
lock.lock(10, TimeUnit.SECONDS);// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
if (res) {try {...} finally {lock.unlock();}
}

异步接口用法的代码示例:

RLock lock = redisson.getLock("myLock");RFuture<Void> lockFuture = lock.lockAsync();// or acquire lock and automatically unlock it after 10 seconds
RFuture<Void> lockFuture = lock.lockAsync(10, TimeUnit.SECONDS);// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
RFuture<Boolean> lockFuture = lock.tryLockAsync(100, 10, TimeUnit.SECONDS);lockFuture.whenComplete((res, exception) -> {// ...lock.unlockAsync();
});

反应式接口用法的代码示例:

RedissonReactiveClient redisson = redissonClient.reactive();
RLockReactive lock = redisson.getLock("myLock");Mono<Void> lockMono = lock.lock();// or acquire lock and automatically unlock it after 10 seconds
Mono<Void> lockMono = lock.lock(10, TimeUnit.SECONDS);// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
Mono<Boolean> lockMono = lock.tryLock(100, 10, TimeUnit.SECONDS);lockMono.doOnNext(res -> {// ...
})
.doFinally(lock.unlock())
.subscribe();

RxJava3 接口使用的代码示例:

RedissonRxClient redisson = redissonClient.rxJava();
RLockRx lock = redisson.getLock("myLock");Completable lockRes = lock.lock();// or acquire lock and automatically unlock it after 10 seconds
Completable lockRes = lock.lock(10, TimeUnit.SECONDS);// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
Single<Boolean> lockRes = lock.tryLock(100, 10, TimeUnit.SECONDS);lockRes.doOnSuccess(res -> {// ...
})
.doFinally(lock.unlock())
.subscribe();

二、公平锁定

基于Redis的分布式可重入公平Java锁对象实现了锁接口。

公平锁保证线程将按照请求的顺序获取它。所有等待的线程都将排队,如果某个线程已死亡,Redisson将等待其返回5秒。例如,如果5个线程由于某种原因而死亡,那么延迟将为25秒。

如果获取锁的Redisson实例崩溃,则此类锁可能会在获取状态下永久挂起。为了避免这种Redisson维护锁看门狗,当锁持有者Redisson实例处于活动状态时,它会延长锁的到期时间。默认情况下,锁看门狗超时为30秒,可以通过Config.lockWatchdogTimeout设置进行更改。

可以定义锁获取期间的leaseTime参数。在指定的时间间隔后,锁定的锁将自动释放。

RLock对象的行为符合Java Lock规范。这意味着只有锁所有者线程才能解锁它,否则将引发IllegalMonitorStateException。否则,请考虑使用RSemaphore对象。

代码示例:

RLock lock = redisson.getFairLock("myLock");// traditional lock method
lock.lock();// or acquire lock and automatically unlock it after 10 seconds
lock.lock(10, TimeUnit.SECONDS);// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
if (res) {try {...} finally {lock.unlock();}
}

异步接口用法的代码示例:

RLock lock = redisson.getFairLock("myLock");RFuture<Void> lockFuture = lock.lockAsync();// or acquire lock and automatically unlock it after 10 seconds
RFuture<Void> lockFuture = lock.lockAsync(10, TimeUnit.SECONDS);// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
RFuture<Boolean> lockFuture = lock.tryLockAsync(100, 10, TimeUnit.SECONDS);lockFuture.whenComplete((res, exception) -> {// ...lock.unlockAsync();
});

Reactive接口 用法的代码示例:

RedissonReactiveClient redisson = redissonClient.reactive();
RLockReactive lock = redisson.getFairLock("myLock");Mono<Void> lockMono = lock.lock();// or acquire lock and automatically unlock it after 10 seconds
Mono<Void> lockMono = lock.lock(10, TimeUnit.SECONDS);// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
Mono<Boolean> lockMono = lock.tryLock(100, 10, TimeUnit.SECONDS);lockMono.doOnNext(res -> {// ...
})
.doFinally(lock.unlock())
.subscribe();

RxJava3 接口使用的代码示例:

RedissonRxClient redisson = redissonClient.rxJava();
RLockRx lock = redisson.getFairLock("myLock");Completable lockRes = lock.lock();// or acquire lock and automatically unlock it after 10 seconds
Completable lockRes = lock.lock(10, TimeUnit.SECONDS);// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
Single<Boolean> lockRes = lock.tryLock(100, 10, TimeUnit.SECONDS);lockRes.doOnSuccess(res -> {// ...
})
.doFinally(lock.unlock())
.subscribe();

三、多重锁

基于Redis的分布式MultiLock对象允许将Lock对象分组,并将其作为单个锁处理。每个RLock对象可能属于不同的Redisson实例。

如果获取MultiLock的Redisson实例崩溃,那么这样的MultiLock可能会永远挂在获取状态。为了避免这种Redisson维护锁看门狗,当锁持有者Redisson实例处于活动状态时,它会延长锁的到期时间。默认情况下,锁看门狗超时为30秒,可以通过Config.lockWatchdogTimeout设置进行更改。

可以定义锁获取期间的leaseTime参数。在指定的时间间隔后,锁定的锁将自动释放。

MultiLock对象的行为符合Java Lock规范。这意味着只有锁所有者线程才能解锁它,否则将引发IllegalMonitorStateException。否则,请考虑使用RSemaphore对象。

代码示例:

RLock lock1 = redisson1.getLock("lock1");
RLock lock2 = redisson2.getLock("lock2");
RLock lock3 = redisson3.getLock("lock3");RLock multiLock = anyRedisson.getMultiLock(lock1, lock2, lock3);// traditional lock method
multiLock.lock();// or acquire lock and automatically unlock it after 10 seconds
multiLock.lock(10, TimeUnit.SECONDS);// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
boolean res = multiLock.tryLock(100, 10, TimeUnit.SECONDS);
if (res) {try {...} finally {multiLock.unlock();}
}

异步接口用法的代码示例:

RLock lock1 = redisson1.getLock("lock1");
RLock lock2 = redisson2.getLock("lock2");
RLock lock3 = redisson3.getLock("lock3");RLock multiLock = anyRedisson.getMultiLock(lock1, lock2, lock3);RFuture<Void> lockFuture = multiLock.lockAsync();// or acquire lock and automatically unlock it after 10 seconds
RFuture<Void> lockFuture = multiLock.lockAsync(10, TimeUnit.SECONDS);// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
RFuture<Boolean> lockFuture = multiLock.tryLockAsync(100, 10, TimeUnit.SECONDS);lockFuture.whenComplete((res, exception) -> {// ...multiLock.unlockAsync();
});

反应式接口用法的代码示例:

RedissonReactiveClient anyRedisson = redissonClient.reactive();RLockReactive lock1 = redisson1.getLock("lock1");
RLockReactive lock2 = redisson2.getLock("lock2");
RLockReactive lock3 = redisson3.getLock("lock3");RLockReactive multiLock = anyRedisson.getMultiLock(lock1, lock2, lock3);Mono<Void> lockMono = multiLock.lock();// or acquire lock and automatically unlock it after 10 seconds
Mono<Void> lockMono = multiLock.lock(10, TimeUnit.SECONDS);// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
Mono<Boolean> lockMono = multiLock.tryLock(100, 10, TimeUnit.SECONDS);lockMono.doOnNext(res -> {// ...
})
.doFinally(multiLock.unlock())
.subscribe();

RxJava3 接口使用的代码示例:

RedissonRxClient anyRedisson = redissonClient.rxJava();RLockRx lock1 = redisson1.getLock("lock1");
RLockRx lock2 = redisson2.getLock("lock2");
RLockRx lock3 = redisson3.getLock("lock3");RLockRx multiLock = anyRedisson.getMultiLock(lock1, lock2, lock3);Completable lockRes = multiLock.lock();// or acquire lock and automatically unlock it after 10 seconds
Completable lockRes = multiLock.lock(10, TimeUnit.SECONDS);// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
Single<Boolean> lockRes = multiLock.tryLock(100, 10, TimeUnit.SECONDS);lockRes.doOnSuccess(res -> {// ...
})
.doFinally(multiLock.unlock())
.subscribe();

四、读写锁定

基于Redis的Java分布式可重入读写锁对象实现了读写锁接口。读和写锁都实现RLock接口。

只允许有多个ReadLock所有者和一个WriteLock所有者。

如果获取锁的Redisson实例崩溃,则此类锁可能会在获取状态下永久挂起。为了避免这种Redisson维护锁看门狗,当锁持有者Redisson实例处于活动状态时,它会延长锁的到期时间。默认情况下,锁看门狗超时为30秒,可以通过Config.lockWatchdogTimeout设置进行更改。

此外,Redisson允许在获取锁期间指定leaseTime参数。在指定的时间间隔后,锁定的锁将自动释放。

RLock对象的行为符合Java Lock规范。这意味着只有锁所有者线程才能解锁它,否则将引发IllegalMonitorStateException。否则,请考虑使用RSemaphore对象。

代码示例:

RReadWriteLock rwlock = redisson.getReadWriteLock("myLock");RLock lock = rwlock.readLock();
// or
RLock lock = rwlock.writeLock();// traditional lock method
lock.lock();// or acquire lock and automatically unlock it after 10 seconds
lock.lock(10, TimeUnit.SECONDS);// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
if (res) {try {...} finally {lock.unlock();}
}

异步接口用法的代码示例:

RReadWriteLock rwlock = redisson.getReadWriteLock("myLock");RLock lock = rwlock.readLock();
// or
RLock lock = rwlock.writeLock();RFuture<Void> lockFuture = lock.lockAsync();// or acquire lock and automatically unlock it after 10 seconds
RFuture<Void> lockFuture = lock.lockAsync(10, TimeUnit.SECONDS);// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
RFuture<Boolean> lockFuture = lock.tryLockAsync(100, 10, TimeUnit.SECONDS);lockFuture.whenComplete((res, exception) -> {// ...lock.unlockAsync();
});

反应式接口用法的代码示例:

RedissonReactiveClient redisson = redissonClient.reactive();RReadWriteLockReactive rwlock = redisson.getReadWriteLock("myLock");RLockReactive lock = rwlock.readLock();
// or
RLockReactive lock = rwlock.writeLock();Mono<Void> lockMono = lock.lock();// or acquire lock and automatically unlock it after 10 seconds
Mono<Void> lockMono = lock.lock(10, TimeUnit.SECONDS);// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
Mono<Boolean> lockMono = lock.tryLock(100, 10, TimeUnit.SECONDS);lockMono.doOnNext(res -> {// ...
})
.doFinally(lock.unlock())
.subscribe();

RxJava3 接口使用的代码示例:

RedissonRxClient redisson = redissonClient.rxJava();RReadWriteLockRx rwlock = redisson.getReadWriteLock("myLock");RLockRx lock = rwlock.readLock();
// or
RLockRx lock = rwlock.writeLock();Completable lockRes = lock.lock();// or acquire lock and automatically unlock it after 10 seconds
Completable lockRes = lock.lock(10, TimeUnit.SECONDS);// or wait for lock aquisition up to 100 seconds 
// and automatically unlock it after 10 seconds
Single<Boolean> lockRes = lock.tryLock(100, 10, TimeUnit.SECONDS);lockRes.doOnSuccess(res -> {// ...
})
.doFinally(lock.unlock())
.subscribe();

五、信号量

基于Redis的分布式Java信号量对象,类似于信号量对象。

可以在使用前初始化,但这不是必需的,通过trySetPermissions(permissions)方法获得可用的许可量。

代码示例:

RSemaphore semaphore = redisson.getSemaphore("mySemaphore");// acquire single permit
semaphore.acquire();// or acquire 10 permits
semaphore.acquire(10);// or try to acquire permit
boolean res = semaphore.tryAcquire();// or try to acquire permit or wait up to 15 seconds
boolean res = semaphore.tryAcquire(15, TimeUnit.SECONDS);// or try to acquire 10 permit
boolean res = semaphore.tryAcquire(10);// or try to acquire 10 permits or wait up to 15 seconds
boolean res = semaphore.tryAcquire(10, 15, TimeUnit.SECONDS);
if (res) {try {...} finally {semaphore.release();}
}

异步接口用法的代码示例:

RSemaphore semaphore = redisson.getSemaphore("mySemaphore");// acquire single permit
RFuture<Void> acquireFuture = semaphore.acquireAsync();// or acquire 10 permits
RFuture<Void> acquireFuture = semaphore.acquireAsync(10);// or try to acquire permit
RFuture<Boolean> acquireFuture = semaphore.tryAcquireAsync();// or try to acquire permit or wait up to 15 seconds
RFuture<Boolean> acquireFuture = semaphore.tryAcquireAsync(15, TimeUnit.SECONDS);// or try to acquire 10 permit
RFuture<Boolean> acquireFuture = semaphore.tryAcquireAsync(10);// or try to acquire 10 permits or wait up to 15 seconds
RFuture<Boolean> acquireFuture = semaphore.tryAcquireAsync(10, 15, TimeUnit.SECONDS);acquireFuture.whenComplete((res, exception) -> {// ...semaphore.releaseAsync();
});

反应式接口用法的代码示例:

RedissonReactiveClient redisson = redissonClient.reactive();RSemaphoreReactive semaphore = redisson.getSemaphore("mySemaphore");// acquire single permit
Mono<Void> acquireMono = semaphore.acquire();// or acquire 10 permits
Mono<Void> acquireMono = semaphore.acquire(10);// or try to acquire permit
Mono<Boolean> acquireMono = semaphore.tryAcquire();// or try to acquire permit or wait up to 15 seconds
Mono<Boolean> acquireMono = semaphore.tryAcquire(15, TimeUnit.SECONDS);// or try to acquire 10 permit
Mono<Boolean> acquireMono = semaphore.tryAcquire(10);// or try to acquire 10 permits or wait up to 15 seconds
Mono<Boolean> acquireMono = semaphore.tryAcquire(10, 15, TimeUnit.SECONDS);acquireMono.doOnNext(res -> {// ...
})
.doFinally(semaphore.release())
.subscribe();

RxJava3 接口使用的代码示例:

RedissonRxClient redisson = redissonClient.rxJava();RSemaphoreRx semaphore = redisson.getSemaphore("mySemaphore");// acquire single permit
Completable acquireRx = semaphore.acquire();// or acquire 10 permits
Completable acquireRx = semaphore.acquire(10);// or try to acquire permit
Single<Boolean> acquireRx = semaphore.tryAcquire();// or try to acquire permit or wait up to 15 seconds
Single<Boolean> acquireRx = semaphore.tryAcquire(15, TimeUnit.SECONDS);// or try to acquire 10 permit
Single<Boolean> acquireRx = semaphore.tryAcquire(10);// or try to acquire 10 permits or wait up to 15 seconds
Single<Boolean> acquireRx = semaphore.tryAcquire(10, 15, TimeUnit.SECONDS);acquireRx.doOnSuccess(res -> {// ...
})
.doFinally(semaphore.release())
.subscribe();

相关文章:

Redisson分布式锁和同步器详解-官方原版

一、锁定基于Redis的Java分布式可重入锁对象&#xff0c;并实现了锁接口。如果获取锁的Redisson实例崩溃&#xff0c;则此类锁可能会在获取状态下永久挂起。为了避免这种Redisson维护锁看门狗&#xff0c;当锁持有者Redisson实例处于活动状态时&#xff0c;它会延长锁的到期时间…...

【C语言进阶】指针与数组、转移表详解

前言 大家好我是程序猿爱打拳&#xff0c;我们在学习完指针的基本概念后知道了指针就是地址&#xff0c;我们可以通过这个地址并对它进行解引用从而改变一些数据。但只学习指针的基础是完全不够的&#xff0c;因此学习完指针的基础后我们可以学习关于指针的进阶&#xff0c;其中…...

SDN是什么,和SD-WAN有什么关系

SDN全称为“软件定义网络”&#xff08;Software-Defined Networking&#xff09;&#xff0c;是一种新型的网络架构&#xff0c;通过将网络的控制面和数据面分离&#xff0c;将网络控制集中到控制器中进行统一管理和配置&#xff0c;以提高网络的灵活性和可管理性。传统网络的…...

百度前端高频react面试题(持续更新中)

说说你用react有什么坑点&#xff1f; 1. JSX做表达式判断时候&#xff0c;需要强转为boolean类型 如果不使用 !!b 进行强转数据类型&#xff0c;会在页面里面输出 0。 render() {const b 0;return <div>{!!b && <div>这是一段文本</div>}</div…...

中级嵌入式系统设计师2016下半年下午应用设计试题

中级嵌入式系统设计师2016下半年下午试题 试题一 阅读以下说明,回答问题1至问题3。 【说明】 某综合化智能空气净化器设计以微处理器为核心,包含各种传感器和控制器,具有检测环境空气参数(包含温湿度、可燃气体、细颗粒物等),空气净化、加湿、除湿、加热和杀菌等功能…...

【雅思备考】九分学长写作课笔记

原视频&#xff1a;https://www.bilibili.com/video/BV1FG4y1J7br?p13&vd_source552ac2291179cf9d44088ea168db5531 一、综述 共计1小时 小作文&#xff1a; 描述 图表图&#xff08;数据图&#xff09;、流程图&#xff08;示意图&#xff09;、地图&#xff08;示意…...

【源码解析】SpringBoot自动装配的实现原理

什么是SpringBoot的自动装配 SpringBoot在启动的时候会扫描外部jar包中的META-INF/spring.factories文件&#xff0c;将文件中配置的类信息按照条件装配到Spring容器中。 实现原理 核心注解SpringBootApplication Target({ElementType.TYPE}) Retention(RetentionPolicy.R…...

详解ROS时间戳

ROS&#xff08;Robot Operating System&#xff09;是一个用于机器人开发的开源软件框架&#xff0c;其中涉及到了一些与时间相关的概念和工具&#xff0c;如时间戳、计时器等。本文将主要介绍ROS中时间戳的概念和应用&#xff0c;并提供一个Python代码案例演示如何处理ROS时间…...

Android Window、WindowManager

1.窗口Window 在Android中显示一个界面,首先想到的是Activity、Dialog或Toast。但是在有些情况下,比如悬浮球,用Activity会显然多余,这个时候可以直接使用窗口来实现。 Android中所有的视图都是通过Window来呈现的,不管是Activity、Dialog还是Toast,它们的视图实际上都…...

【一天一门编程语言】怎样设计一门编程语言?

怎样设计一门编程语言&#xff1f; 确定目标 确定语言的用途&#xff1a; 是一门通用编程语言&#xff0c;还是一门专门面向某个特定目标的语言&#xff1f;是一门面向对象的语言&#xff0c;还是一门过程化的语言&#xff1f;将语言的最终用户定义为谁&#xff1f; 确定语言…...

微服务保护 -- 初识 Sentinel(雪崩问题,快速入门Sentinel)

大家好&#xff0c;今天我们要来学习阿里巴巴开源的流量控制和熔断降级框架 – Sentinel 。 1、雪崩问题及解决方案 首选我们来了解一下雪崩问题及其解决方案&#xff0c;我们学习这个微服务保护&#xff0c;其实就是为了去应对类似于雪崩问题这样的服务故障。 1.1 什么是雪…...

软件测试面试问答

笔试 笔试的话我们需要揣测具体会考什么内容&#xff0c;我们可以通过招聘信息去了解该公司需要什么样的技能&#xff0c;以此来准备笔试。一般必考的内容会有编程&#xff0c;测试用例设计&#xff0c;工作流程&#xff0c;逻辑思维等内容&#xff0c;除此之外每个公司可能还会…...

【架构】架构师的核心能力-抽象能力

文章目录一、通过归纳法找共性二、通过演绎法找关系三、通过归纳法找特性四、最后架构的核心是管理复杂度&#xff0c;架构师的核心能力是抽象能力&#xff0c;什么是抽象能力&#xff1f;抽象能力就是一种化繁为简的能力。何为化繁为简&#xff1f;就是把一种复杂的事情变得简…...

前端一面常见react面试题(持续更新中)

React 组件中怎么做事件代理&#xff1f;它的原理是什么&#xff1f; React基于Virtual DOM实现了一个SyntheticEvent层&#xff08;合成事件层&#xff09;&#xff0c;定义的事件处理器会接收到一个合成事件对象的实例&#xff0c;它符合W3C标准&#xff0c;且与原生的浏览器…...

亥姆霍兹线圈测量系统

亥姆霍兹线圈[Helmholtz线圈]是指由具有相同线圈匝数、相同线圈绕制方式且线圈半径等于线圈间距的一对或者多对线圈构成的线圈组合。 根据线圈的形状&#xff0c;亥姆霍兹线圈可分为圆形亥姆霍兹线圈和方形亥姆霍兹线圈&#xff1b;根据磁场方向&#xff0c;亥姆霍兹线圈可分为…...

JavaScript 类型转换

Number() 转换为数字&#xff0c; String() 转换为字符串&#xff0c; Boolean() 转化为布尔值。JavaScript 数据类型在 JavaScript 中有 5 种不同的数据类型&#xff1a;stringnumberbooleanobjectfunction3 种对象类型&#xff1a;ObjectDateArray2 个不包含任何值的数据类型…...

Spring Batch 综合案例实战-项目准备

目录 案例需求 分析 项目准备 步骤1&#xff1a;新开spring-batch-example 步骤2&#xff1a;导入依赖 步骤3&#xff1a;配置文件 步骤4&#xff1a;建立employee表与employe_temp表 步骤5&#xff1a;建立基本代码体系-domain-mapper-service-controller-mapper.xml …...

STM32CubeMX串口USART中断发送接收数据

本文代码使用 HAL 库。 文章目录前言一、中断控制二、USART中断使用1. 中断优先级设置 &#xff1a;2. 使能中断3. 使能UART的发送、接收中断4. 中断收发函数5. 中断处理函数6. 中断收发回调函数三、串口中断实验串口中断发送数据点亮 led&#xff1a;实验现象&#xff1a;总结…...

JavaScript Web Workers使用流程

背景 Web Workers是一个API&#xff0c;允许在浏览器中运行后台处理任务&#xff0c;而不影响用户界面&#xff08;UI&#xff09;线程的稳定性。 Web Workers 可用于消除阻止 UI 的耗时任务&#xff0c;如图表生成&#xff0c;物理模拟或数据分析等&#xff1a; 使用 Web W…...

数据结构与算法(五):优先队列

这节总结一下优先队列的常用实现方法。 一、基本概念 普通的队列是一种先进先出的数据结构&#xff0c;元素在队列尾追加&#xff0c;而从队列头删除。在优先队列中&#xff0c;元素被赋予优先级。当访问元素时&#xff0c;具有最高优先级的元素最先删除。优先队列具有最高级…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...