初识Redis · 分布式锁
目录
前言:
分布式锁
setnx
lua脚本和看门狗
redlock算法
Redlock 的加锁流程(5 步)
前言:
到了分布式锁这一章之后,我们首先能联想到的问题就是线程安全的问题,线程安全指的是多个线程在并发执行的时候先手顺序是不确定的,那么就会出现同时对一个变量操作的情况,对于这种情况我们要保证的就是顺序问题,保证程序在任意执行顺序下的逻辑都是没问题的。
那么线程安全问题我们可以简单认为是n个线程对同一个变量操作引发的问题,它的解决方案是使用一把锁,将操作变量的过程锁住,谁持有锁谁就可以进行操作。那么问题来了,在实际应用场景中,我们的情况是多个客户端,多个服务器,也就是如下:
这种情况,多个客户端买票的时候,比如客户端A执行买票的过程,查询服务器A,发现票数为1,那么就执行买票的操作,可是这个过程中,客户端B也执行了买票的操作,他查询的是服务器B,发现票数也为1(此时A还没有完全买好),那么A和B同时对数据库操作,执行了买票的操作,此时就会导致超卖的情况。
导致出现超卖的原因是因为多个线程同时对多个服务器操作,而我们一般的锁能应对的情况是多个线程操作一个服务器,在一个服务器上加锁就能让多个线程按照一定次序执行操作,那么面对多服务器的时候就不行了。
此时就应该引入分布式锁了。
分布式锁
分布式锁可以很好的解决上述的多对多的问题,如果我们使用Redis作为分布式锁的话,那么涉及到了我们应该如何加锁呢?
其实加锁的这个过程和上述线程安全的互斥锁也是差不了太多的,我们简单回忆一下线程安全中的锁的竞争,多个线程竞争在寄存器中的某个值,如果谁通过寄存器获取到了这个值,那么就可以执行后续的操作,回到Redis,既然我们使用了Redis作为分布式锁,那么我们加锁的过程也是类比上面的过程。
具体的操作是多个服务器连接的Redis服务器,在进行买票操作的时候先设置一个特殊的key,设置的时候发现没有这个key,那么设置成功,也就代表了加锁成功,如果设置的时候发现已经存在了该key,那么加锁失败,只能乖乖等待key过期或被删除了。
那么这里肯定会有心细的同学发现了,好像MySQL的事务能够解决这个问题,将对应的操作打包为一个事务然后进行,这个看起来确实是可以的,但是实际上分布式系统的存储介质不一定只有MySQL,其他的存储介质不一定有事务,所以还是分布式锁使用起来更权威一点。
setnx
上文提到具体首先分布式系统是通过在redis里面设置特殊的key来实现的,那么怎么才能知道设置成功了呢?
此时我们最开始学习Redis的时候,涉及到的一个命令就狠狠派上用场了,即setnx,nx代表的是不存在才设置,如果key存在的话是设置不了的,所以setnx首先用于设置分布式锁的。
那么,针对解锁的操作是有两种的,一种是设置过期时间,一种是操作完之后进行del,此时就会引发不同的问题了。
对于del来说:
服务器执行完对应的操作之后,正常来说是del即可,但是不免有特殊情况,比如服务器突然掉电了,导致进程直接异常终止,此时就没有服务器来del这个锁了,当然实际情况来说肯定不会考虑的这么片面,但是这种情况导致的结果确实就是无法del锁,从而导致阻塞了。那么就引入了过期时间的做法。
对于过期时间来说:
它也算是服务器为自己留的一条后路,如果自己真的突然挂了,那么对应的锁也会通过过期时间自动释放掉。而对于过期时间来说,设置的时候还是有说法的,比如setnx ex 这样来设置过期时间就是对的,如果是先setnx,然后再通过expire设置过期时间就不行了。
因为对于Redis来说是单线程的,收到请求的时候按照顺序执行,一次setnx ex是原子性的,所以多个服务器同时使用redis加锁的时候只有一个能成功,但是先set然后再expire,就不是原子性的了,会引发加锁逻辑漏洞,以下是官方文档的解释:
"Using SETNX and then setting an EXPIRE with a separate command is not safe. If the client crashes after the SETNX but before the EXPIRE, the lock will be held forever."
翻译:
“使用
SETNX
然后再单独执行EXPIRE
是不安全的。如果客户端在执行SETNX
成功之后、但在执行EXPIRE
之前崩溃,那么这个锁就会永远被占用。”
我们现在就清楚了,所谓的分布式加锁解锁的过程不过是set key和del key的过程,那么你说会不会有服务器恶意del别的服务器已经设置好的key呢?
正常来说是不会的,但是代码总会有bug,说不定一不小心就绕过了set的逻辑直接就执行对应的del了。面对上面的这种情况,就需要引入校验机制了,总不能说谁来都可以删吧?
一般来说的处理方式是,每个服务器都有一个自己的身份标识,那么set的时候就会使用服务器的身份标识充当value,key对应的是哪个资源。
这个时候删除的时候,先查询一下当前服务器的身份标识,再和这个value对比一下,校验成功才能执行下一步操作,这种操作就可以避免误删了。
lua脚本和看门狗
什么,居然用到了咱们大名鼎鼎的lua脚本了?是的是的,因为在上文我们提到了删除操作之前有一个操作是查询对应的标识符,那么也就是分为了两步,一步是get 一步是del。
既然是两步操作,那么就代表不是原子的,我们举个例子:
-
客户端 A 加锁成功,值为
uuid-A
; -
锁过期,Redis 自动删除
lock_key
; -
客户端 B 加锁成功,值为
uuid-B
; -
客户端 A 执行
GET lock_key
,发现是uuid-B
;-
假如这里网络延迟或客户端数据错误,仍错误判断为
uuid-A
-
-
A 执行
DEL lock_key
; -
B 的锁被误删,严重并发逻辑错误!
所以我们查询删除这个操作我们就可以使用Lua脚本:
-- 解锁脚本:只有当 key 的值等于给定值时才删除
if redis.call("get", KEYS[1]) == ARGV[1] thenreturn redis.call("del", KEYS[1])
elsereturn 0
end
使用lua脚本的时候就是原子的了。
那么为什么不使用事务来代替这个操作呢?因为事务的操作也不是原子性的,它只是按照顺序打包顺序执行,并且Redis的事务不具备MySQL的回滚的特性,事务中的命令依次执行,期间可以被其他客户端插入操作影响的。
所以推荐的是使用lua脚本。
我们既然引入了过期时间的方案,那么我们要担心一个点就是,过期时间我们应该设置多久?如果设置短了,那么会导致类似于线程安全的问题,如果设置长了,Redis就阻塞住了,无论是哪种方案都是不好的。
所以,我们应该动态调整对应的过期时间,此时我们就会单独引入一个线程,用来动态调整过期时间。那么这个线程,我们就叫做看门狗。
redlock算法
以上的讨论都是基于Redis本身运行是成功的情况下的,那么你说有没有一种可能,Redis本身就挂了呢?
这太有可能了!!
那么针对Redis本身挂的情况,解决的方法也是非常粗暴:冗余
即我们引入了多个Redis节点,加锁的时候都加锁,解锁的时候都解锁,
这个算法是Redis作者给出来的一种解决方案,多加几个Redis就行了。
这个算法的核心思想是:使用多个 Redis 实例(建议 5 个)来共同决定是否加锁成功。只有多数节点(如 3/5)成功加锁,客户端才认为锁加成功。
Redlock 的加锁流程(5 步)
假设我们有 5 个 Redis 实例(R1
~ R5
),并设置锁过期时间 TTL
。
-
获取当前系统时间(毫秒),记为
start_time
。 -
依次向
R1
~R5
执行SET lock_key unique_id NX PX TTL
操作:-
unique_id
是唯一标识(如 UUID); -
NX
保证 key 不存在时才能加锁; -
PX
设置过期时间,避免死锁。
-
-
统计成功加锁的 Redis 实例数量
n
。 -
如果
n >= 3
(超过半数),且总耗时 < TTL:-
加锁成功;
-
保证锁有效性和新鲜度。
-
-
如果加锁失败(如不足多数、耗时过长):
-
向已加锁的节点发送
DEL lock_key
解锁; -
防止部分节点锁遗留。
-
以上就是分布式锁的基本介绍。
我们主要要注意的就是set nx 和 get del的原子性问题。
感谢阅读!
相关文章:
初识Redis · 分布式锁
目录 前言: 分布式锁 setnx lua脚本和看门狗 redlock算法 Redlock 的加锁流程(5 步) 前言: 到了分布式锁这一章之后,我们首先能联想到的问题就是线程安全的问题,线程安全指的是多个线程在并发执行的…...
使用 OpenCV 实现图像中心旋转
在图像处理中,围绕中心点旋转图像是一个常见的需求。无论是为了数据增强、视觉效果,还是图像对齐,旋转图像都是一项基础且重要的操作。本文将详细介绍如何使用 OpenCV 实现围绕图像中心旋转的功能,并深入探讨其背后的数学原理。 一…...
云钥科技红外短波工业相机
云钥科技的红外短波相机是一款基于短波红外(SWIR,波长范围约1-3微米)技术的成像设备,专为高精度检测、全天候成像及特殊场景应用设计。以下从核心技术、性能参数、应用场景及产品优势等方面进行详细介绍: 一、核心…...
npm如何安装pnpm
在 npm 中安装 pnpm 非常简单,你可以通过以下步骤完成: 1. 使用 npm 全局安装 pnpm 打开终端(命令行工具),运行以下命令: npm install -g pnpm2. 验证安装 安装完成后,可以检查 pnpm 的版本以确保安装成功: pnpm --version如果正确显示版本号(如 8.x.x),说明安…...
GTC Taipei 2025 医疗域前瞻:从AI代理到主权生态,解码医疗健康与生命科学的未来图景
引言 2025年,全球医疗健康领域正经历一场由人工智能、机器人技术与分布式计算驱动的范式转移。随着NVIDIA及其生态伙伴在GTC Taipei 2025大会上的深度布局,医疗行业的核心趋势愈发清晰:AI代理程序(Digital AI Agents)赋能临床协作、医疗大数据与精准医学加速落地、医学影…...
【AI学习】李宏毅新课《DeepSeek-R1 这类大语言模型是如何进行「深度思考」(Reasoning)的?》的部分纪要
针对推理模型,主要讲了四种方法,两种不需要训练模型,两种需要。 对于reason和inference,这两个词有不同的含义! 推理时计算不是新鲜事,AlphaGo就是如此。 这张图片说明了将训练和推理时计算综合考虑的关系&…...
npm打包内存不足- JavaScript heap out of memory
直接贴出报错信息 <--- Last few GCs --->[30904:0000010F60FE58E0] 22090 ms: Scavenge 2037.4 (2069.4) -> 2036.4 (2074.2) MB, 2.5 / 0.0 ms (average mu 0.228, current mu 0.216) allocation failure [30904:0000010F60FE58E0] 22101 ms: Scavenge 2…...
【最新 MCP 战神手册 08】工具使用详解:实现 AI 行动
文章目录 1. 开始啦!2. 第一部分:设计高效且安全的工具3. 第二部分:定义工具蓝图——参数、输出与约束条件4. 第三部分:弥合差距:LLM 兼容性(函数调用)5. 第四部分:实施与测试的最佳实践1. 开始啦! 在前几章中,我们将工具介绍为 AI 模型在 MCP 客户端引导下向 MCP 服…...
开发iOS App时,我常用的一款性能监控小工具分享
开发iOS App时,我常用的一款性能监控小工具分享 最近在做一个iOS应用的性能优化,频繁遇到内存泄露、界面卡顿和网络请求超时的问题。平时用Xcode Instruments虽然专业,但流程繁琐,临时排查问题不够灵活。 于是开始找有没有轻量一…...
如何防止 ES 被 Linux OOM Killer 杀掉
当 Linux 系统内存不足时,内核会找出一个进程 kill 掉它释放内存,旨在保障整个系统不至于崩溃。如果 ES 按照最佳实践去实施部署,会保留一半的内存,不至于发生此类事情。但事情总有例外,有的朋友可能 ES 和其他的程序部…...
Windows权限与icacls命令详解
在Windows操作系统中,权限管理是确保系统安全和资源访问控制的核心机制。特别是在使用NTFS(New Technology File System)文件系统的环境中,访问控制列表(ACL)用于定义哪些用户或组可以对文件、文件夹或其他…...
5.4.2 MVVM例2-用户控件的使用(水在水管中流动的实例)
本文以一个例子介绍用户控件的使用(UserControl),下图所示: 一、主要技术点 1.MainViewModel使用CommunityToolkit.Mvvm 这个Nuget包 2.LinearGradientBrush使用,下面代码可以产生如下的效果 <LinearGradientBrush x:Key="HorizontalBackground" …...
PHP代码-服务器下载文件页面编写
内部环境的服务资源下载页面有访问需求,给开发和产品人员编写一个简洁的下载页面提供资源下载。直接用nginxphp的形式去编写了,这里提供展示index.php文件代码如下: <?php // 配置常量 define(BASE_DIR, __DIR__); // 当前脚本所在目录作…...
51单片机快速入门之 SPI通信 2025年4月29日09:26:32
SPI通信 : SPI(Serial Peripheral Interface)通信是一种同步串行数据传输协议,主要用于嵌入式系统内部设备之间的通信。它由Motorola公司在2000年提出,广泛应用于微控制器、传感器、存储设备等之间的数据传输。 SPI通信的主要特点…...
SpringMVC再复习1
一、三层架构 表现层(WEB 层) 定义 :是应用程序与客户端进行交互的最外层,主要负责接收用户的请求,并将处理结果显示给用户。 作用 :在 Spring MVC 中,表现层通常采用 MVC 设计模式来构建。 技…...
音视频之H.265/HEVC网络适配层
H.265/HEVC系列文章: 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 4、音视频之H.265/HEVC变换编码 5、音视频之H.265/HEVC量化 6、音视频之H.265/HEVC环路后处理 7、音视频之H.265/HEVC熵编…...
01_微服务常见问题
文章目录 微服务常见问题一、常见问题概要一、问题详解1.1 服务拆分1.2 服务通信1.3 服务注册与发现1.4 服务治理1.5 数据一致性1.6 故障隔离与容错处理1.7 数据库设计1.8 性能测试与调优 微服务常见问题 一、常见问题概要 服务拆分:如何合理地拆分服务&#…...
Python在自动驾驶仿真环境中的应用:构建智能驾驶的虚拟世界
Python在自动驾驶仿真环境中的应用:构建智能驾驶的虚拟世界 引言 随着自动驾驶技术的迅速发展,仿真环境的构建变得愈发重要。传统的测试方法依赖物理车辆和道路进行验证,但这种方式不仅成本高昂,还存在一定的风险。为了加速自动驾驶技术的研发,仿真环境成为了一个必不可…...
【统计方法】交叉验证:Resampling, nested 交叉验证等策略 【含R语言】
Resampling (重采样方法) 重采样方法是从训练数据中反复抽取样本,并在每个(重新)样本上重新调整模型,以获得关于拟合模型的附加信息的技术。 两种主要的重采样方法 Cross-Validation (CV) 交叉验证 : 用于估计测试误…...
海外App数据隐私架构实战:构建GDPR、CCPA合规的全栈解决方案
一、隐私合规的架构范式转变 从“数据收集”到“数据最小化”传统模式:尽可能收集数据 → 导致合规风险隐私原生模式:默认不收集 → 按需申请 → 自动过期kotlin// Android权限动态申请示例(GDPR兼容) val request PermissionRe…...
Prometheus监控
1、docker - prometheusgrafana监控与集成到spring boot 服务_grafana spring boot-CSDN博客 2、【IT运维】普罗米修斯基本介绍及监控平台部署(PrometheusGrafana)-CSDN博客 3、Prometheus监控SpringBoot-CSDN博客 4、springboot集成普罗米修斯-CSDN博客…...
Vue3 Echarts 3D圆形柱状图实现教程以及封装一个可复用的组件
文章目录 前言一、实现原理二、series ——type: "pictorialBar" 简介2.1 常用属性 三、代码实战3.1 封装一个echarts通用组件 echarts.vue3.2 首先实现一个基础柱状图3.3 添加上下2个椭圆面3.4 进阶封装一个可复用的3D圆形柱状图组件 总结 前言 在前端开发的数据可视…...
洛谷P12238 [蓝桥杯 2023 国 Java A] 单词分类
[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] Copy from luogu. [Analysis] \color{blue}{\texttt{[Analysis]}} [Analysis] 既然都是字符串前缀的问题了,那当然首先就应该想到 Trie \text{Trie} Trie 树。 我们可…...
【3D基础】顶点法线与平面法线在光照与PBR中的区别与影响
顶点法线与平面法线在光照与PBR中的区别与影响 在3D图形学中,法线(Normal)是影响光照计算、表面细节表现和渲染质量的核心参数之一。法线用于描述一个表面或顶点的朝向,直接关系到光的反射与分布,从而影响最终像素的颜…...
jmeter-Beashell获取http请求体json
在JMeter中,使用BeanShell处理器或BeanShell Sampler来获取HTTP请求体中的JSON数据是很常见的需求。这通常用于在测试计划中处理和修改请求体,或者在响应后进行验证。以下是一些步骤和示例代码,帮助你使用BeanShell来获取HTTP请求体中的JSON数…...
为网页LOGO视频增加电影质感表现
为网页LOGO视频增加电影质感表现 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 为网页LOGO视频增加电影质感表现前几天,一个朋友开了一家烤肉店,给我发来了烤肉店的宣传视频,我…...
精益数据分析(32/126):电商指标优化与搜索策略解析
精益数据分析(32/126):电商指标优化与搜索策略解析 在创业和数据分析的探索之旅中,每一次深入学习都能为我们带来新的启发和成长。今天,我们继续秉持共同进步的理念,深入研读《精益数据分析》,…...
【空间数据分析】缓冲区分析--泰森多边形(Voronoi Diagram)-arcgis操作
泰森多边形(Voronoi Diagram):根据一组输入点生成多边形,使得每个多边形内的任意位置到其关联点的距离最近。 多边形之间无重叠,全覆盖研究区域。 边界是相邻两点连线的垂直平分线。 实验操作: 使用 Cre…...
JavaScript高级进阶(五)
操作节点属性 设置属性(先找属性再操作) setAttribute()方法添加指定的属性,并为其赋指定的值 语法: element.setAttribute(attributename/属性名,attributevalue/属性值) 例: <style> .box{ width: 200px; height: 200p…...
WPF之TextBlock控件详解
文章目录 1. TextBlock控件介绍2. TextBlock的基本用法2.1 基本语法2.2 在代码中创建TextBlock 3. TextBlock的常用属性3.1 文本内容相关属性3.2 字体相关属性3.3 外观相关属性3.4 布局相关属性 4. TextBlock文本格式化4.1 使用Run元素进行内联格式化4.2 其他内联元素 5. 处理长…...
串口通信协议
什么是串口通信? 串口通信是将数据在一条数据线上传输。 串口通信的特点是传输线少(相对于并行通信),长距离传输的成本低,但数据的传送控制比并行通信复杂。 常见的串行通信接口包括:USB,RS-…...
9.idea中创建springboot项目
9. idea中创建springboot项目 步骤 1:打开 IntelliJ IDEA 并创建新项目 启动 IntelliJ IDEA。在欢迎界面,点击 New Project(或通过菜单栏 File > New > Project)。 步骤 2:选择 Maven 项目类型 在左侧菜单中…...
详解大语言模型生态系统概念:lama,llama.cpp,HuggingFace 模型 ,GGUF,MLX,lm-studio,ollama这都是什么?
llama,llama.cpp,HuggingFace 模型 ,GGUF,MLX,lm-studio,ollama这些名词的概念给个详细的解释,彼此什么关系?是不是头很晕? 详解大语言模型生态系统概念 基础模型与架构…...
如何系统学习音视频
学习音视频技术涉及多个领域,包括音频处理、视频处理、编码解码、流媒体传输等。 第一阶段:基础知识准备 目标:掌握音视频学习所需的计算机科学和数学基础。 计算机基础 学习计算机网络基础(TCP/IP、UDP、HTTP、RTSP等协议&#…...
elementui里的el-tabs的内置样式修改失效?
1.问题图 红框里的是组件的内置样式,红框下的是自定义样式 2.分析 2.1scoped vue模板编译器在编译有scoped的stye标签时,会生成对应的postCSS插件,该插件会给每个scoped标记的style标签模块,生成唯一一个对应的 data-v-xxxhash…...
Webshell管理工具的流量特征
目录 一、常见Webshell工具流量特征 1. 中国菜刀(Chopper) 2. 冰蝎(Behinder) 3. 哥斯拉(Godzilla) 4. 蚁剑(AntSword) 5. C99 Shell…...
61.微服务保姆教程 (四) Gateway---SpringCloud微服务网关组件
Gateway—SpringCloud微服务网关组件 一、Spring Cloud Gateway简介 1.为什么要用Gateway? 在微服务架构中,通常一个系统会被拆分为多个微服务,微服务之间的调用可以用OpenFeign,但面对这么多微服务客户端调用会遇到哪些问题呢? 每个服务都需要鉴权、限流、跨域访问、权…...
问答:C++如何通过自定义实现移动构造函数和移动赋值运算符来实现rust的唯一所有权?
今天,我就带你深入C++的移动语义,用自定义的移动构造函数和移动赋值运算符,硬核模拟Rust的唯一所有权。不仅有干货代码,还会手把手讲明白,保证你看完就能上手。准备好了吗?咱们这就开干! 先搞懂Rust的“独家秘籍” Rust的唯一所有权,简单来说,就是一个资源只能有一个…...
MODSIM选型指南:汽车与航空航天企业如何选择仿真平台
1. 引言 在竞争激烈的汽车与航空航天领域,仿真技术已成为产品研发不可或缺的环节。通过在设计阶段验证概念并优化性能,仿真平台能有效缩短开发周期并降低物理样机制作成本。 MODSIM(建模与仿真)作为达索系统3DEXPERIENCE平台的核…...
扣子流程图批量导入飞书多维表格
文章目录 整体结构分步骤进行处理1. 程序代码处理2. 多维表格配置 整体结构 整个代码块结构如下: 首先,我们从其他流程中拿到一个数据列表,通过一个循环体,将每一个部分的内容都通过python代码整理后,使用【插件】的…...
Profinet 转 Modbus_4 网关
一、功能概述 1.1 设备简介 本产品是 Profinet 和 Modbus RTU 网关,使用数据映射方式工作。 本产品在 Profinet 侧作为 Profinet 从站,接西门子 PLC 如 1200 、 1500 、 200Smart 等;在 Modbus RTU 侧做为 RTU 主站或从站&#…...
Webug4.0通关笔记03- 第4关POST注入和第5关过滤注入
目录 第04关 POST型注入 1.源码分析 2.sqlmap注入 (1)bp保存报文 (2)sqlmap渗透 (3)获取flag 第05关 过滤型注入 1.源码分析 2.sqlmap渗透 (1)bp抓包保存报文 ࿰…...
虹科新品 | 汽车通信新突破!PCAN-XL首发上线!
汽车智能化浪潮汹涌 通信技术如何跟上? 虹科带着支持最新CAN XL标准的 PCAN-XL套件 重磅来袭! 助力行业快速开启 全新CAN XL标准的测试验证! 新品登场:不止是升级 虹科PCAN-XL套件 随着汽车智能化进程加速,传…...
GitHub Actions 自动化部署 Azure Container App 全流程指南
一、前言 本文将详细介绍如何通过 GitHub Actions 实现 Azure Container App 的自动化部署流程。当代码推送到 master 分支时,系统将自动完成镜像构建、推送至 ACR 以及应用部署的全过程。以下是完整的配置方案: 二、GitHub Actions 工作流配置 完整 YAML 文件(.github/wo…...
华为L420Qml在wayland环境下崩溃问题
开发环境 操作系统 : kylin v10sp1qt版本 : qt5.15硬件信息 : 华为L420型号 背景 这个问题是在指定机型才出现的,应用同事帮忙将问题与业务抽离出来形成了一个demo //main.cpp#include #include int main(int argc, char *argv[]){qputenv("QT_QPA_PLATFORM", &quo…...
UniApp 小程序嵌套 H5 页面显示隐藏监听实践
UniApp 小程序嵌套 H5 页面显示隐藏监听实践 一、背景介绍 在小程序嵌套 H5 页面的场景中,经常需要监听页面的显示和隐藏状态,以便于处理一些特定的业务逻辑,如暂停/继续定时器、暂停/继续视频播放等。 二、实现方案 1. 页面可见性 API …...
CentOS上搭建 Python 运行环境并使用第三方库
CentOS上搭建 Python 运行环境并使用第三方库 更新 YUM 配置为阿里云镜像安装依赖包下载 Python 源码解压源码包配置和编译安装验证安装创建虚拟环境安装python第三方库编写并执行 Python 脚本 centos7.9上安装python环境 更新 YUM 配置为阿里云镜像 # 备份原有的 yum 配置文…...
黑马Redis(四)
一、发布探店笔记 案例--实现查看发布探店笔记的接口: 映射到对应数据库 BLOG类中存在和对应数据库表不相关的属性,使用TableField注解表示该字段并不在表中,需要在后续进行手动维护 GetMapping("/{id}")public Result queryBlog…...
绿色版的notepad++怎么加入到右键菜单里
复制以下代码保存为 Notepad.reg,修改自己的“Notepad.exe路径”后,双击运行Notepad.reg。 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\NotePad] "Notepad 打开" "Icon""C:\\Program Files (x86)\\Note…...
C++23 std::byteswap:反转字节 (P1272R4)
文章目录 C23 std::byteswap:反转字节 (P1272R4)引言字节序的基本概念大端字节序小端字节序 C23 std::byteswap的基本概念和功能基本概念功能实现示例代码可能的输出 P1272R4提案相关内容提案背景和动机设计考虑函数规范提案修订历史 std::byteswap的使用场景跨平台…...