分布式锁的实现方案有哪些?各自的原理是怎样的?使用场景有哪些?与单体架构中锁区别?存在哪些问题?如何解决?注意事项?
一、分布式锁的实现方案
分布式锁的实现方案主要包括以下几种:
基于数据库的分布式锁:
- 利用数据库的事务特性来实现锁功能。
- 在数据库中创建一个具有唯一约束的锁表,加锁时插入一行记录,释放锁时删除这行记录。
- 简单易用,但性能可能受数据库性能的限制。
- 原理:利用数据库的唯一性约束和事务特性来实现锁功能。当需要加锁时,向数据库中插入一条记录,如果插入成功则表示获取锁成功;如果插入失败(由于唯一性约束导致),则表示锁已被其他进程持有。释放锁时,通过删除这条记录来实现。
基于Redis的分布式锁:
- Redis提供了丰富的数据结构和原子操作,非常适合实现分布式锁。
- 常见的实现方式是使用Redis的SETNX命令,通过设置键值对来实现锁的获取和释放。
- 可以结合EXPIRE命令设置锁的过期时间,以防止死锁的发生。
- 具体方案包括:SETNX + EXPIRE、SETNX + value值是(系统时间+过期时间)、使用Lua脚本(包含SETNX + EXPIRE两条指令)、SET的扩展命令(SET EX PX NX)等。
- 原理:Redis提供了丰富的数据结构和原子操作,适合实现分布式锁。常见的实现方式是使用Redis的SETNX命令,该命令在键不存在时设置键值对。通过SETNX命令的返回值可以判断锁是否被成功获取。同时,为了防止死锁,可以使用EXPIRE命令为锁设置过期时间。另一种方式是使用Lua脚本将SETNX和EXPIRE命令合并为一个原子操作,以确保加锁的原子性。
基于Zookeeper的分布式锁:
- Zookeeper是一个分布式的、开放源码的分布式应用程序协调服务。
- 提供了简单的原语集,用于实现一致性分布式锁。
- 通过在Zookeeper中创建临时顺序节点,并监听节点的变化事件,可以实现分布式锁的获取、释放和续约等功能。
- 原理:Zookeeper是一个开源的分布式协调服务,提供了分布式锁的实现。通过创建临时顺序节点来模拟锁的功能。当需要加锁时,在Zookeeper中创建一个临时顺序节点,并监听节点的变化事件。根据节点的顺序可以判断当前进程是否获取锁成功。释放锁时,删除对应的临时节点即可。
基于消息队列的分布式锁:
- 通过在消息队列中发布锁请求和释放请求,可以实现多个节点之间的同步。
- 适用于高并发场景,但需要注意消息队列的性能和可靠性。
基于Etcd的分布式锁
- 原理:Etcd是一个开源的分布式键值存储系统,也提供了分布式锁的实现。其原理是通过创建一个带有TTL(Time To Live)的键值对来实现锁的功能。当需要加锁时,尝试创建这个键值对,如果创建成功则表示获取锁成功;如果创建失败(由于键已存在),则表示锁已被其他进程持有。锁的释放通过删除这个键值对来实现。同时,TTL可以确保锁在一定时间后自动释放,防止死锁的发生。
二、分布式锁的使用场景
分布式锁在分布式系统中扮演着至关重要的角色,其使用场景包括但不限于:
- 电商或零售业务中的库存扣减:多个用户可能同时尝试购买同一商品,为了防止库存超卖,需要在扣减库存时加锁。
- 订单状态更新:在订单处理系统中,需要对订单状态进行更新,如从“待支付”变为“已支付”。如果多个服务实例同时处理同一个订单,可能会导致订单状态不一致。使用分布式锁可以确保在同一时间内只有一个服务实例能够修改订单状态。
- 第三方接口访问控制:在需要获取第三方接口访问令牌(如access_token)的场景中,由于令牌有有效期,且多个节点可能同时发起请求,因此需要使用分布式锁来确保只有一个节点能够获取并更新令牌。
- 跨服务事务操作:在需要跨多个服务或数据库进行事务操作的场景中,分布式锁可以用来协调事务的提交或回滚。
- 分布式缓存更新:在分布式缓存系统中,多个服务实例可能会同时访问和修改缓存中的数据。使用分布式锁可以确保同一时间只有一个服务实例能够修改缓存数据。
- 分布式任务调度:在分布式任务调度系统中,可能需要确保同一任务不会在多个节点上同时执行。使用分布式锁可以锁定任务的执行权,确保任务的原子性执行。
- 配置中心更新:在微服务架构中,配置中心用于管理服务的配置信息。当配置信息发生变更时,需要通知所有服务实例进行更新。为了防止配置更新过程中的冲突和不一致问题,可以使用分布式锁来控制配置更新的顺序和一致性。
三、分布式锁与单体架构中锁的区别
分布式锁与单体架构中的锁在多个方面存在显著差异:
应用场景:
- 单体架构中的锁主要用于解决单个应用内部多个线程之间的同步问题。
- 分布式锁则用于解决分布式系统中多个服务或进程间对共享资源的安全访问问题。
实现方式:
- 单体架构中的锁通常使用Java等编程语言提供的内置锁机制(如synchronized、Lock等)来实现。
- 分布式锁则需要使用分布式系统中的特定技术(如Redis、Zookeeper等)来实现。
复杂性:
- 单体架构中的锁实现相对简单,因为所有线程都在同一个JVM内运行,可以直接使用JVM提供的锁机制。
- 分布式锁的实现则更加复杂,需要考虑网络延迟、节点故障、数据一致性等多个因素。
性能:
- 单体架构中的锁由于所有线程都在同一个JVM内运行,因此性能通常较高。
- 分布式锁则可能受到网络延迟、节点性能等多个因素的影响,性能可能相对较低。
四、分布式锁存在的问题
锁的误删问题:
- 场景描述:线程1拿到锁后产生了业务阻塞,此时锁可能已经超时释放,线程2可以拿到锁。当线程1业务执行完毕后,可能会误删线程2的锁。
- 解决方案:在释放锁时进行判断,确认锁是否属于自己的。这可以通过在加锁时将当前线程的唯一标识(如线程ID或UUID)作为锁的值,并在释放锁时检查这个值是否匹配来实现。
原子性问题:
- 场景描述:线程在判断锁是否属于自己的和释放锁这两个操作之间可能存在其他操作(如JVM垃圾回收导致的阻塞),这可能导致锁超时释放或误删其他线程的锁。
- 解决方案:使用Lua脚本等原子性操作来确保判断和释放锁的这两个操作是原子的。Lua脚本可以在Redis服务器上执行一系列操作,这些操作要么全部成功,要么全部失败,从而保证了原子性。
网络延迟问题:
- 场景描述:在高并发场景下,网络延迟可能导致锁获取时间变长,甚至可能导致一些线程在超时前无法获取锁。
- 解决方案:优化网络环境,使用更高效的网络通信协议。同时,在分布式锁的实现中,可以设置合理的超时时间和重试机制来处理网络延迟问题。
时钟偏移问题:
- 场景描述:不同的分布式节点可能存在时钟偏移,导致锁的过期时间计算错误。
- 解决方案:定期校准分布式节点的系统时钟,确保它们之间的一致性。此外,在分布式锁的实现中,可以使用相对时间(如当前时间加上一个固定的时间间隔)来设置锁的过期时间,以减少时钟偏移的影响。
单点故障问题:
- 场景描述:如果分布式锁的实现只依赖于一个节点(如单个Redis实例),那么该节点的故障将导致锁服务不可用。
- 解决方案:使用分布式锁的多实例配置,增加冗余节点来提高可用性。例如,在Redis分布式锁的实现中,可以使用多个Redis实例来构成Redlock算法所需的多个资源节点。
宕机重启问题:
- 场景描述:如果持有锁的节点在宕机重启后未能正确释放锁,可能导致其他节点无法获取锁。
- 解决方案:在节点宕机重启后,确保重启时间大于锁的过期时间,或者使用持久化机制来保留锁信息。此外,在分布式锁的实现中,可以引入锁的超时重试机制,以便在节点宕机重启后能够重新获取锁。
脑裂问题:
- 场景描述:在网络分区或节点故障的情况下,可能导致多个客户端同时竞争同一把锁但最终全部失败。
- 解决方案:优化网络分区处理策略,确保在分区发生时能够正确处理锁请求。例如,在Redis分布式锁的实现中,可以使用Redlock算法来避免脑裂问题的发生。Redlock算法通过多个Redis实例的协作来确保锁的可靠性和一致性。
五、分布式锁解决方案的注意事项
选择合适的分布式锁实现方案:
- 根据业务需求和系统架构选择合适的分布式锁实现方案。例如,对于需要高性能和高可用性的系统,可以选择基于Redis的分布式锁实现;对于需要强一致性的系统,可以选择基于Zookeeper的分布式锁实现。
合理设置锁的过期时间:
- 在设置锁的过期时间时,需要综合考虑业务处理时间、网络延迟、节点性能等因素。确保锁的过期时间足够长以避免因业务处理时间过长而导致的锁失效问题,但也不能过长以避免因节点故障而导致的锁长时间无法释放的问题。
优化锁的释放机制:
- 在释放锁时,需要确保释放操作的正确性和原子性。可以使用Lua脚本等原子性操作来确保释放锁时不会误删其他线程的锁。
监控和报警:
- 对分布式锁的使用情况进行监控和报警。当出现异常情况(如锁无法获取、锁长时间未释放等)时,能够及时发出报警并采取相应的处理措施。
综上所述,分布式锁在分布式系统中具有广泛的应用场景和重要的价值。与单体架构中的锁相比,分布式锁在实现方式、复杂性、性能等方面都存在显著差异。因此,在设计和实现分布式系统时,需要充分考虑分布式锁的特点和需求,选择合适的实现方案来确保系统的正确性和性能。
相关文章:
分布式锁的实现方案有哪些?各自的原理是怎样的?使用场景有哪些?与单体架构中锁区别?存在哪些问题?如何解决?注意事项?
一、分布式锁的实现方案 分布式锁的实现方案主要包括以下几种: 基于数据库的分布式锁: 利用数据库的事务特性来实现锁功能。在数据库中创建一个具有唯一约束的锁表,加锁时插入一行记录,释放锁时删除这行记录。简单易用…...
企业如何落地搭建商业智能BI系统
随着新一代信息化、数字化技术的应用,引发了新一轮的科技革命,现代化社会和数字化的联系越来越紧密,数据也变成继土地、劳动力、资本、技术之后的第五大生产要素,这一切都表明世界已经找准未来方向,前沿科技也与落地并…...
python学习——元组的创建于删除
在 Python 中,元组(tuple)是一种内置的数据类型,用于存储不可变的有序元素集合。以下是关于 Python 元组的一些关键点: 文章目录 定义元组1. 使用圆括号 ()2. 使用 tuple() 函数3. 使用单个元素的元组4. 不使用圆括号…...
智能化图书馆导航系统方案之系统架构与核心功能设计
hello~这里是维小帮,点击文章最下方获取图书馆导航系统解决方案!如有项目需求和技术交流欢迎大家私聊我们~撒花! 针对传统图书馆在图书查找困难、座位紧张、空间导航不便方面的问题,本文深入剖析了基于高精度定位、3D建模、图书搜…...
Linux网络——IO模型和多路转接
通常所谓的IO,其本质就是等待通信和进行通信,即IO 等 拷贝。 那么想要做到高效的IO,就要在单位时间内,减少“等”的比重。 一.五种IO模型 阻塞 IO: 在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方…...
浅谈网络 | 应用层之HTTP协议
目录 HTTP 请求的准备HTTP 请求的构建HTTP 请求的发送过程HTTP 返回的构建HTTP 2.0QUIC 协议HTTP 3.0 在讲完传输层之后,我们接下来进入应用层的内容。应用层的协议种类繁多,那从哪里开始讲起呢?不妨从我们最常用、最熟悉的 HTTP 协议 开始。…...
【CSS】页面滚动到一定位置时,指定区域固定不变
一. 需求 移动端:下滑时,当下滑到一定位置时,指定区域不跟随下滑-【固定跟随区域】一直在顶部效果 (1)未滚动前 (2)滚动后 二. 实现 <template><div class"global-application…...
瀚高创库建表pgsql
1.瀚高下载地址: 下载 (highgo.com)https://www.highgo.com/down_main.html 2.瀚高linux安装 上传deb文件到ubuntu系统中 执行 dpkg -i hgdb-see-4.5.8-fe4791c.x86_64.deb 命令安装数据库 安装完成后,会在/opt 目录下生成安装目录 数据库安装完毕后…...
Vim 高级操作与技巧指南
在上一篇文章中,我们了解了 Vim 的基本操作和模式,掌握了如何进行文件编辑、光标移动、文本操作等基本技能。现在,我们将深入探讨 Vim 的一些高级功能,包括插件管理、脚本编写、定制快捷键等内容,以进一步提高你的工作…...
Vue3.0里为什么要用 Proxy API 替代 defineProperty API ?
Vue 3.0 之所以使用 Proxy API 替代 Object.defineProperty,主要是为了提升性能、减少代码复杂性,并解决 Vue 2.x 在响应式处理中的一些局限性。下面我们通过对比这两种方式的工作原理、优缺点,并结合实际项目代码示例来详细讲解。 1. Object.defineProperty 的局限性 在 …...
【基于规则】n-sigma
在正态分布中: 约68%的数据点会落在均值1σ的范围内约95%的数据点会落在均值2σ的范围内约99.7%的数据点会落在均值3σ的范围内这称为68-95-99.7法则(Empirical Rule)。 假设我们有一组数据,其均值为μ,标准差为σ。某个数据点x的n-sigma计算公式如下: 若z=1.2,说明该…...
JavaScript 判断字符串是否包含子字符串的几种方法
这里写目录标题 方法 1: 使用 includes()方法 2: 使用 indexOf()方法 3: 使用正则表达式方法 4: 使用 search()方法 5: 用 startsWith() 或 endsWith()推荐使用 JavaScript 判断字符串是否包含子字符串,不要只知道 indexOf() ,还可以尝试一下其他写法。 …...
goframe框架bug-记录
implement not found for interface ICompany, forgot register? 错误解决检查: 1.有没有init 2. 注入问题 3. 注入问题...
Docker:在 ubuntu 系统上生成和加载 Docker 镜像
本文将介绍在 ubuntu系统上进行 Docker 镜像的生成和加载方法和代码。 文章目录 一、下载和安装 docker二、加载 docker 文件三、保存你的镜像四、将镜像上传到云端并通过连接下载和加载 Docker 镜像五、Docker 容器和本地的文件交互5.1 从容器复制文件到本地宿主机5.1.1 单个文…...
长时间无事可做是个危险信号
小马加入的是技术开发部,专注于Java开发。团队里有一位姓隋的女同事,是唯一的web前端工程师,负责页面开发工作,比小马早两个月入职。公司的项目多以定制化OA系统为主,后端任务繁重,前端工作相对较少。在这样…...
【小白学机器学习39】如何用numpy生成总体,生成样本samples
目录 1 目的:研究 样本和总体之间的关系 2 先生成1个理论总体 2.0 下面是关于这一步的完整代码 2.1 一般情况下,我们先生成一个符合正态分布的总体 2.1.1 设置总体 ,或者说生成一个总体 2.2 为什么一定要是一个符合正态分布的总体&…...
redis的主从复制
redis主从复制 一、主从复制概念二、主从模式运行原理2.1主从复制的演示:2.2查看主从结构信息:2.3AOF文件对主从关系的影响2.4主从节点建立复制流程图 三、主从复制的拓扑结构3.1 一主一从结构3.2 一主多从结构3.3 树形主从结构 四、数据同步psync4.1全量…...
数据结构与算法(排序算法)
排序的概念 1. 排序是指将一组数据,按照特定的顺序进行排列的过程。 2. 这个过程通常是为了使数据更加有序,从而更容易进行搜索、比较或其他操作。 常见的排序算法 插入排序 1. 把待排序的记录,按其关键码值的大小,逐个插入到一…...
极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【三】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
三格电子—EtherNet IP转Modbus RTU网关
EtherNet/IP转Modbus RTU网关 SG-EIP-MOD-210 产品用途 SG-EIP-MOD-210网关可以实现将Modbus接口设备连接到 EtherNet/IP网络中。用户不需要了解具体的Modbus和 EtherNet/IP协议即可实现将Modbus设备挂载到 EtherNet/IP接口的PLC上,并和Modbus设备进行数据交互。拓…...
centos7下安装haproxy2.2
1、安装epel yum install epel-release2、下载并安装ius的centos7软件镜像 wget https://repo.ius.io/ius-release-el7.rpm rpm -ivh ius-release-el7.rpm3、安装haproxy yum search haproxy yum install haproxy224、启动服务 systemctl status haproxy systemctl start h…...
Spring Boot英语知识网站:安全与维护
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了英语知识应用网站的开发全过程。通过分析英语知识应用网站管理的不足,创建了一个计算机管理英语知识应用网站的方案。文章介绍了英语知识应用网站的系…...
PHP实现终端表格提取
背景 刚开始使用restic想要获取终端的输出数据,默认的终端信息如下示例 restic snapshotsrepository 5816ba52 opened (version 2, compression level auto) ID Time Host Tags Paths Size ------------------------------------…...
c++ 拓扑排序
概念 拓扑排序是一种线性排序算法,主要用于有向无环图 (DAG, Directed Acyclic Graph) 中,对顶点进行排序,使得对于每一条边 u→v,顶点 u 都排在顶点 v之前。 特点 适用于有向无环图。 拓扑排序的结果不唯一(如果有…...
Vue3的双向数据绑定
如果你有多个 ref 类型的数据需要在父子组件之间实现双向绑定,可以使用 v-model 来进行多个数据的双向绑定。在 Vue 3 中,v-model 默认是针对 modelValue 的,但你可以通过指定自定义的属性名来实现多个双向绑定。 多个 v-model 双向绑定的实…...
android-sdk 安装脚本、android-sdk(和platform-tools)国内镜像
android-sdk国内镜像 https://mirrors.cloud.tencent.com/AndroidSDK/ android-sdk安装脚本 android-sdk 安装脚本 androidSdk_install.sh #!/bin/bash #[描述] android-sdk 安装# set -eu shopt -s expand_aliasesAndroid_SDK_D/app5/android-sdk-home/JAVA17_D/app/zulu17…...
SAR ADC 系列16:基于运放的高精度比较器
高精度比较器的设计目标 静态开环运放比较器 共模为,Id*R1,不稳定,随Id和R1变化。 正反馈。Vin增加,Vout-减小 推推推推推,Vout-又减小,正反馈 同时,MP2 < MP1 时,增益提升。MP…...
spring boot 调用C#封装的DLL文件中的函数
1、C#方法 using Infrastructure; using System.Runtime.InteropServices; using System.Text; using System.Text.Json;namespace PH.Resistance;/// <summary> /// 预热器 阻力计算 /// </summary> public class PHResistance {private double? C1_outlet_YP01…...
《C++ 与神经网络:自动微分在反向传播中的高效实现之道》
在深度学习蓬勃发展的今天,神经网络成为了众多领域的核心技术驱动力。而反向传播算法作为训练神经网络的关键手段,其背后的自动微分技术的高效实现尤为重要,特别是在 C 这样追求性能与内存控制极致的编程语言环境下。 神经网络通过大量的参数…...
AppFlow:支持飞书机器人调用百炼应用
AppFlow:支持飞书机器人调用百炼应用 简介: 本文介绍了如何创建并配置飞书应用及机器人,包括登录飞书开发者后台创建应用、添加应用能力和API权限,以及通过AppFlow连接流集成阿里云百炼服务,最后详细说明了如何将机器…...
Axure RP教程:创建高效用户界面和交互
Axure RP是一款广受好评的软件,专门用于设计精致的用户界面和交互体验。这款软件提供了众多UI控件,并根据它们的用途进行了分类。与此同时,国产的即时设计软件作为Axure的替代品,支持在线协作和直接在浏览器中使用,无需…...
【Bug】el-date-picker组件时间差
这个组件默认是国际标准时间 2024-11-27T07:56:37.000Z 表示的是 UTC 时间。如果你当前所在的时区是 UTC8(例如中国),那么这个时间实际上是比你选择的时间早 8 个小时 T表示分隔符,Z表示的是UTC 解决:给el-date-pic…...
Ubuntu问题 -- 使用scp将本机文件传输至ubuntu服务器中
目的 临时没有文件传输工具使用一条命令快速传输指定文件或文件夹 使用scp命令 传输指定文件 scp -P 22 D:\Storage\myCache\UE\Linux_ue_demo.zip txl10.1.112.93:/home/txl-P是远程机器的ssh端口号, SCP(安全复制协议)使用和SSH(安全外壳…...
每日速记10道java面试题02
其他面试题 每日速记10道java面试题01-CSDN博客 目录 一、Java 中 String、StringBuffer 和 StringBuilder 的区别是什么? 二、java的Stringbuilder是怎么实现的? 三、Java 中包装类型和基本类型的区别是什么? 四、接口和抽象类有什么区别? 编辑…...
解决 Vim 上下左右变成 ABCD 的问题
解决 Vim 上下左右变成 ABCD 的问题 Vim 是 Linux 和 Unix 系统上广受欢迎的编辑器,但许多用户在首次使用时会遇到一些让人困惑的问题,例如:按下上下左右键时光标不移动,而是输出 A、B、C、D 字母。这篇文章将深入分析该问题的解…...
并发编程(14)——内存栅栏
文章目录 十四、day141. 内存栅栏1.1 什么是栅栏1.2 栅栏和原子操作的对比1.2.1 获取操作1.2.2 释放操作 1.3 线程可见顺序1.4 通过栅栏保证指令编排顺序1.5 通过栅栏令非原子操作服从内存次序1.6 同步线程间的内存访问 十四、day14 在学习完内存模型、内存序、原子类型、操作…...
消息中间件用途介绍
1. 解耦(Decoupling): • 消息中间件能够将消息的生产者(Producer)和消费者(Consumer)分离开来,使它们不必直接相互依赖。这种设计降低了系统的耦合度,提升了系统的可扩展…...
Algorithms and Data Structures in C++ by Mohammed Yasir Eramangadan
MP4 创建 |视频:h264、1280720 |音频:AAC,44.1 KHz,2 通道 类型:在线学习 |语言:英文 字幕 |持续时间: 159 讲座 ( 10h 43m ) |大小: 3.5 GB “通过专家制作…...
Binder架构
一、架构 如上图,binder 分为用户层和驱动层两部分,用户层有客户端(Client)、服务端(Server)、服务管理(ServiceManager)。 从用户空间的角度,使用步骤如下(…...
【第十一课】Rust并发编程(二)
目录 前言 Channel 多生产者 前言 在上一节中,我们介绍了Rust中并发编程的方式之一:Fork和Join,通过新建线程提升代码的效率,这节课我们介绍并发编程的第二种方式:通道。Channel就类似于水管,通过Channe…...
网络知识1-TCP/IP模型
从用户端到服务端,tcp/ip模型可分为应用层、传输层、网络层、网络接口层 以下使用寄快递为例进行解释 应用层职责: 只关注与为用户提供应用功能,如HTTP、FTP、telnet、DNS、SMTP等 ,应用层的职责就像我们寄快递时将快递给快递员…...
burpsuite(2)最新版burpsuite安装教程
一、安装Java 1.安装jdk21,直接官网下载 下载链接:Java21 2.cmd 输出java(查看java是否已经被安装) 3.java -version(查看java版本) 二、安装burpsuite 4.下载burpsuite最新版本,选择jar方式…...
微知-arp如何删除所有表项?(arp -d; ip neighbor delete 192.168.0.100)
ar命令删掉所有表项 sudo arp -d使用ip命令 ip neighbor delete 192.168.0.100...
使用guzzlehttp异步多进程实现爬虫业务
Python和PHP核心技术共享平台 背景 小哥近来在通过动态代理池爬取一些公司需要的大文件pdf规格书的处理。遇到的难点,如何保证服务器CPU、连接数等正常情况下,多进程、异步快速处理这些业务并且保证准确。下面小哥就给看官唠嗑一下,我使用gu…...
websocket前后端长连接之java部分
一共有4个类,第一个WebSocketConfig 配置类 Configuration EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer {Autowiredprivate WebSocketHandler webSocketHandler;Autowiredprivate WebSocketInterceptor webSocketInterceptor;Overridepubli…...
无线感知会议系列【16】QGesture-1
摘要: 这是2018年发表的一篇 paper 《 Quantifying Gesture Distance and Direction with WiFi Signals》 下一篇重要分享 Decimeter-level localization with a single WiFi access point,主要创新点是如何对CFO SFO PBD 噪声进行去噪。 许多人机交互&…...
如何用通义灵码快速绘制流程图?
使用通义灵码快速绘制流程图?新功能体验 不想读前人“骨灰级”代码,不想当“牛马”程序员,想像看图片一样快速读复杂代码和架构? 通义灵码已经支持代码逻辑可视化,可以把你的每段代码画成流程图。像个脑图工具一样帮你…...
如何搭建一个小程序:从零开始的详细指南
在当今数字化时代,小程序以其轻便、无需下载安装即可使用的特点,成为了连接用户与服务的重要桥梁。无论是零售、餐饮、教育还是娱乐行业,小程序都展现了巨大的潜力。如果你正考虑搭建一个小程序,本文将为你提供一个从零开始的详细…...
wp the_posts_pagination 与分类页面搭配使用
<ul> <?php while( have_posts() ) : the_post(); <li > <a href"<?php the_permalink(); ?>"> <?php xizhitbu_get_thumbnail(thumb-pro); ?> </a> <p > <a href&q…...
文件包含漏洞
本质 本质和SQL注入相同,都是输入一段用户可以控制的脚本或代码,让服务器执行 包含就比如把函数写在一个文件里,调用函数时直接用文件 文件包含漏洞就是攻击者修改了文件的位置,让后台执行任意文件 函数 (PHP&…...