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

分布式锁: 并发时,redis如何避免删别人的锁

在使用Redis实现分布式锁的时候,如何避免在并发情况下误删别人的锁。首先,分布式锁的基本概念:是多个客户端在访问共享资源时,通过某种机制来确保同一时间只有一个客户端能持有锁。
Redis通常用SET命令加上NX选项来创建锁,同时设置过期时间,避免锁被长时间占用无法释放。
比如用`SET lock_key unique_value NX PX 30000`这样的命令,
其中unique_value是每个客户端唯一的标识,这样在释放锁的时候可以验证是否是自己持有的锁,防止误删。那问题来了,假设客户端A获取了锁,然后执行了一些操作,这时候如果操作时间超过了锁的过期时间,
锁会自动释放。此时客户端B可能获取到锁,然后客户端A操作完成,尝试释放锁,
这时候如果没有检查锁的值,直接删除的话,就会把客户端B的锁删掉。这显然是不对的。所以关键点在于释放锁的时候要确保只有锁的持有者才能删除它。那具体怎么实现呢?
应该是这样的:在删除锁之前,先获取锁的值,判断是否与自己设置的unique_value一致,如果一致才删除。
但是这里有个问题,获取值和删除这两个操作不是原子性的,可能存在竞态条件。
比如客户端A检查值的时候发现是自己的,然后准备删除,这时候锁过期了,客户端B获取了锁,
然后客户端A才执行删除操作,这时候又会误删客户端B的锁。那如何解决这个问题呢?应该让检查和删除这两个操作原子化执行。
Redis有没有这样的机制呢?对的,可以用Lua脚本,因为Lua脚本在Redis中是原子执行的,不会被其他命令打断。
所以,我们可以写一个Lua脚本,里面先检查锁的值是否匹配,如果匹配则删除,否则不操作。这样就能保证操作的原子性了。比如,Lua脚本可以这样写:```luaif redis.call("get",KEYS[1]) == ARGV[1] thenreturn redis.call("del",KEYS[1])
elsereturn 0
end```这里的KEYS[1]是锁的键名,ARGV[1]是客户端生成的唯一值。这样执行的时候,
判断和删除就变成一个原子操作,不会被打断,避免了误删的情况。那除了使用Lua脚本之外,还有没有其他的方法?比如使用Redis的事务(MULTI/EXEC),
不过事务中的命令虽然会按顺序执行,但是其中的命令可能会被其他客户端的命令插入,
所以并不能保证原子性。而Lua脚本是确保整个脚本在同一个原子操作中执行的,所以更可靠。另外,关于unique_value的生成,必须确保每个客户端每次获取锁时都是唯一的,比如可以使用UUID,
或者结合客户端ID和时间戳等信息生成。这样即使不同客户端的操作,他们的unique_value也不会冲突。还有,锁的过期时间设置也很重要。如果设置的太短,可能导致业务逻辑还没执行完,锁就被释放了,进而被其他客户端获取,导致并发问题。
如果设置的太长,当客户端崩溃时,锁不能及时释放,影响系统可用性。
所以需要根据业务执行时间合理设置过期时间,或者使用自动续期的机制,
比如Redisson的看门狗机制,定期检查锁是否还在持有,如果是的话就延长过期时间。总结一下,避免删除别人的锁的关键步骤是:1. 在加锁时设置唯一的标识(unique_value)。
2. 在解锁时通过Lua脚本原子性地验证标识并删除锁。
3. 确保锁的过期时间合理,或者Redisson的看门狗机制实现自动续期。这样就能有效避免在并发场景下误删其他客户端的锁了。不过需要注意,
Redis的分布式锁在极端情况下(比如主从切换时)可能还存在问题,
这时候可能需要更复杂的算法比如RedLock,
但大多数情况下,单实例Redis加上正确的解锁方式已经足够应对了。

在Redis中实现分布式锁时,为避免并发场景下误删其他客户端的锁,需遵循以下步骤:

核心解决方案:

  1. 唯一标识锁持有者
    每个客户端在获取锁时,需生成一个全局唯一值(如UUID、客户端ID+时间戳),作为锁的值。例如:

    SET lock_key unique_value NX PX 30000  
    # unique_value为唯一标识,NX表示仅当键不存在时设置,PX设置过期时间
  2. 原子化验证并删除锁
    释放锁时,需确保验证锁归属删除锁是原子操作。通过Lua脚本实现:

    if redis.call("get", KEYS[1]) == ARGV[1] thenreturn redis.call("del", KEYS[1])
    elsereturn 0
    end

    该脚本先检查锁的值是否匹配当前客户端的唯一标识,若匹配则删除,否则不操作。

  3. 合理设置锁超时时间

    • 根据业务逻辑的最大执行时间,设置足够的锁超时时间(如PX 30000表示30秒)。

    • 可选:实现锁自动续(如Redisson的看门狗机制),避免业务未完成锁提前过期。

完整流程示例:

  1. 加锁
    客户端A执行:

    SET my_lock 8a2e1a7c-5b04-4f8a-9e3a-ca5d8e8e7a6f NX PX 10000

    成功获取锁,有效期10秒。

  2. 执行业务逻辑
    客户端A处理共享资源操作。

  3. 解锁
    客户端A执行Lua脚本:

    EVAL "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end" 1 my_lock 8a2e1a7c-5b04-4f8a-9e3a-ca5d8e8e7a6f

    仅当锁值匹配时,原子化删除锁。

注意事项:

  • 避免非原子操作
    直接使用GETDEL的非原子操作可能导致竞态条件,必须通过Lua脚本保证原子性。

  • 锁超时与续期
    若业务执行时间不稳定,建议实现锁自动续期(如每隔一段时间重置过期时间),防止锁提前释放。

  • 集群环境风险
    Redis主从架构下,主节点宕机可能导致锁丢失。若需强一致,可考虑RedLock算法(多实例部署),但会增加复杂度。

    RedLock算法(适用于Redis Cluster

    对于需要更高可靠性的场景,可以使用RedLock算法。RedLock算法要求在多个独立的Redis节点上尝试获取锁,并且大多数节点成功获取锁才算成功。释放锁时,需要在所有节点上释放。这增加了系统的复杂性和对网络延迟的容忍度,但提供了更高的可靠性。

总结:

通过唯一标识+原子化操作,Redis分布式锁可有效避免误删问题。正确实现后,能在多数场景下保障并发安全。

Redis分布式锁:面试官必问!
🔐为什么需要分布式锁?
🚫线程锁(synchronized/ReentrantLock)无法跨JVM进程
🚫进程锁(文件锁)在跨服务器时失效
🚫分布式系统需要跨机器通信的锁机制

🚀Redis分布式锁三大核心:
1️⃣ setnx+expire原子操作(Redis2.8+支持set带NX+EX参数)
2️⃣ 存储客户端唯一ID在value中,防止误删他人锁
3️⃣ 使用Lua脚本确保解锁操作的原子性

⚠️注意事项:单节点宕机导致锁失效?
RedLock算法五步解决方案:
1️⃣ 获取当前毫秒级时间戳
2️⃣ 向5个独立Redis实例顺序加锁
3️⃣ 计算获取锁的总耗时(必须小于锁的超时时间)
4️⃣ 过半节点(≥3)成功且耗时有效才算成功
5️⃣ 自动延长持有时间,需要运行守护线程

💥隐藏的雷区:
❌时钟跳跃可能导致锁提前失效
❌GC停顿可能导致锁超时失效
❌网络延迟可能导致双重判空

建议记住这个万能公式:唯一ID+自动续期+半数机制+时钟同步=高可用分布式锁!

锁提前失效-时钟跳跃

时钟跳跃可能导致锁提前失效‌,这是因为系统时钟的跳跃会导致时间戳的计算出现误差,进而影响锁的有效期计算。具体来说,时钟跳跃是指实际时间与系统记录的时间之间存在较大的差异,这种差异可能导致锁的结束时间(endTime)与开始时间(beginTime)之间的差值过大,从而使得锁在未到期时就被认为是过期,导致锁提前失效‌。

时钟跳跃的定义和原因

时钟跳跃是指系统时钟实际时间之间的差异较大,通常是由于系统时间的手动调整或网络时间协议(NTP)同步失败等原因造成的。这种时间差异会导致系统内部的时间计算出现误差,进而影响依赖于时间戳的操作,如锁的管理‌。

时钟跳跃对锁机制的影响

在分布式系统中,锁的管理通常依赖于精确的时间同步。如果系统时钟发生跳跃,锁的有效期计算可能会出现误差,导致锁在未到期时就被释放或认为已过期。这可能会导致资源竞争和访问冲突,影响系统的稳定性和可靠性‌。

防止时钟跳跃影响的措施

为了防止时钟跳跃对锁机制的影响,可以采取以下措施:

  1. 使用时间同步协议‌:通过NTP或其他时间同步协议,将各个节点的系统时钟同步到一个统一的时间源,减小时钟跳跃的可能性‌。
  2. 引入时钟漂移校正算法‌:在节点之间进行心跳同步时,引入动态调整心跳时间戳的算法,以校正时钟漂移‌。
  3. 使用分布式一致性算法‌:如Paxos、Raft等算法,通过选举机制和消息传递实现节点之间的协调和同步,保证数据一致性和时钟同步‌。
  4. 高可用架构和容灾方案:采用主备模式、多活模式、负载均衡等技术手段,确保系统的可用性和容错性‌。

锁提前失效-GC停顿

GC停顿可能导致锁超时失效‌,主要是因为垃圾回收(GC)过程中会暂停应用程序的执行,这会导致持有锁的线程无法继续执行,从而可能导致锁超时失效。

原因分析

  1. GC停顿‌:在垃圾回收过程中,JVM会暂停所有应用线程,进行内存清理。如果GC停顿时间过长,持有锁的线程可能会在锁过期前无法完成操作,导致锁被其他线程获取。
  2. ‌锁超时‌:许多分布式锁实现都设置了超时机制,以防止死锁或长时间占用资源。如果GC停顿时间超过锁的超时时间,锁会自动释放,导致其他线程可以获取锁,从而影响锁的稳定性和可靠性。

解决方案

  1. ‌优化GC设置‌:通过调整JVM的垃圾回收策略和参数,减少GC停顿时间。例如,使用G1垃圾回收器,它提供了更好的停顿时间控制。可以通过设置-XX:MaxGCPauseMillis来指定最大停顿时间目标。
  2. 调整锁的超时时间‌:根据应用的实际情况,适当增加锁的超时时间,以应对可能的GC停顿。但需要注意,过长的超时时间可能会影响系统的整体性能和响应速度。
  3. 监控和调试:使用性能监控工具(如JProfiler, YourKit, JVisualVM等)来分析对象的创建速率和内存使用情况,优化代码以减少对象创建和内存使用,从而降低GC频率和停顿时间。

通过以上措施,可以有效减少GC停顿对分布式锁的影响,确保系统的稳定性和可靠性。

锁提前失效-网络延迟

网络延迟可能导致DCL锁超时失效‌。在网络延迟的情况下,客户端请求获取逻辑锁时,请求可能会延迟到达服务器。如果在这期间其他客户端已经成功获取了锁,延迟的客户端由于不知道锁已经被占用,仍然在等待服务器的响应,这可能导致多个客户端同时获取锁的错觉。当客户端成功获取逻辑锁后,如果在持有锁的期间对共享资源进行操作时,由于网络延迟,服务器可能无法及时收到客户端释放锁的请求,导致锁被长时间占用,其他客户端无法获取锁,从而降低系统的并发性能‌。

解决方法

  1. 优化网络环境‌:可以通过升级网络设备、增加网络带宽等方式来减少网络延迟。例如,在企业内部的局域网中,将老旧的网络交换机更换为高性能的交换机,或者从较低带宽的网络接入方式升级‌。
  2. 使用网络优化工具‌:尝试使用网络优化工具,如“雷神加速器”或“UU加速器”,在打开Deadlock之前,先启动加速器并选择相应的区服进行优化,这样可以显著提升网络环境,解决因网络问题导致的游戏连接不畅‌。
  3. 检查路由器设置‌:定期重启路由器,确保没有错误的配置或限制。此外,尝试更换DNS服务器或使用有线连接,以进一步提高网络稳定性‌。

相关文章:

分布式锁: 并发时,redis如何避免删别人的锁

在使用Redis实现分布式锁的时候,如何避免在并发情况下误删别人的锁。首先,分布式锁的基本概念:是多个客户端在访问共享资源时,通过某种机制来确保同一时间只有一个客户端能持有锁。 Redis通常用SET命令加上NX选项来创建锁&#xf…...

解决 Jupyter Notebook 中本地模块修改不生效的问题

解决 Jupyter Notebook 中本地模块修改不生效的问题 问题原因 当你在 Jupyter Notebook 中导入本地目录的库,修改后重新运行 import 语句却发现修改没有生效,这是因为 Python 的模块缓存机制。Python 解释器会将已导入的模块缓存在 sys.modules 字典中…...

蓝桥杯嵌入式赛道复习笔记2(按键控制LED灯,双击按键,单击按键,长按按键)

硬件原理解释 这张图展示了一个简单的按键电路原理图,其中包含四个按键(PB0、PB1、PB2、PB3、PA0),每个按键通过一个10kΩ的上拉电阻连接到VDD(电源电压),并接地(GND)。 …...

简单爬虫--框架

简单爬虫 import requests import re import chardet# 模拟浏览器的请求头 headers {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" }# 发送 HTTP 请求获取百…...

游戏引擎学习第163天

我们可以在资源处理器中使用库 因为我们的资源处理器并不是游戏的一部分,所以它可以使用库。我说过我不介意让它使用库,而我提到这个的原因是,今天我们确实有一个选择——可以使用库。 生成字体位图的两种方式:求助于 Windows 或…...

多模态模型Orpheus,基于病理图像的乳腺癌复发风险智能评估工具|顶刊解读·25-03-17

小罗碎碎念 在医学领域,尤其是乳腺癌治疗方面,准确评估患者的复发风险至关重要。对于占乳腺癌很大比例的 HR/HER2 - 亚型患者,目前主要依靠 Oncotype DX 的复发评分(RS)来指导治疗决策。 然而,该检测存在…...

基于MapReduce的气候数据分析

标题:基于MapReduce的气候数据分析 内容:1.摘要 本文聚焦于基于MapReduce的气候数据分析。背景在于随着全球气候变化问题日益严峻,海量气候数据的高效处理和分析成为关键。目的是利用MapReduce技术对气候数据进行有效挖掘,以揭示气候变化规律和趋势。方…...

Spring 原生启动过程

Spring(Spring Framework)的原生启动过程,它主要涉及 ApplicationContext 的初始化、BeanFactory 的加载、Bean 的创建与依赖注入。下面详细解析: Spring 原生启动过程 Spring 本身不依赖 SpringApplication,其核心在…...

【React】useEffect、useLayoutEffect底层机制

目录 useEffect不设置依赖设置空数组,无依赖设置多个依赖返回值是一个函数总结useEffect的使用环境useEffect 中发送请求错误示例用.then获取数据在useEffect创建一个函数 总结 useLayoutEffectuseLayoutEffect 和useEffect区别执行时机:浏览器渲染的关系…...

RTSP/Onvif视频安防监控平台EasyNVR调用接口返回匿名用户名和密码的原因排查

视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入,并能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。平台拓展性强、支持二次开发与集成,可应用在景区、校园、水利、社区、工地等场…...

Linux-数据结构-线性表-单链表

一.链表的概念 【1】线性表的链式存储 解决顺序存储的缺点,插入和删除,动态存储问题。 【2】特点: 线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。可以被存…...

基于SpringBoot+Vue3实现的宠物领养管理平台功能一

一、前言介绍: 1.1 项目摘要 随着社会经济的发展和人们生活水平的提高,越来越多的人开始关注并参与到宠物领养中。宠物已经成为许多家庭的重要成员,人们对于宠物的关爱和照顾也日益增加。然而,传统的宠物领养流程存在诸多不便&a…...

DeepSeek进阶应用(二):结合Kimi制作PPT(双AI协作教程)

🌟引言: DeepSeek作为国产AI大模型,以强大的逻辑推理和结构化内容生成能力著称,擅长根据用户需求生成PPT大纲或Markdown文本;Kimi的PPT助手则能解析结构化内容并套用模板快速生成美观的PPT,两者结合实现“内容+设计”全流程自动化 名人说:苔花如米小,也学牡丹开。——…...

准确---快速安装nginx

1. 安装 Nginx 和 Stream 模块 首先,使用 yum 安装 Nginx 及其 Stream 模块: yum install nginx yum install nginx-mod-stream这将安装 Nginx 及其 Stream 模块,Stream 模块用于处理 TCP 和 UDP 流量,通常用于代理、负载均衡等…...

本地知识库RAG总结

目录 RAG流程: 知识库的要求: 知识抽取: 知识存储: 向量化: 知识检索: 应用客户端: RAG智能问答应用几个痛点: 如何提升召回率改进思路: 如何提升回答专业性: RAG评测: 总结: 参考…...

Trae IDE 介绍与使用教程

一、产品概述 Trae IDE 是由字节跳动推出的国内首个原生AI集成开发环境,专为中文开发者深度定制,旨在通过智能化工具降低编程门槛,提升开发效率。作为对标国外Cursor的国产替代方案,Trae不仅继承了AI驱动的代码生成与补全功能&am…...

OceanBase 用户问题精选答疑:OceanBase 版本升级解析

背景 此篇博客的源自于OceanBase社区论坛内一位名为皇甫侯的热心用户所提的建议,希望向OceanBase的用户介绍OceanBase的版本升级路径。本文以一个版本升级为示例,汇总了对用户而言比较重要的版本升级要点,期望通过这份分享,能让读…...

SpringBoot 和vue前后端配合开发网页拼图10关游戏源码技术分享

今天分享一个 前后端结合 的网页游戏 开发项目源码技术。 这也是我第一次写游戏类的程序,虽然不是特别复杂的游戏,但是是第一次写,肯定要记录一下了,哈哈。 游戏的内容 就是 我们显示中玩的那个 拼图碎片的 游戏,类似下…...

LeetCode 1005. K 次取反后最大化的数组和 java题解

https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/ 看着简单但是写si人的一题。 class Solution {public int largestSumAfterKNegations(int[] nums, int k) {Arrays.sort(nums);//排序int last_negative-1,first_positive-1;//最后一个负…...

c++ 类和对象 —— 中 【复习笔记】

1. 类的默认成员函数 如果一个类什么成员都没有,简称空类。但实际上,任何类在不写成员时,编译器会自动生成6个默认成员函数(用户未显式实现,编译器生成的成员函数) 这6个成员函数可分为三类: …...

「速通AI编程开发」共学(三):提示词(Prompts)配置项

「速通AI编程开发」共学(三) 一、共学课程来源学习初衷 二、介绍不同模式下的提示词(Prompts)支持性提示词 三、提示词学习材料分享 一、共学课程来源 Datawhale通过开源学习模式,助力AI学习者与知识连接,…...

Spring Cloud Stream - 构建高可靠消息驱动与事件溯源架构

一、引言 在分布式系统中,传统的 REST 调用模式往往导致耦合,难以满足高并发和异步解耦的需求。消息驱动架构(EDA, Event-Driven Architecture)通过异步通信、事件溯源等模式,提高了系统的扩展性与可观测性。 作为 S…...

电脑如何录屏

以下是电脑录屏的常用方法总结,涵盖系统自带工具、第三方软件及进阶功能,结合不同场景需求推荐最佳方案: 一、系统自带工具 Xbox Game Bar(Windows 10/11) 操作步骤:按 WinG 打开游戏栏 → 点击录制按钮&am…...

【微知】plantuml在泳道图中如何将多个泳道框起来分组并且设置颜色?(box “浏览器“ #LightGreen endbox)

泳道分组并且着色 分组用 box和endbox ,颜色用#xxx,标注用"xxx" box "浏览器" #LightGreen participant "浏览器1" as Browser participant "浏览器2" as Browser2 endboxparticipant "服务端" as …...

c++ 中的可变参数模板与折叠表达式

c 11 引入了可变参数模板,c 17 引入了折叠表达式,比 c 语言的可变参数更加简洁灵活。这篇博客总结了一些例子。 …(省略号)用于可变参数(Variadic Arguments),它可以放在模板参数 或 函数参数的…...

websocket学习手册及python实现简单的聊天室

概述 WebSocket 是一种网络通信协议,允许在单个 TCP 连接上进行全双工通信。它最核心的优势就在于实现了持久连接,实现了实时的数据传输。HTTP 协议有一个很大的缺点,通信只能由客户端发起,服务器返回响应后连接就会关闭&#xf…...

论文阅读:2023-arxiv Can AI-Generated Text be Reliably Detected?

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 文章目录 Abstract(摘要)1 Introduction(引言)Conclusion(结论) Can AI-Generated Text be Reliably D…...

Mock接口编写教程-axios-mock-adapter(React)

Mock模拟接口编写教程 直接在前端实现接口模拟 1.第一步 设置模拟接口 // mock.ts import axios from axios import MockAdapter from axios-mock-adapter// 创建一个模拟适配器 const mock new MockAdapter(axios)// 设置模拟接口 export const setupMock () > {mock.…...

react(一):特点-基本使用-JSX语法

初识React React是一个用于构建用户界面的 JavaScript 库,由 Facebook 开发和维护。 官网文档:React 官方中文文档 特点 1.声明式编程 2.组件化开发 3.多平台适配 开发依赖 开发React必须依赖三个库: 1.react:包含react所必…...

golang函数与方法的区别

1.调用方式的区别 函数的调用方式:函数名(参数...) 方法的调用方式: 变量.方法名(参数...) 2.函数的使用 package mainimport "fmt" //函数参数为值类型,调用的时候只能传递值类型数据&#…...

解决 openeuler 系统 docker 下载慢,docker 镜像加速

一、步骤说明 1. 编辑 Docker 配置文件 Docker 的镜像源配置文件路径为 /etc/docker/daemon.json。如果该文件不存在,则需要先创建目录和文件。 # 创建目录(如果不存在) sudo mkdir -p /etc/docker# 编辑配置文件(使用 nano 或…...

Android ARouter的详细使用指南

Android ARouter的详细使用指南。我需要先确定用户的基础,可能他们已经有Android开发经验,但对ARouter不太熟悉。首先,我应该介绍ARouter是什么,解决什么问题,比如模块化中的页面跳转问题。然后,需要分步骤…...

PosterRender 实现微信下程序 分享商品生成海报

PosterRender 是什么 PosterRender 是一种专注于生成高质量海报图像的技术或工具,常用于生成静态图片,特别是适合用于营销、宣传和展示的图形设计。它通常用于在服务端或客户端渲染复杂的图像,包括文字、图形、图标、背景等,生成…...

电机控制常见面试问题(十五)

文章目录 一、电机气隙二、电气时间三.电机三环控制详解四.驱动板跳线意义五.电机开环自检 一、电机气隙 电机气隙是定子和转子之间的空隙,防止钉子转子运转时物理接触,此外,气隙是磁路的重要环节,磁场需通过气隙传递能量&#x…...

基于云漂移优化(Cloud Drift Optimization,CDO)算法的多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码

一、云漂移优化算法 云漂移优化(Cloud Drift Optimization,CDO)算法是2025年提出的一种受自然现象启发的元启发式算法,它模拟云在大气中漂移的动态行为来解决复杂的优化问题。云在大气中受到各种大气力的影响,其粒子的…...

【第9章】亿级电商平台订单系统-整体技术架构设计

1-1 本章导学 课程主题:系统蓝图描绘与整体技术架构设计核心学习内容: ▶️ 订单系统的整体技术架构设计 ▶️ 架构设计核心方法论与实践应用本章核心内容架构 1. 技术预研 架构设计的基础支撑环节关键技术可行性分析与选型依据2. 整体技术架构设计方法与步骤 结构化设计方法…...

harmonyOS NEXT开发与前端开发深度对比分析

文章目录 1. 技术体系概览1.1 技术栈对比1.2 生态对比 2. 开发范式比较2.1 鸿蒙开发范式2.2 前端开发范式 3. 框架特性对比3.1 鸿蒙 Next 框架特性3.2 前端框架特性 4. 性能优化对比4.1 鸿蒙性能优化4.2 前端性能优化 5. 开发工具对比5.1 鸿蒙开发工具5.2 前端开发工具 6. 学习…...

详细介绍GetDlgItem()

书籍:《Visual C 2017从入门到精通》的2.3.8 Win32控件编程 环境:visual studio 2022 内容:【例2.31】在模态对话框上可视化创建树形控件 说明:以下内容大部分来自腾讯元宝。 GetDlgItem() 是 Windows API 中用于获取对话框或父…...

MCU的应用场景:从智能家居到工业控制

MCU的应用场景非常广泛,主要包括以下几个方面: 1. 智能家居 智能照明:通过MCU控制LED灯的亮度和颜色。 智能安防:在安防系统中,MCU用于控制传感器和报警器。 2. 工业控制 PLC(可编程逻辑控制器&…...

docker的使用

时间:2025.3.17 一、当我们想要运行一个容器时,不是在containers处,而是需要在images处找对应容器的镜像 操作步骤: 1.找容器镜像 2.找到容器镜像,通过pull下载到当前主机中 3.下载成功后进行运行 4.运行时的容器镜像…...

Redis hyperloglog学习

背景知识 【伯努利试验】: 【伯努利试验】是一个概率论中的概念,指在相同的条件下重复进行n次独立的试验,每次试验只有两种可能的结果,且这两种结果发生的概率是固定的 抛硬币作为伯努利试验:在抛硬币时,我…...

鸿蒙开发:什么是ArkTs?

前言 本文基于Api13。 一句话解读:ArkTs(方舟编程语言)是目前HarmonyOs应用开发的主力语言。 用官方的话解读,它是一种为构建高性能应用而设计的编程语言;看到以Ts结尾,想必大家应该很容易想到TypeScript&a…...

ArcGIS Pro中加载在线地图的详细指南

在现代制图领域,ArcGIS Pro已成为专业人士的重要工具。它不仅功能强大,而且操作简便,为用户提供了丰富的地图数据资源和灵活的地图加载方式。其中,加载在线地图是ArcGIS Pro的一大特色功能,能够帮助用户快速获取全球范…...

《C++ Primer》学习笔记(四)

第四部分:高级主题 1.tuple 是类似pair的模板。每个pair 的成员类型都不相同,但每个 pair 都恰好有两个成员。每个确定的tuple 类型的成员数目是固定的,但一个 tuple 可以有任意数量的成员。tuple支持的操作如下图: 只有两个 tup…...

CVPR2025自动驾驶端到端前沿论文汇总

自动驾驶 文章目录 自动驾驶前言自动驾驶的轨迹预测论文端到端自动驾驶论文 前言 汇总CVPR2025自动驾驶前沿论文 自动驾驶的轨迹预测论文 Leveraging SD Map to Augment HD Map-based Trajectory PredictionModeSeq: Taming Sparse Multimodal Motion Prediction with Seque…...

使用 jQuery 实现子窗口获取父窗口的值,或者父窗口获取子窗口的值时

HTML 父子窗口通信指南 一、基础概念 在Web开发中,父子窗口通信是一个常见的需求。这通常发生在以下场景: 主页面(父窗口)打开新窗口(子窗口)弹出窗口需要与主页面交互多窗口之间需要数据传递 二、jQue…...

AndroidStudio下载安装,环境部署以及常见问题解决教程(亲测)

AndroidStudio下载安装,环境部署以及常见问题解决!!! 文章目录 前言 一、Android Studio 下载与安装 1.1 系统要求 1.2 下载 Android Studio 1.3 安装 Android Studio Windows 系统 1.4 初始配置 二、环境部署 2.1 安装 …...

ruoyi-vue部署2

3.Node.js 3.1.什么是Node.js 在 Node.js 之前,JavaScript 只能运行在浏览器中,作为网页脚本使用,为网页添加一些特效,或者和服务器进行通信。有了 Node.js 以后,JavaScript 就可以脱离浏览器,像其它编程…...

Flutter项目升级Xcode 16.2之后编译问题

最近好久没升级Xcode了,升级了一下最新的16.2之后。发现Flutter项目在iOS设备上运行不起来了。报错: 查了许多网友也遇到了,其中一个解决方案:https://stackoverflow.com/questions/79118572/xcode-16-and-ios-18-project-not-com…...

Mermaid 子图 + 拖拽缩放:让流程图支持无限细节展示

在技术文档、项目管理和可视化分析中,流程图是传递复杂逻辑的核心工具。传统流程图往往静态且难以适应细节展示,而 Mermaid 与 svg-pan-zoom 的结合,则为这一痛点提供了完美解决方案。本文将深入解析如何通过 Mermaid 的子图(subg…...