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

【Redis】分布式锁的实现

目录

一、本地锁存在的问题

二、redis实现分布式锁原理

三、使用示例

四、锁误删问题

 解决思路

获取锁和释放锁代码优化

五、锁释放的原子性问题

解决思路(Lua脚本)

使用流程

总结


        大家好,我是千语。上期给大家讲了使用悲观锁来解决“一人一单”的并发场景。但上期使用的是一个本地锁,本地锁在集群模式下会失效。具体可以看一下我上一篇博客。


【并发问题】一人一单(悲观锁解决)-CSDN博客


一、本地锁存在的问题

在集群模式下,该项目会启动多个实例,且每个实例都会有各种的jvm。我们上面使用到的锁其实都是本地锁,所以就可能会出现这样的情况:

张三在进行并发地判断自己是否满足一人一单时,第一个请求被分配到了实例A,获取锁并判断到数据库中还没有改商品的订单,可以抢购,但当还没有完全提交事务到数据库时,即使还没有释放锁。

张三发送第二个请求被分配到了实例B,那么用户尝试获取锁时,是可以获取到的。然后判断到数据库没有订单,可以抢单的操作,这样又造成了一个用户抢到了多个订单的操作。

解析:因为每个实例都会有自己的JVM,而JVM里面都会有自己的锁监视器,并且每个实例的锁都是存储在它自己的jvm里面的,所以请求分配到不同的实例,锁监视器监视到的锁都是打开的状态。也就是说我们上面应用锁的方式只是在单机的情况下适用,集群模式下就不适用了。



二、redis实现分布式锁原理

        原理就是使用redis的setnx命令,这个命令是给redis里面set值,但是只有这个键不存在的时候才set,所以我们要获取锁时,setnx一个固定的键,获取锁成功;当其他线程也想要获取锁时,也使用setnx命令,这时候是set不到的,所以这个线程就获取锁失败。当业务执行完释放锁时,就把这个键删除就可以了。

图例:



三、使用示例

@Component
public class RedisLock {@Autowiredprivate RedisTemplate<String, String> redisTemplate;/*** 尝试获取分布式锁* @param lockKey 锁的键* @param expireTime 过期时间* @param timeUnit 时间单位* @return 获取锁成功与否*/public String tryLock(String lockKey, long expireTime, TimeUnit timeUnit) {// 使用setIfAbsent方法尝试获取锁(对应Redis的SETNX命令)Boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, lockValue, expireTime, timeUnit);//设置锁超时时间,避免死锁return locked != null && locked;  //set成功表明获取锁成功}/*** 释放分布式锁* @param lockKey 锁的键* @return 是否释放成功*/public boolean releaseLock(String lockKey) {return redisTemplate.delete(lockKey)}
}

业务中实际加锁操作:


public String lockTest(){String lockKey = "product_stock_lock";try {// 尝试获取锁,超时时间10秒,锁持有时间30秒lockValue = redisLockHelper.tryLock(lockKey, 30, TimeUnit.SECONDS);if (lockValue != null) {// 获取锁成功,执行业务逻辑System.out.println("获取锁成功,处理库存扣减...");// 模拟业务处理Thread.sleep(5000); return "库存扣减成功";} else {// 获取锁失败return "系统繁忙,请稍后重试";}} catch (InterruptedException e) {Thread.currentThread().interrupt();return "操作被中断";} finally {// 释放锁(只有持有锁的线程才能释放)if (lockValue != null) {boolean released = redisLockHelper.releaseLock(lockKey, lockValue);System.out.println("锁释放结果: " + released);}}}



四、锁误删问题

        在上述的使用示例当中,实际上会存在锁误删的问题。具体如下:

  1. 线程1获取锁成功,执行业务代码后阻塞,未执行到手动释放锁的操作,锁超时后自动释放了
  2. 由于锁超时被释放,线程2获取锁成功,执行业务
  3. 线程1阻塞过后,继续执行任务,执行了释放锁操作。但此时锁其实是线程2的,由于没有做判断,线程1执行了释放锁的操作。
  4. 由于锁已经被线程1释放,线程3可以获取锁,执行业务。
  5. 结果:线程2和线程3都同时在执行了只能单个线程执行的业务。

图例:


 解决思路

获取锁时,判断一下标识是否一致;

setnx时,value的值可以设置成当前线程的name或者id

因为线程idjvm里面是自增的,所以在集群模式下,多个jvm可能会存在id相同的线程,所以也是会冲突的,所以id不可行,往下看。

所以可以使用uuid+线程id作为锁的标识

当要释放锁时,先获取锁的值,如果是自己当前的线程id,再进行释放锁


获取锁和释放锁代码优化

@Component
public class RedisLockHelper {@Autowiredprivate RedisTemplate<String, String> redisTemplate;//生成当前锁持有者的唯一标识的uuid前缀private static final String ID_PREFIX= UUID.randomUUID().toString(true) + "-";/*** 尝试获取分布式锁* @param lockKey 锁的键* @param expireTime 过期时间* @param timeUnit 时间单位* @return 锁的唯一标识,获取失败时为null*/public String tryLock(String lockKey, long expireTime, TimeUnit timeUnit) {// 使用UUID前缀+当前线程id作为锁持有者的唯一标识String lockValue = ID_PREFIX + Thread.currentThread().getid();// 使用setIfAbsent方法尝试获取锁(对应Redis的SETNX命令)Boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, lockValue, expireTime, timeUnit);return locked != null && locked ? lockValue : null;}/*** 释放分布式锁* @param lockKey 锁的键* @return 是否释放成功*/public boolean releaseLock(String lockKey) {//获取当前线程的标识String currentThreadLock = ID_PREFIX + Thread.currentThread().getid();// 获取分布式锁内的锁标识String lockValue = redisTemplate.opsForValue().get(lockKey)  //释放锁时,先判断该锁是不是当前线程持有的      if(currentThreadLock.equals(lockValue)) {//如果当前线程是锁的持有者,就释放锁return redisTemplate.delete(lockKey);}else{return false;}}
}

 业务层使用锁的代码不需要修改



五、锁释放的原子性问题

上一个问题是执行业务时线程阻塞,阻塞结束后误删了锁。

所以我们在释放锁前先判断一下标识,看是否是当前线程的锁再释放就可以解决

但是,当我们判断完标识是一致后,线程1在进行释放锁之前被阻塞了(由于这两者不是原子性)

等到锁过期,其他线程成功获取锁执行业务,那么线程1又误删了锁:

图例


解决思路(Lua脚本)

使用Lua脚本,在脚本里面写一系列操作,然后使用redis客户端调用该脚本,这些操作就会一次性执行,满足原子性。


使用流程

(1)创建并填写Lua脚本文件:

注意:Lua脚本是使用lua语言来写的。具体可以去看一下语法内容,下面只给出一种解决思路和大概的解决流程。后续可以使用redission来简化这些操作


(2)读取lua脚本,形成一个RedisScript,便于后续调用api


(3)执行Lua脚本,释放锁


(4)锁使用:

业务中使用锁的方法都不需要边



总结

  1. 分布式锁利用set nx ex的原理。(set nx的互斥性,ex保证超时释放锁,避免死锁)
  2. 释放锁时要看看锁是不是该线程的持有者,避免误删
  3. 使用Lua脚本满足一组操作的原子性

相关文章:

【Redis】分布式锁的实现

目录 一、本地锁存在的问题 二、redis实现分布式锁原理 三、使用示例 四、锁误删问题 解决思路 获取锁和释放锁代码优化 五、锁释放的原子性问题 解决思路&#xff08;Lua脚本&#xff09; 使用流程 总结 大家好&#xff0c;我是千语。上期给大家讲了使用悲观锁来解决…...

【vue】全局组件及组件模块抽离

一、全局组件 只要是实例化过的区域都可以使用 Vue.component("组件名",{ template: 内容} ) 二、组件模块抽离 抽离就是把template的内容写到body里面&#xff0c;然后建立id写到变量下的template里&#xff0c;id变量写到component里 body{ template&#xff1a; …...

手写 vue 源码 === watch 实现

目录 1. watch 的基本使用 2. watch 的整体架构 3. doWatch 函数的实现 3.1 处理不同类型的监听源 3.2 清理副作用的机制 3.3 创建响应式效果 3.4 初始化执行 3.5 返回停止函数 4. watch 如何基于 ReactiveEffect 实现 4.1 依赖收集过程详解 4.2 更新触发过程详解 …...

STM32核心机制解析:重映射、时间片与系统定时器实战——从理论到呼吸灯开发

知识点1【重映射的概念】 1、引入 默认&#xff1a; **定义&#xff1a;**系统或硬件在未经用户修改时的预设配置或行为 STM32的引脚功能、外设配置、中断向量表等默认由芯片设计或库函数预设。 部分重映射 **定义&#xff1a;**仅修改部分资源或地址的映射关系&#xff…...

【Linux网络编程】HTTPS协议原理

目录 一&#xff0c;HTTPS是什么&#xff1f; 1&#xff0c;什么是加密&#xff1f; 2&#xff0c;为什么需要加密&#xff1f; 3&#xff0c;常见的加密方式 对称加密 非对称加密 4&#xff0c;数据摘要&&数据指纹 二&#xff0c;HTTPS协议加密方案 方案一&a…...

【idea】快捷键ctrl+shift+F(Find in files)不起作用

问题描述 在idea中使用快捷键CtrlShiftF&#xff0c;进行内容的搜索&#xff0c;但是弹不出对话框、或有时候能弹出有时候又弹不出。 原因分析 1.怀疑是缓存问题&#xff1f;--清空缓存重启也没什么作用 2.怀疑是idea的问题&#xff1f;--有时行、有时不行&#xff0c;而且…...

「光域」系列激光测距传感器:以光为尺,重构空间认知边界

在150米深的地下矿井中&#xff0c;无人矿卡需要精准识别前方3厘米的落石&#xff1b;在千米高空的风电塔筒检测现场&#xff0c;工程师手持设备要穿透50米雾霭锁定0.1毫米的形变&#xff1b;在智能仓储的立体库房里&#xff0c;穿梭车需在0.3秒内完成货架间距的毫米级校准………...

http和https的区别

HTTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;超文本传输安全协议&#xff09;是互联网上用于传输数据的两种协议&#xff0c;它们的主要区别如下&#xff1a; 1. 安全性 HTTP&#xff1a;明文传输&#xff0c;数据在传输过程中不加密&#xff0c;容易被窃…...

Dapp开发-如何开发一个dapp

DApp开发全流程指南&#xff1a;从需求到落地的技术实践与生态构建 ——2025年去中心化应用开发方法论与未来趋势解析 一、需求定位与架构设计&#xff1a;构建DApp的技术地基 需求精准定位 功能定义&#xff1a;明确DApp的核心场景&#xff08;如DeFi借贷、NFT交易、DAO治理&…...

Python邮件处理(使用imaplib和email库实现自动化邮件处理)

在日常工作中&#xff0c;我们经常需要自动化处理电子邮件&#xff0c;比如自动下载附件、解析邮件内容、处理特定格式的数据等。本文将通过一个实际案例&#xff0c;详细介绍如何使用Python的imaplib和email库来实现邮件的自动化处理。 目录 环境准备与库介绍IMAP邮件服务器连…...

时空注意力机制深度解析:理论、技术与应用全景

时空注意力机制作为深度学习领域的关键技术&#xff0c;通过捕捉数据在时间和空间维度上的依赖关系&#xff0c;显著提升了时序数据处理和时空建模能力。本文从理论起源、数学建模、网络架构、工程实现到行业应用&#xff0c;系统拆解时空注意力机制的核心原理&#xff0c;涵盖…...

鸿蒙 UIAbility组件与UI的数据同步和窗口关闭

使用 EventHub 进行数据通信 根据 Stage 模型概念图 UIAbility 先于 ArkUI Page 创建 所以&#xff0c;事件要先 .on 订阅 再 emit 发布 假如现在有页面 Page1 和他的 UIAbility // src/main/ets/page1ability/Page1Ability.ets onCreate(want: Want, launchParam: Ability…...

UI-TARS: 基于视觉语言模型的多模式代理

GitHub&#xff1a;https://github.com/bytedance/UI-TARS 更多AI开源软件&#xff1a;发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI 基于视觉语言模型&#xff08;Vision-Language Model&#xff09;的 GUI 代理应用&#xff0c;允许用户通过自然语言控制电脑操…...

C++多态讲解

1. 多态的概念 通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态就是函数重载和函数模板&#xff0c;他们传不同的类型的参数就可以调用不同的函数&#xff0c;通过参数的不同达到多种形态&#xff0c;之所以叫编译时多态&…...

QuecPython+蜂窝模组基础开发

开发准备 硬件&#xff1a; 一块 QuecPython_EC2X_EVB 开发板 (以该开发板为例&#xff0c;更多开发板介绍参见下文开发板列表)USB 数据线 (USB-A TO USB-C)PC (Windows10) 蜂窝模组开发板列表: EC2X_EVBEC600X_EVBEC800X_EVBEC600X/EC800X_CORE_EVBBG95_EVBEC200X_EVBEG91…...

-MAC桢-

MAC桢和IP的关系&#xff1a; 主机A想跨网络和B通信需要IP地址进行路由选择&#xff0c;但一个局域网&#xff0c;比如路由器进行路由选择之前&#xff0c;首先要将数据包发送给路由器B&#xff0c;也就是局域网通信也就是同一个网段的主机进行通信&#xff0c;所以必须通过mac…...

反转链表 - 简单

************* C topic: 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; ************* Give the topic an inspection. It seems really easy. At very first, I think that I will use reverse cammand to kill this topic. But a few seconds later I found that…...

负载均衡 ELB 在 zkmall开源商城高流量场景下的算法优化

在电商大促、直播带货等高频交易场景下&#xff0c;流量突发增长对系统稳定性提出严峻挑战。ZKmll 开源商城通过对负载均衡 ELB&#xff08;Elastic Load Balancer&#xff09;算法的深度优化&#xff0c;结合业务场景特性设计动态加权轮询 地域感知 热点分流的混合策略&…...

YOLOv5推理代码解析

代码如下 import cv2 import numpy as np import onnxruntime as ort import time import random# 画一个检测框 def plot_one_box(x, img, colorNone, labelNone, line_thicknessNone):"""description: 在图像上绘制一个矩形框。param:x: 框的坐标 [x1, y1, x…...

创建三个网络,分别使用RIP、OSPF、静态,并每个网络10个电脑。使用DHCP分配IP

DHCP 自动分配IP&#xff0c;集中管理&#xff0c;提高效率 在路由器中设置 Router>en Router#conf t Router(config)#ip dhcp pool ip30 //创建DHCP地址池 Router(dhcp-config)#network 192.168.30.0 255.255.255.0 // 配置网络地址和子网掩码 Router(dhcp-config)#defa…...

[网络层]网络层设备路由器

路由表 路由器能进行路由转发&#xff0c;所依靠的核心数据结构就是路由表&#xff0c;那么路由表是怎么来的&#xff0c; 静态路由和动态路由&#xff1a; 说的是表项&#xff0c;这个表项是静态的还是动态的&#xff0c;就跟ARP缓存表的表项静态动态是一回事&#xff0c; …...

Maven 项目中将本地依赖库打包到最终的 JAR 中

文章目录 前言详细步骤 前言 在现代后端开发中&#xff0c;构建高效且可扩展的 Web 应用程序通常依赖于多种第三方库和内部依赖。这些依赖可以来自公共仓库&#xff0c;也可能是公司内部自研的库或尚未发布到公共仓库的 JAR 包。本文将详细介绍如何在 Maven 项目中处理本地依赖…...

大模型的Lora如何训练?

大模型LoRA(Low-Rank Adaptation)训练是一种参数高效的微调方法,通过冻结预训练模型权重并引入低秩矩阵实现轻量化调整。以下是涵盖原理、数据准备、工具、参数设置及优化的全流程指南: 一、LoRA的核心原理 低秩矩阵分解 在原始权重矩阵$ W 旁添加两个低秩矩阵 旁添加两个…...

CSS3 伪类和使用场景

CSS3 伪类&#xff08;Pseudo-classes&#xff09;大全 CSS3 引入了许多新的伪类&#xff0c;以下是完整的 CSS3 伪类分类列表&#xff08;包括 CSS2 的伪类&#xff09;&#xff1a; 一、结构性伪类&#xff08;Structural Pseudo-classes&#xff09; 这些伪类根据元素在文…...

GitDiagram - GitHub 仓库可视化工具

GitDiagram - GitHub 仓库可视化工具 项目链接&#xff1a;https://github.com/ahmedkhaleel2004/gitdiagram 将任何 GitHub 仓库转换为交互式架构图&#xff0c;只需替换 URL 中的 hub 为 diagram。 ✨ 核心功能 即时可视化&#xff1a;将代码库结构转换为系统设计/架构图…...

[特殊字符] 本地大模型编程实战(29):用大语言模型LLM查询图数据库NEO4J(2)

本文将基于langgraph框架&#xff0c;用LLM查询NEO4J图数据库&#xff0c;构建可定制、能应对复杂场景的工作流&#xff01; &#x1f31f; 核心亮点 是否用户提问是否电影相关?生成Cypher查询直接回答执行查询生成最终答案 &#x1f9e9; 模块化实现 1️⃣ 定义状态机 from …...

Python中操作Neo4j图数据库

在当今数据驱动的时代&#xff0c;关系型数据库在处理高度关联的数据时常常显得力不从心。图数据库&#xff0c;尤其是Neo4j&#xff0c;以其独特的图结构和高效的关系查询能力&#xff0c;成为了解决这一问题的利器。结合Python的简洁与强大&#xff0c;我们可以更高效地构建和…...

人工智能时代:解锁职业新身份,从“认证师”到“工程师”的进阶之路

在人工智能技术浪潮席卷全球的今天,技术的飞速迭代正在重塑职业版图。从算法优化到伦理决策,从系统测试到应用开发,AI技术不再只是程序员的专属领域,而是成为各行各业从业者必须掌握的“生存技能”。当企业争相布局AI赛道,个人如何在这场变革中抢占先机?答案或许藏在两个…...

浙江大学 deepseek 公开课 第三季 第3期 - 陈喜群 教授 (附PPT下载) by 突破信息差

浙江大学DeepSeek系列公开课第三季重磅开启&#xff0c;特邀该校多领域权威学者联袂主讲。课程聚焦AI技术如何重构基础学科研究范式&#xff0c;深度解码以DeepSeek为代表的智能模型在交叉学科中的创新应用。在"XAI"融合浪潮下&#xff0c;学术大咖将剖析传统学科与人…...

企业级商城系统容器化部署技术方案

容器化部署已成为企业级商城系统构建高可用、弹性架构的核心技术。结合行业实践与技术趋势&#xff0c;以下从架构设计、工具链选型、关键挑战及解决方案等维度&#xff0c;提供一套完整的实施技术方案&#xff1a; 一、架构设计与技术选型 微服务架构拆分 服务拆分原则&#x…...

Java设计模式之适配器模式:从入门到精通

适配器模式(Adapter Pattern)是Java中最常用的结构型设计模式之一,它像一座桥梁连接两个不兼容的接口,使得原本由于接口不兼容而不能一起工作的类可以协同工作。本文将全面深入地解析适配器模式,从基础概念到高级应用,包含丰富的代码示例、详细注释、使用场景分析以及多维对…...

Spark,RDD中的转换算子

RDD中的转换算子 map算子 对数字1-10进行乘除&#xff0c;*2 filter算子 对数字1-10进行过滤&#xff0c;过滤出偶数 filatMap算子 对单词进行拆分 reduceByKey算子 对具有相同键的所有值进行聚合操作 统计词频词频统计简洁写法 ———————————————— 版权声明…...

牛客周赛 Round 92(再现京津冀蓝桥杯???)

1. 小红的签到题 现在小红希望你写出一个长度为 nnn 的、使用了下划线命名法命名的变量。为了显出特征&#xff0c;请保证该变量至少由两个单词组成。 输入描述: 输入一个正整数 n(3≦n≦100)&#xff0c;代表需要构造的变量长度。 输出描述: 输出一个长度为 n 的字符串&#x…...

React 18 的新功能:构建高性能应用的革新之道

React 18 的发布标志着前端开发进入了一个全新的并发时代。作为 React 历史上最重要的版本之一&#xff0c;它不仅带来了底层架构的深度重构&#xff0c;更通过一系列创新功能重新定义了现代 Web 应用的开发范式。这些特性在保持向后兼容的同时&#xff0c;为开发者提供了前所未…...

Python-Flask-Dive

Python-Flask-Dive 适用Python编写一个Flask的快速上手模板&#xff0c;后续如果需要使用Python快速进行we端的验证可以直接下载使用 1-项目创建 本项目仓库代码地址&#xff1a;https://gitee.com/enzoism/python_flask_dive 1-Python环境 ## 1-空工程初始化环境 mkdir my_pr…...

热门CPS联盟小程序聚合平台与CPA推广系统开发搭建:助力流量变现与用户增长

一、行业趋势&#xff1a;CPS与CPA模式成流量变现核心 在移动互联网流量红利见顶的背景下&#xff0c;CPS&#xff08;按销售付费&#xff09;和CPA&#xff08;按行为付费&#xff09;模式因其精准的投放效果和可控的成本&#xff0c;成为企业拉新与用户增长的核心工具。 CPS…...

16.three官方示例+编辑器+AI快速学习webgl_buffergeometry_lines_indexed

本实例主要讲解内容 这个Three.js示例展示了如何使用**索引几何体(Indexed Geometry)**创建复杂的分形线条图案。通过递归算法生成科赫雪花(Koch Snowflake)曲线&#xff0c;并利用索引缓冲区优化顶点数据存储&#xff0c;实现高效的线条渲染。 核心技术包括&#xff1a; 索…...

PowerBI基础

一、前言 在当今数据驱动的时代&#xff0c;如何高效地整理、分析并呈现数据&#xff0c;已成为企业和个人提升决策质量的关键能力。Power BI 作为微软推出的强大商业智能工具&#xff0c;正帮助全球用户将海量数据转化为直观、动态的可视化洞察。数据的世界充满可能性&#xf…...

【MCP】魔搭社区MCP服务(高德地图、everything文件搜索)

【MCP】魔搭社区MCP服务&#xff08;高德地图、everything文件搜索&#xff09; 1、上手使用2、环境配置&#xff08;1&#xff09;cherry-studio配置&#xff08;2&#xff09;添加魔搭大模型服务&#xff08;如果已经设置了其他大模型服务&#xff0c;可跳过&#xff09;&…...

适合大数据和宽表的数据存储和分析场景的数据库

适合大数据和**宽表(wide table)**的数据存储和分析场景的数据库,通常需要具备以下几个特性: 支持高吞吐量的写入和读取;能处理百万级列或数百列的宽表结构;良好的压缩和分区能力;支持分布式扩展和容错;一定程度的 SQL 支持或灵活的查询引擎。✅ 推荐数据库类型及代表产…...

ORB特征点检测算法

角点是图像中灰度变化在两个方向上都比较剧烈的点。与边缘&#xff08;只有一个方向变化剧烈&#xff09;或平坦区域&#xff08;灰度变化很小&#xff09;不同&#xff0c;角点具有方向性和稳定性。 tips:像素梯度计算 ORB算法流程简述 1.关键点检测&#xff08;使用FAST…...

Node和npm初学

了解Node和npm 目录 ​1. 什么是 npm?​ 2. npm有哪些使用场景?​ 3. npm有什么核心特性?​ 4.npm的常用命令有那些? 5. 关键配置文件是什么?​ ​6. 安全与最佳实践​ 7.什么是 Node.js?​ 8.Node.js有什么优势? 9.如何安装和下载? 10.如何验证安装成功?…...

【android bluetooth 案例分析 03】【PTS 测试 】【PBAP/PCE/SGSIT/SERR/BV-01-C】

1. PBAP/PCE/SGSIT/OFFS/BV-01-C 1. 测试项说明&#xff1a; Please initiate a GATT connection over BR/EDR to the PTS.Description: Verify that the Implementation Under Test (IUT) can initiate GATT connect request over BR/EDR to PTS.测试项名称&#xff1a; Ple…...

VIC-2D 7.0 为平面样件机械试验提供全视野位移及应变数据软件

The VIC-2D系统是一个完全集成的解决方案&#xff0c;它基于优化的相关算法为平面试样的力学测试提供非接触、全场的二维位移和应变数据&#xff0c;可测量关注区域内的每个像素子集的面内位移&#xff0c;并通过多种张量选项计算全场应变。The VIC-2D 系统可测量超过 2000%变形…...

深入理解Embedding Models(嵌入模型):从原理到实战(下)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是 Embedding 2、什么是嵌入模型 二、构建嵌入…...

labview硬件采集

(1)硬件的描述 &#xff08;2&#xff09;实验步骤1&#xff1a; &#xff08;3&#xff09;实验步骤2 库名/路径的选择要使用32位的开发资料 &#xff08;4&#xff09;实验步骤3 &#xff08;5&#xff09;实验步骤4 找到DoSetV12() 设置返回类型 设置chan 设置state labv…...

自动驾驶技术栈——DoIP通信协议

一、DoIP协议简介 DoIP&#xff0c;英文全称是Diagnostic communication over Internet Protocol&#xff0c;是一种基于因特网的诊断通信协议。 DoIP协议基于TCP/IP等网络协议实现了车辆电子控制单元(ECU)与诊断应用程序之间的通信&#xff0c;常用于汽车行业的远程诊断、远…...

uniapp引入七鱼客服微信小程序SDK

小程序引入七鱼sdk 1.微信公众平台引入2.代码引入3.在pagesQiyu.vue初始化企业appKey4.跳转打开七鱼客服 1.微信公众平台引入 账号设置->第三方设置->添加插件->搜索 QIYUSDK ->添加 2.代码引入 在分包中引入插件 "subPackages": [{"root":…...

【SSM-SpringMVC(二)】Spring接入Web环境!本篇开始研究SpringMVC的使用!SpringMVC数据响应和获取请求数据

SpringMVC的数据响应方式 页面跳转 直接返回字符串通过ModelAndView对象返回 回写数据 直接返回字符串返回对象或集合 页面跳转&#xff1a; 返回字符串方式 直接返回字符串&#xff1a;此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转 RequestMapping("/con&…...

【AXI总线专题】AXI-FULL-Master

【AXI总线专题】AXI-FULL-Master 1.axi-full概述2.信号定义3.测试4.仿真波形5.附录clogb2函数axi4中的一些参数解释wishbone总线 6.工程文件 概述 参考文档&#xff1a; 《3-2-03米联客2022版AXI4总线专题-20211123.pdf》 《IHI0022E_amba_axi_and_ace_protocol_spec.pdf》 1.a…...