Redisson 四大核心机制实现原理详解
一、可重入锁(Reentrant Lock)
可重入锁是什么?
通俗定义
可重入锁类似于一把“智能锁”,它能识别当前的锁持有者是否是当前线程:
- 如果是,则允许线程重复获取锁(重入),并记录重入次数。
- 如果不是,则其他线程必须等待锁释放后才能获取。
典型场景
当一个线程调用了一个被锁保护的方法A,而方法A内部又调用了另一个被同一锁保护的方法B时,如果锁不可重入,线程会在调用方法B时被自己阻塞(死锁)。可重入锁允许这种嵌套调用。
public class Demo {private final Lock lock = new SomeLock(); // 假设这是一个锁public void methodA() {lock.lock();try {methodB(); // 调用另一个需要加锁的方法} finally {lock.unlock();}}public void methodB() {lock.lock();try {// 业务逻辑} finally {lock.unlock();}} }
- 如果锁不可重入 线程进入
methodA
获取锁后,调用methodB
时再次尝试加锁,会因为锁已被自己持有而永久阻塞(死锁)。- 如果锁可重入 线程在
methodB
中能成功获取锁,计数器从1
增加到2
,释放时计数器递减,最终正常释放。
实现原理:通过 Redis 的 Hash 结构实现线程级锁的可重入性。
-
数据结构:
- Key:锁名称(如
lock:order:1001
)。 - Field:客户端唯一标识(
UUID + 线程ID
),如b983c153-7091-42d8-823a-cb332d52d2a6:1
。 - Value:锁的 重入次数(初始为 1,重入时递增)。
- Key:锁名称(如
-
加锁逻辑:
- 首次加锁:执行 Lua 脚本,若 Key 不存在,创建 Hash 并设置重入次数为 1。
-- KEYS[1]=锁名, ARGV[1]=锁超时时间, ARGV[2]=线程唯一ID if (redis.call('exists', KEYS[1]) == 0) then -- 如果锁不存在redis.call('hincrby', KEYS[1], ARGV[2], 1); -- 创建Hash,记录线程重入次数redis.call('pexpire', KEYS[1], ARGV[1]); -- 设置锁超时时间return nil; -- 返回成功 end;
- 重入加锁:若 Field 匹配当前线程,重入次数 +1。
if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then -- 如果锁已被当前线程持有redis.call('hincrby', KEYS[1], ARGV[2], 1); -- 增加重入次数redis.call('pexpire', KEYS[1], ARGV[1]); -- 刷新锁超时时间return nil; -- 返回成功 end;
- 首次加锁:执行 Lua 脚本,若 Key 不存在,创建 Hash 并设置重入次数为 1。
-
释放锁:减少重入次数,归零时删除 Hash。
-- KEYS[1]: 锁名称(如 my_lock) -- KEYS[2]: 发布订阅的频道名 -- ARGV[1]: 解锁消息标识(如 0) -- ARGV[2]: 锁的过期时间(毫秒) -- ARGV[3]: 客户端唯一标识(UUID + 线程ID)-- 检查锁是否存在且属于当前线程 if (redis.call('hexists', KEYS[1], ARGV[3]) == 0) thenreturn nil; -- 锁不存在或不属于当前线程,直接返回 end;-- 减少重入计数器(原子操作) local counter = redis.call('hincrby', KEYS[1], ARGV[3], -1);if (counter > 0) then-- 仍有重入未释放完,更新锁过期时间redis.call('pexpire', KEYS[1], ARGV[2]);return 0; -- 返回0表示未完全释放 else-- 计数器归零,删除锁并发布释放通知redis.call('del', KEYS[1]);redis.call('publish', KEYS[2], ARGV[1]);return 1; -- 返回1表示锁已完全释放 end;
二、锁重试机制(Retry Mechanism)
重试机制的触发条件
当调用
tryLock(long waitTime, long leaseTime, TimeUnit unit)
方法时,若waitTime > 0
,Redisson 会启用重试机制。例如:java// 10秒内不断重试获取锁,获取成功后持有锁60秒 lock.tryLock(10, 60, TimeUnit.SECONDS);
若首次获取锁失败,进入重试流程。
实现原理: 事件驱动优先,主动轮询兜底
-
首次尝试获取锁
- 原子性操作:通过 Lua 脚本尝试获取锁(检查锁是否存在或是否属于当前线程)。
- 失败返回值:若锁被其他线程持有,返回锁的剩余存活时间(
ttl
)。
-
订阅锁释放事件
- 创建监听频道:订阅 Redis 频道
redisson_lock__channel:{lockName}
。 - 事件驱动优化:避免频繁轮询,仅当锁释放时触发重试,减少无效请求。
// 伪代码:订阅锁释放事件 RFuture<RedissonLockEntry> future = subscribe(lockName); RedissonLockEntry entry = get(future);
- 创建监听频道:订阅 Redis 频道
-
循环重试(主动轮询 + 事件触发)
- 计算剩余等待时间:基于
waitTime
和已消耗时间,动态调整剩余等待窗口。 - 双重检测逻辑:
- 主动轮询:定期(默认间隔 100ms ~ 300ms)执行 Lua 脚本尝试获取锁。
- 事件触发:收到锁释放通知后立即尝试获取锁。
- 退避策略:每次重试失败后,采用随机递增的等待时间(避免多个客户端同时竞争导致雪崩)。
关键代码逻辑(简化):
- 计算剩余等待时间:基于
long remainingTime = waitTime; // 剩余等待时间
long startTime = System.currentTimeMillis();while (remainingTime > 0) {// 1. 尝试获取锁Long ttl = tryAcquire(leaseTime, unit); // 调用Lua脚本if (ttl == null) {return true; // 获取成功}// 2. 计算剩余时间long elapsed = System.currentTimeMillis() - startTime;remainingTime -= elapsed;if (remainingTime <= 0) {break; // 超时退出}// 3. 等待锁释放事件或超时entry.getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS); // 基于信号量等待// 4. 更新剩余时间remainingTime -= (System.currentTimeMillis() - startTime - elapsed);
}
return false; // 超时未获取
- 超时终止
- 时间窗口耗尽:若总耗时超过
waitTime
,终止重试并返回失败。 - 资源清理:取消 Redis 订阅,释放连接。
- 时间窗口耗尽:若总耗时超过
三、WatchDog 看门狗(锁续期机制)
防止业务执行时间超过锁的过期时间,导致锁提前释放。
启用看门狗需满足以下条件之一:
- 未显式指定锁的租约时间(leaseTime): 例如调用
lock.tryLock()
或lock.lock()
时不传leaseTime
参数。- 显式设置租约时间为
-1
: 例如lock.tryLock(10, -1, TimeUnit.SECONDS)
。注意:若指定了固定的
leaseTime
(如lock.tryLock(10, 30, TimeUnit.SECONDS)
),看门狗不会启动,锁会在 30 秒后自动释放。
实现原理:后台线程自动续期锁,防止业务未完成时锁过期。
-
触发条件:未指定锁超时时间(如
lock.lock()
)。 -
续期逻辑:
-
定时任务:默认每 10 秒(
lockWatchdogTimeout / 3
)续期一次。 -
续期命令:重置锁的过期时间为 30 秒(默认值)。
-- KEYS[1]: 锁名称 -- ARGV[1]: 过期时间(默认30秒) -- ARGV[2]: 客户端唯一标识 if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) thenredis.call('pexpire', KEYS[1], ARGV[1]);return 1; end; return 0;
-
-
终止条件:
- 锁被释放(
unlock()
调用)。 - 客户端断开连接或线程中断。
- 锁被释放(
四、主从一致性(MultiLock/RedLock)
Redis 主从复制是异步的,若主节点宕机且锁未同步到从节点,可能导致多个客户端同时持有锁。
实现原理:基于多数派原则,向多个独立节点加锁。
-
MultiLock 流程:
- 加锁:向所有节点发送加锁请求,需 半数以上成功(如 3 节点至少 2 个成功)。
- 容错:允许最多
⌊(N-1)/2⌋
个节点故障(如 5 节点允许 2 个故障)。 - 解锁:无论加锁是否成功,向所有节点发送解锁命令。
-
RedLock 算法增强:
- 时钟同步:要求节点使用 NTP 同步时间,锁有效期需包含时钟漂移。
- 加锁验证:计算加锁耗时,确保有效时间未耗尽。
-
配置示例:
RLock lock1 = redissonClient1.getLock("lock"); RLock lock2 = redissonClient2.getLock("lock"); RLock multiLock = new RedissonMultiLock(lock1, lock2); multiLock.lock(); try {// 业务逻辑 } finally {multiLock.unlock(); }
五、总结
机制 | 实现原理 |
---|---|
可重入锁 | 使用 Redis Hash 结构存储锁名、线程唯一标识(UUID+线程ID)和重入次数。同一线程多次获取锁时重入次数递增,释放时递减,归零后删除锁。 |
锁重试 | 通过 Pub/Sub 订阅锁释放事件 避免轮询;失败后按退避策略(默认 1.5 秒)重试,直到超时或成功。 |
WatchDog | 后台线程每 10 秒(默认)检查锁持有状态,若锁存在则续期(重置过期时间至 30 秒)。未指定锁超时时间时自动启用。 |
主从一致性 | 使用 MultiLock/RedLock:向多个独立节点加锁,需半数以上成功;解锁时向所有节点发送命令,解决主从异步复制导致的锁失效。 |
相关文章:
Redisson 四大核心机制实现原理详解
一、可重入锁(Reentrant Lock) 可重入锁是什么? 通俗定义 可重入锁类似于一把“智能锁”,它能识别当前的锁持有者是否是当前线程: 如果是,则允许线程重复获取锁(重入),并…...
云计算与大数据进阶 | 26、解锁云架构核心:深度解析可扩展数据库的5大策略与挑战(上)
在云应用/服务的 5 层架构里,数据库服务层稳坐第 4 把交椅,堪称其中的 “硬核担当”。它的复杂程度常常让人望而生畏,不少人都将它视为整个架构中的 “终极挑战”。 不过,也有人觉得可扩展存储系统才是最难啃的 “硬骨头”&#…...
Android从单体架构迁移到模块化架构。你会如何设计模块划分策略?如何处理模块间的通信和依赖关系
从单体架构迁移到模块化架构。可能有些小伙伴已经深陷单体架构的泥潭,代码耦合得跟一团麻线似的,改个小功能都能牵一发而动全身;也可能有些团队在协作时,经常因为代码冲突或者职责不清搞得焦头烂额。相信我,这些问题我…...
基于MATLAB的人脸识别,实现PCA降维,用PCA特征进行SVM训练
基于MATLAB的人脸识别完整流程,包含PCA降维和SVM分类的实现。我们以经典的ORL人脸数据库为例,演示从数据加载到结果评估的全过程。 1. 数据准备与预处理 1.1 下载数据集 下载ORL人脸数据库(40人10张,共400张图像)…...
AI 赋能 Copula 建模:大语言模型驱动的相关性分析革新
技术点目录 R及Python语言及相关性研究初步二元Copula理论与实践(一)二元Copula理论与实践(二)【R语言为主】Copula函数的统计检验与选择【R语言为主】高维数据与Vine Copula 【R语言】正则Vine Copula(一)…...
机器学习与人工智能:NLP分词与文本相似度分析
DIY AI & ML NLP — Tokenization & Text Similarity by Jacob Ingle in Data Science Collective 本文所使用的数据是在 Creative Commons license 下提供的。尽管我们已尽力确保信息的准确性和完整性,但我们不对数据的完整性或可靠性做任何保证。数据的使…...
特斯拉虚拟电厂:能源互联网时代的分布式革命
在双碳目标与能源转型的双重驱动下,特斯拉虚拟电厂(Virtual Power Plant, VPP)通过数字孪生技术与能源系统的深度融合,重构了传统电力系统的运行范式。本文从系统架构、工程实践、技术挑战三个维度,深度解析这一颠覆性…...
系统提示学习(System Prompt Learning)在医学编程中的初步分析与探索
一、SPL 的核心定义 系统提示学习(SPL)是一种通过策略性设计输入提示(Prompts),引导大型语言模型(LLMs)生成特定领域行为与输出的方法。其核心在于不修改模型参数,而是通过上下文工程(Context Engineering)动态控制模型响应,使其适配复杂任务需求。 与微调(Fine-…...
使用DDR4控制器实现多通道数据读写(十二)
一、章节概括 这一节使用interconnect RTL ip核将DDR4与四个读写通道级联,在测试工程中,将四个通道同时写入/读出地址与数据,并使用modelsim仿真器仿真,四个通道同时发送写请求或读请求后,经过interconnect后ÿ…...
PCIe数据采集系统详解
PCIe数据采集系统详解 在上篇文章中,废了老大劲儿我们写出了PCIe数据采集系统;其中各个模块各司其职,相互配合。完成了从数据采集到高速存储到DDR3的全过程。今天我们呢就来详细讲解他们之间的关系?以及各个模块的关键点ÿ…...
小白级通信小号、虚拟小号查询技术讲解
手机号构成与归属地原理 手机号码由国家代码、运营商代码和用户号码等部分组成。全球手机号段由国际电信联盟(ITU)统一规划,各国通信管理机构负责分配具体号段。在我国,通过解析手机号码前几位,就能确定其所属运营商及…...
【爬虫】DrissionPage-4
官网文档:https://www.drissionpage.cn/browser_control/browser_options 一、核心对象与初始化 1. 类定义 作用:管理Chromium内核浏览器的启动配置,仅在浏览器启动时生效。导入方式:from DrissionPage import ChromiumOptions…...
数据通信原理 光纤通信 期末速成
一、图表题 1. 双极性不归零、单极性不归零、曼彻斯特码、抑制载频2ASK,2PSK、2DPSK信号的波形 双极性不归零 和 单极性不归零:不归零意思是 0 低 1 高 非归零编码(NRZ):用不同电平表示二进制数字,常以…...
Java微服务架构实战:Spring Boot与Spring Cloud的完美结合
Java微服务架构实战:Spring Boot与Spring Cloud的完美结合 引言 随着云计算和分布式系统的快速发展,微服务架构已成为现代软件开发的主流模式。Java作为一门成熟的编程语言,凭借其强大的生态系统和丰富的框架支持,成为构建微服务…...
React底层架构深度解析:从虚拟DOM到Fiber的演进之路
一、虚拟DOM:性能优化的基石 1.1 核心工作原理 React通过JSX语法将组件转换为轻量级JavaScript对象(即虚拟DOM),而非直接操作真实DOM。这一过程由React.createElement()实现,其结构包含元素类型、属性和子节点等信息&a…...
今日行情明日机会——20250516
上证缩量收阴线,小盘股表现相对更好,上涨的个股大于下跌的,日线已到前期压力位附近,注意风险。 深证缩量收假阳线,临近日线周期上涨末端,注意风险。 2025年5月16日涨停股行业方向分析 机器人概念&#x…...
小结:网页性能优化
网页性能优化是提升用户体验、减少加载时间和提高资源利用率的关键。以下是针对网页生命周期和事件处理的性能优化技巧,结合代码示例,重点覆盖加载、渲染、事件处理和资源管理等方面。 1. 优化加载阶段 减少关键资源请求: 合并CSS/JS文件&a…...
2025年PMP 学习十五 第10章 项目资源管理
2025年PMP 学习十五 第10章 项目资源管理 序号过程过程组1规划沟通管理规划2管理沟通执行3监控沟通监控 项目沟通管理包括为确保项目的信 息及时且恰当地规划、收集、生成、发布、存储、检索、管理、控制、监 警和最终处理所需的过程; 项目经理绝大多数时间都用于与…...
速通RocketMQ配置
配置RocketMQ又出问题了,赶紧记录一波 这个是我的RocketMQ配置文件 通过网盘分享的文件: 链接: https://pan.baidu.com/s/1UUYeDvKZFNsKPFXTcalu3A?pwd8888 提取码: 8888 –来自百度网盘超级会员v9的分享 里面有这三个东西 里面还有一些broker和names…...
宇宙中是否存在量子现象?
一、宇宙中的量子现象 好的,请提供具体的搜索词或意图,以便进行检索和生成简洁的回答。 好的,请提供具体的搜索词或意图,以便进行检索和生成简洁的回答。 量子涨落与宇宙结构 早期宇宙的量子涨落(微观尺度的不确定性…...
背包问题详解
一、问题引入:什么是背包问题? 背包问题是经典的动态规划问题,描述如下: 有一个容量为 m 的背包 有 n 个物品,每个物品有体积 v 和价值 w 目标:选择物品装入背包,使总价值最大且总体积不超过…...
oracle linux 95 升级openssh 10 和openssl 3.5 过程记录
1. 安装操作系统,注意如果可以选择,选择安装开发工具,主要是后续需要编译安装,需要gcc 编译工具。 2. 安装操作系统后,检查zlib 、zlib-dev是否安装,如果没有,可以使用安装镜像做本地源安装&a…...
Tomcat发布websocket
一、tomcal的lib放入文件 tomcat-websocket.jar websocket-api.jar 二、代码示例 package com.test.ws;import com.test.core.json.Jmode;import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.util.concurrent.CopyOnWriteArraySet; imp…...
[思维模式-41]:在确定性与不确定性的交响中:人类参与系统的韧性密码。
前言: “任何信息系统,无论怎么复杂,哪怕是几万人同时开发的系统,如无线通信网络,通过标准、设计、算法、完毕的测试、过程的管控等,都是可预测和确定性的。 一个系统,一旦叠加了人的元素和因素…...
维智定位 Android 定位 SDK
概述 维智 Android 定位 SDK是为 Android 移动端应用提供的一套简单易用的定位服务接口,为广大开发者提供融合定位服务。通过使用维智定位SDK,开发者可以轻松为应用程序实现极速、智能、精准、高效的定位功能。 重要:为了进一步加强对最终用…...
Vue3:脚手架
工程环境配置 1.安装nodejs 这里我已经安装过了,只需要打开链接Node.js — Run JavaScript Everywhere直接下载nodejs,安装直接一直下一步下一步 安装完成之后我们来使用电脑的命令行窗口检查一下版本 查看npm源 这里npm源的地址是淘宝的源࿰…...
Android native崩溃问题分析
最近在做NDK项目的时候,出现了启动应用就崩溃了,崩溃日志如下: 10:41:04.743 A Build fingerprint: samsung/g0qzcx/g0q:13/TP1A.220624.014/S9060ZCU4CWH1:user/release-keys 10:41:04.743 A Revision: 12 10:41:04.743 A ABI: arm64…...
Playwright vs Selenium:2025 年 Web 自动化终极对比指南
1. 引言 Web 自动化领域正在迅速发展,在 2025 年,Playwright 与 Selenium 之间的选择已成为开发团队面临的重要决策。Selenium 作为行业标准已有十多年,而 Playwright 作为现代替代方案,以卓越的性能和现代化特性迅速崛起。 本指…...
数据结构(3)线性表-链表-单链表
我们学习过顺序表时,一旦对头部或中间的数据进行处理,由于物理结构的连续性,为了不覆盖,都得移,就导致时间复杂度为O(n),还有一个潜在的问题就是扩容,假如我们扩容前是10…...
Python 中的 typing.ClassVar 详解
一、ClassVar 的定义和基本用途 ClassVar 是 typing 模块中提供的一种特殊类型,用于在类型注解中标记类变量(静态变量)。根据官方文档,使用 ClassVar[…] 注释的属性表示该属性只在类层面使用,不应在实例上赋值 例如&…...
主流数据库运维故障排查卡片式速查表与视觉图谱
主流数据库运维故障排查卡片式速查表与视觉图谱 本文件将主文档内容转化为模块化卡片结构,并补充数据库结构图、排查路径图、锁机制对比等视觉图谱,以便在演示、教学或现场排障中快速引用。 📌 故障卡片速查:连接失败 数据库检查…...
Unity:延迟执行函数:Invoke()
目录 Unity 中的 Invoke() 方法详解 什么是 Invoke()? 基本使用方法 使用要点 延伸功能 ❗️Invoke 的局限与注意事项 在Unity中,延迟执行函数是游戏逻辑中常见的需求,比如: 延迟切换场景 延迟播放音效或动画 给玩家时间…...
医学影像系统性能优化与调试技术:深度剖析与实践指南
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
【HTML5学习笔记1】html标签(上)
web标准(重点) w3c 构成:结构、表现、行为,结构样式行为相分离 结构:网页元素整理分类 html 表现:外观css 行为:交互 javascript html标签 1.html语法规范 1) 所有标签都在…...
SearchIndexablesProvider
实现的 provider 根据索引添加文档可知,该 provider 需要继承自 frameworks/base/core/java/android/provider/SearchIndexablesProvider.java 类,并且添加权限 android.permission.READ_SEARCH_INDEXABLES。过滤 Settings 代码,可以轻易找到…...
《k-means 散点图可视化》实验报告
一,实验目的 本次实验旨在通过Python编程实现k - means算法的散点图可视化。学习者将编写代码,深入理解聚类分析基本原理与k - means算法实现流程,掌握数据聚类及可视化方法,以直观展示聚类结果。 二,实验原理 k-mea…...
数学复习笔记 12
前言 现在做一下例题和练习题。矩阵的秩和线性相关。另外还要复盘前面高数的部分的内容。奥,之前矩阵的例题和练习题,也没有做完,行列式的例题和练习题也没有做完。累加起来了。以后还是得学一个知识点就做一个部分的内容,日拱一…...
Web-CSS入门
WEB前端,三部分:HTML部分、CSS部分、Javascript部分。 1.HTML部分:主要负责网页的结构层 2.CSS部分:主要负责网页的样式层 3.JS部分:主要负责网页的行为层 **基本概念** 层叠样式表,Cascading Style Sh…...
Qt/C++编写音视频实时通话程序/画中画/设备热插拔/支持本地摄像头和桌面
一、前言 近期有客户提需求,需要在嵌入式板子上和电脑之间音视频通话,要求用Qt开发,可以用第三方的编解码组件,能少用就尽量少用,以便后期移植起来方便。如果换成5年前的知识储备,估计会采用纯网络通信收发…...
Ubuntu快速安装Python3.11及多版本管理
之前文章和大家分享过,将会出一篇专栏(从电脑装ubuntu系统,到安装ubuntu的常用基础软件:jdk、python、node、nginx、maven、supervisor、minio、docker、git、mysql、redis、postgresql、mq、ollama等),目前…...
Qt功能区:Ribbon使用
Ribbon使用 1. Ribbon功能区介绍1.1 样式 2. 基本功能区设置2.1 安装动态库(推荐)2.2 在MainWindow中使用Ribbon2.3 在QWidget中使用SARibbonBar2.4 创建Category和Pannel2.5 ContextCategory 上下文标签创建 2.6 ApplicationButton2.7 QuickAccessBar和…...
【学习心得】Jupyter 如何在conda的base环境中其他虚拟环境内核
如果你在conda的base环境运行了jupyter lab打开了一个ipynb文本,此时选择的内核是base虚拟环境的Python内核,如果我想切换成其他conda虚拟环境来运行这个文件该怎么办?下面我们试着还原一下问题,并且解决问题。 【注】 这个问题出…...
在微创手术中使用Kinova轻型机械臂进行多视图图像采集和3D重建
在微创手术中,Kinova轻型机械臂通过其灵活的运动控制和高精度的操作能力,支持多视图图像采集和3D重建。这种技术通过机械臂搭载的光学系统实现精准的多角度扫描,为医疗团队提供清晰且详细的解剖结构模型。其核心在于结合先进的传感器配置与重…...
[Java][Leetcode middle] 238. 除自身以外数组的乘积
第一个想法是: 想求出所有元素乘积,然后除以i对应的元素本书;这个想法是完全错误的: nums[I] 可能有0题目要求了不能用除法 第二个想法是: 其实写之前就知道会超时,但是我什么都做不到啊! 双…...
【leetcode】144. 二叉树的前序遍历
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3] 解释: 示例 2: 输入:root [1,2,3,4,5,null,8,null,null,6,7,9] 输出:…...
SpringBoot常用注解详解
文章目录 1. 前言2. 核心注解2.1 SpringBootApplication2.2 Configuration2.3 EnableAutoConfiguration2.4 ComponentScan2.5 Bean2.6 Autowired2.7 Qualifier2.8 Primary2.9 Value2.10 PropertySource2.11 ConfigurationProperties2.12 Profile 3. Web开发相关注解3.1 Control…...
中文分词与数据可视化02
jieba 库简介 jieba(结巴分词)是一个高效的中文分词工具,广泛用于中文自然语言处理(NLP)任务。它支持以下功能: 分词:将句子切分为独立的词语。 自定义词典:添加专业词汇或新词&am…...
SSH主机密钥验证失败:全面解决方案与技术手册
一、问题本质与安全机制解析 SSH(Secure Shell)的主机密钥验证是安全通信的核心机制,当出现"Host key verification failed"错误时,表明客户端检测到服务器身份异常。这种设计可有效防范中间人攻击(Man-in-the-Middle),其工作原理…...
buuctf Crypto-鸡藕椒盐味1
1.题目: 公司食堂最新出了一种小吃,叫鸡藕椒盐味汉堡,售价八块钱,为了促销,上面有一个验证码,输入后可以再换取一个汉堡。但是问题是每个验证码几乎都有错误,而且打印的时候倒了一下。小明买到了一个汉堡&a…...
真题卷001——算法备赛
蓝桥杯2024年C/CB组国赛卷 1.合法密码 问题描述 小蓝正在开发自己的OJ网站。他要求用户的密码必须符合一下条件: 长度大于等于8小于等于16必须包含至少一个数字字符和至少一个符号字符 请计算一下字符串,有多少个子串可以当作合法密码。字符串为&am…...