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

SETNX的存在问题和redisson进行改进的原理

      首先分布式锁的原理就是当锁不存在时则创建,创建到锁的线程则执行业务。但是在这些操作中会有一些问题,下面是redis命令setNX设置锁的代码片段

if(缓存中有){返回缓存中的数据
}else{获取分布式锁if(获取锁成功){try{查询数据库}finally{释放锁}}}

      首先就是没有办法准确得知try中操作的执行时间,如果设置锁的过期时间过长,会导致效率下降,所以引入了finally,当操作执行完毕后手动删除锁。

      但是如果过期时间过短,可能在操作还没执行完锁就过期了,这个时候另一个线程可以获取锁,而当前线程执行完操作后会执行finally的解锁操作,这就会导致将另一个刚获取锁的线程的锁删除掉。

      所以需要在finally中判断线程与锁的关系,是本线程加的锁才能够删除。

      这个时候又会有问题,如果在一个线程获取锁后执行到finally了,先进行判断锁的归属,判断成功了,在准备执行解锁操作的时候,突然锁过期了,由于CPU的调度另一个线程在这个时候创建了一个新的锁开始执行任务。当CPU转回到本线程执行时,则直接进行删锁操作,就又导致了锁被错删。

      为了解决这个问题,就需要把判断的过程设置为具有原子性的操作,使用lua脚本。

    这样看使用redis命令实现分布式锁比较复杂,所以下面的redisson的方式就更加方便

      redisson实现分布式锁:上面的介绍表明SETNX的问题主要来源于这两点,一是锁过期时间不容易判断,二是操作的原子性,这两点引发了后面一系列的问题。redisson则将解决这些问题的操作都进行了封装,并且其继承了jdk中的LOCK接口,使用自旋的ReentrantLock;redisson主要优化了以下两点

      1.加锁机制:线程去获取锁,获取成功: 执行lua脚本,保存数据到redis数据库。

        线程去获取锁,获取失败: 一直通过while循环尝试获取锁,获取成功后,执行lua脚本,保存数据到redis

        2.WatchDog自动续锁看门狗机制:在一个分布式环境下,假如一个线程获得锁后,突然服务器宕机了,那么这个时候在一定时间后这个锁会自动释放,你也可以设置锁的有效时间(当不设置默认30秒时),这样的目的主要是防止死锁的发生

        如果线程A业务还没有执行完,时间就过了,线程A 还想持有锁的话,就会启动一个watch dog后台线程,不断的延长锁key的生存时间。

        实现:

if(缓存中有){返回缓存中的数据
}else{
RLock lock = redissonClient.getLock("锁名称");
lock.lock();
try {//从数据库中取//查询完成后再存储到redis
}  finally {lock.unlock();
}
}

相关文章:

SETNX的存在问题和redisson进行改进的原理

首先分布式锁的原理就是当锁不存在时则创建,创建到锁的线程则执行业务。但是在这些操作中会有一些问题,下面是redis命令setNX设置锁的代码片段 if(缓存中有){返回缓存中的数据 }else{获取分布式锁if(获取锁成功){try{查询数据库}finally{释放…...

抽象工厂模式(Abstract Factory Pattern)

很好!你现在已经开始接触设计模式了,而**抽象工厂模式(Abstract Factory Pattern)是一种常用于“创建一系列相关产品”**的经典设计模式。 我会一步步帮你理解: 🧠 一句话解释 抽象工厂模式:提…...

AVIOContext 再学习

这个目前阶段用的不多,暂时不要花费太多精力。 url 的格式不同,使用的传输层协议也不同。这块看代码还没看到自己想的这样。 目前看的信息是:avformatContext 的 io_open 回调函数 在默认情况下叫 io_open_default,在解复用的 av…...

Power Query精通指南1:查询结构设计、数据类型、数据导入与迁移(平面文件、Excel、Web)

文章目录 零、Power Query简介0.1 Power Query 主要功能0.2 Power Query 的优势0.3 Power Query 组件 一、Power Query数据处理基本流程1.1 前期准备1.2 提取1.3 转换1.3.1 Power Query 编辑器界面1.3.2 默认转换1.3.3 自定义转换 1.4 加载1.4.1 自动检测数据类型1.4.2 重命名查…...

Linux 内核升级问题

一、内核升级后启动失败 原因:initramfs 镜像未正确生成或 GRUB 配置错误。 处理步骤如下: 1、进入旧内核启动系统。 2、重新生成 initramfs: sudo dracut -f --regenerate-all 3、更新 GRUB 配置: sudo grub2-mkconfig -o /boo…...

Linux 进程间通信(IPC)详解

进程间通信(IPC)深入解析 一、进程间通信概述 在操作系统里,不同进程间常常需要进行数据交换、同步协调等操作,进程间通信(Inter - Process Communication,IPC)机制应运而生。在Linux系统中&a…...

第3章 Python 3 基础语法001

文章目录 一、缩进规则1. 基本规则2. 示例3. 多级缩进4. 常见错误二、注释规则1. 单行注释2. 多行注释3. 特殊注释4. 注释规范三、代码块规则1. 控制结构2. 函数定义3. 类定义4. 上下文管理器四、总结与最佳实践五、调试技巧以下是 Python 3 基础语法规则的详细说明,涵盖 缩进…...

数据库介绍以及windows下mysql安装

文章目录 1. 前言2. MySQL概述2.1 相关概念2.2 DBMS的分类2.3 数据库交互图2.4 MySQL 介绍 3. MySQL 安装 数据库介绍以及windows下mysql安装 1. 前言 我们浏览的淘宝商品页面详情、刷视频网站的一个个视频,这些数据其实都是存储在公司的存储系统中的。想象一下&…...

list的两种设计

1. 内存布局对比 (1) MSVC 的实现 cpp class _List_node {_List_node* _Next; // 指向下一个节点_List_node* _Prev; // 指向前一个节点_Value_type _Value; // 存储的数据 }; 特点: 每个节点包含两个指针和一个数据成员。 Debug 模式:可能添加迭代…...

【C#】一个类中的接口方法使用static和不使用static的区别

在C#中,类中的接口方法是否使用 static 修饰符会带来显著的区别。这是因为接口方法的实现和调用方式与普通方法不同,而 static 关键字的使用进一步改变了这些行为。 以下是两者的区别: 1. 不使用 static 的接口方法 在这种情况下&#xff0…...

共铸价值:RWA 联合曲线价值模型,撬动现实资产生态

摘要 本文提出了一种针对真实资产(RWA)产业的联合曲线激励模型,将劳动与数据贡献映射为曲线价值,并基于固定档位与指数衰减奖励发放总计 2.1亿积分。该模型结合了去中心化定价与平滑递减机制,不仅为早期贡献者提供更高…...

【libuv】基于libuv的exe链接错误

vs2017构建 基于libuv的exe链接错误 1>libuv.lib(util.obj) : error LNK2019: unresolved external symbol __imp__GetAdaptersAddresses20 referenced in function _uv_interface_addresses 1>libuv.lib(util.obj) : error LNK2019: unresolved external symbol __imp__…...

什么是生成式 AI (GenAI)?

在科技飞速发展的今天,人工智能(AI)已不再是一个遥远的概念,而是悄然融入了我们的日常生活。从智能语音助手到自动驾驶汽车,从个性化推荐系统到医疗诊断辅助,AI正以前所未有的速度改变着世界。然而,在AI的广阔领域中,有一个分支正逐渐崭露头角,成为推动未来创新的关键…...

爬虫准备前工作

1.Pycham的下载 网址:PyCharm: The only Python IDE you need 2.Python的下载 网址:python.org(python3.9版本之后都可以) 3.node.js的下载 网址:Node.js — 在任何地方运行 JavaScript(版本使用18就可…...

JVM——JVM 是如何处理异常的?

JVM 是如何处理异常的? 在 Java 编程语言中,异常处理是一种强大的机制,用于应对程序运行时出现的错误和意外情况。而 Java 虚拟机(JVM)作为 Java 程序运行的核心环境,在异常处理过程中扮演着至关重要的角色…...

网络基础-----C语言经典题目(12)

一、MTU,IP 协议头中 TTL是什么? MTU 指的是网络层能够接收的最大数据包大小,单位为字节。主要作用是限制数据链路层一次能够传输的数据量。 IP 协议头中的 TTL 是 IP 数据头部的一个 8 位字段,最初它的设计目的是限制数据包在网络…...

【第十六届蓝桥杯省赛】比赛心得与经验分享(PythonA 组)

文章目录 一、我的成绩二、我的备赛经历三、如何备赛(个人观点)1. 基础语法2. 数据结构3. 算法4. 数学 四、做题技巧与注意事项五、我的题解试题A 偏蓝 🏆100%试题B IPV6 🏆0%试题C 2025图形 🏆100%试题D 最大数字 &am…...

解决Maven项目中报错“java不支持版本6即更高的版本 7”

错误背景 当Maven项目编译或运行时出现错误提示 Java不支持版本6即更高的版本7,通常是由于项目配置的JDK版本与当前环境或编译器设置不一致导致的。例如: 项目配置的Java版本为6或7,但实际使用的是JDK 17。Maven或IDE的编译器未正确指定目标…...

MySQL--索引入门

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 Mysql在存储数据之外,数据库系统各种还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据…...

【网络原理】深入理解HTTPS协议

本篇博客给大家带来的是网络原理的知识点, 由于时间有限, 分三天来写, 本篇为线程第三篇,也是最后一篇. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动…...

利用Elixir中的原子特性 + 错误消息泄露 -- Atom Bomb

题目信息: This new atom bomb early warning system is quite strange… 题目使用 elixir 语言 一开始,我们会访问 /page.html <!DOCTYPE html> <!-- 设定文档语言为英语 --> <html lang"en"> <head><!-- 设定字符编码为UTF-8 --><…...

机器人--STM32

STM32启动模式 1,从主闪存存储启动器启动(默认) 2,从系统存储启动器启动 下载程序时需要使用的启动方式。 3&#xff0c;从内置的SRAM启动...

LVGL -文本显示 英文、中文

1 文本 在 LVGL 中,文本控件(Label)是一种基本的 UI 组件,用于显示文本信息。文本控件可以用于各种场景,如显示状态信息、提示消息、标题等。在图形用户界面(GUI)开发中,文本是传达信息和指导用户的重要组成部分。为了有效地展示文本,以下是与文本相关的几个关键方面…...

Java面试资源获取

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 **1. GitHub开源项目****2. 技术博客与社区*…...

探索 Spring AI 的 ChatClient API:构建智能对话应用的利器

探索 Spring AI 的 ChatClient API&#xff1a;构建智能对话应用的利器 前言 在当今人工智能蓬勃发展的时代&#xff0c;智能对话系统成为了众多应用的核心组成部分。无论是客服机器人、智能助手还是聊天应用&#xff0c;都离不开高效、灵活的对话处理能力。Spring AI 作为 S…...

Java大师成长计划之第11天:Java Memory Model与Volatile关键字

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 在多线程编程中&#xff0c;线程的执…...

java学习之数据结构:一、数组

主要是对数组所有的东西进行总结&#xff0c;整理 适合小白~ 目录 1.什么是数组 1.1数组定义 1.2数组创建 1&#xff09;静态创建 2&#xff09;动态创建 1.3数组遍历 1&#xff09;for和while遍历 2&#xff09;foreach遍历 2.数组越界问题及解决 2.1数组越界问题 2…...

Oracle OCP认证考试考点详解083系列04

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 16. 第16题&#xff1a; 题目 解析及答案&#xff1a; 关于使用恢复管理器&#xff08;RMAN&#xff09;恢复表&#xff0c;以下哪三项是…...

MARM:推荐系统中的记忆增强突破

文章目录 1. 背景1.1 模型规模与推荐系统的挑战1.2 缓存技术在推荐系统中的潜力1.3 推荐系统中的数据与计算需求1.4 复杂度对比1.5 MARM模型的创新性 2. 方法2.1 流程2.1.1 序列生成器2.1.2 外部缓存查找2.1.3 多目标注意力机制2.1.4 发结果到缓存 **2.2 MARM与SIM**2.2.1 SIM的…...

INP指标

什么是INP&#xff08;Interaction to Next Paint&#xff09; 参考网站&#xff1a;webVital-INP文档 定义与核心目标 INP 是一项稳定的 Core Web Vitals 指标&#xff0c;通过统计用户访问期间所有符合条件的互动约定时间&#xff0c;评估网页对用户操作的总体响应能力。最…...

Flink 的状态机制

在实时流处理领域&#xff0c;状态管理是构建复杂业务逻辑的核心能力。Apache Flink 通过统一的状态抽象和高效的容错机制&#xff0c;为开发者提供了从毫秒级窗口聚合到 TB 级历史数据关联的全场景支持。本文将深入剖析 Flink 状态机制的底层原理&#xff0c;结合实际案例展示…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】1.1 数据库核心概念与PostgreSQL技术优势

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 深度解析PostgreSQL核心架构与技术优势&#xff1a;从数据库原理到实战场景1.1 数据库核心概念与PostgreSQL技术优势1.1.1 关系型数据库核心架构解析1.1.1.1 数据库系统的底…...

linux下,ollama会把模型文件保存在哪里?

文章目录 运行ollama,有两种形式,估计得分开讨论首先是使用自动启动的ollama:先跑个“小一点的大模型”但是现在模型文件存在哪儿呢?运行ollama,有两种形式,估计得分开讨论 我们用两种方式,来运行ollama。 首先是使用自动启动的ollama: ps -aux | grep ollama系统自…...

EMMC存储性能测试方法

记于 2022 年 9 月 15 日 EMMC存储性能测试方法 - Wesley’s Blog 参考Android-emmc性能测试 | 一叶知秋进行实践操作 dd 命令 页面缓存 为了测试 emmc 的真实读写性能&#xff0c;我们需要先把页面缓存给清理&#xff1a; echo 1 > /proc/sys/vm/drop_caches console:…...

19. LangChain安全与伦理:如何避免模型“幻觉“与数据泄露?

引言&#xff1a;当AI成为企业"数字员工"时的责任边界 2025年某金融机构因AI客服泄露用户信用卡信息被罚款2300万美元。本文将基于LangChain的安全架构与Deepseek-R1的合规实践&#xff0c;揭示如何构建既强大又安全的AI系统。 一、AI安全风险矩阵 1.1 2025年最新威…...

5月3日日记

上午睡到自然醒&#xff08;其实六点多被我爸叫起来抢火车票&#xff0c;发现明天中午的软卧候补上了&#xff0c;挺好的&#xff09;然后继续睡到快10点。 中午吃的什么来着&#xff0c;好像是西红柿炒鸡蛋和藜麦饭&#xff0c;有个鱼不是很想吃就没吃 中午打了两把吃鸡&…...

C++类_构造函数

在 C11 里&#xff0c;类的构造函数有多种类型&#xff0c;下面为你详细介绍各类构造函数并给出示例代码。 1. 默认构造函数 默认构造函数是没有参数的构造函数&#xff0c;要是没有为类定义任何构造函数&#xff0c;编译器会自动生成一个默认构造函数。 2. 带参数的构造函数…...

【React】Hooks useReducer 详解,让状态管理更可预测、更高效

1.背景 useReducer是React提供的一个高级Hook,没有它我们也可以正常开发&#xff0c;但是useReducer可以使我们的代码具有更好的可读性&#xff0c;可维护性。 useReducer 跟 useState 一样的都是帮我们管理组件的状态的&#xff0c;但是呢与useState不同的是 useReducer 是集…...

Runnable组件重试机制降低程序错误率

一、LangChain 重试机制深度解析 当构建生产级AI应用时&#xff0c;with_retry() 机制可有效提升系统容错性&#xff0c;典型应用场景包括&#xff1a; API调用频率限制时的自动恢复模型服务临时不可用的故障转移网络波动导致的瞬时异常处理 参数详解与配置策略 1. 参数配置…...

纹理过滤方式和纹理包裹方式

纹理过滤方式 纹理过滤方式有临近过滤&#xff08;Nearest&#xff09;和双线性插值过滤&#xff08;Linear&#xff09;&#xff0c;什么时候用什么过滤方式其实看个人选择&#xff0c;区别就是临近过滤是当需要的像素大于图片像素时候&#xff0c;一些像素点需要复用与他相近…...

55.[前端开发-前端工程化]Day02-包管理工具npm等

包管理工具详解 npm、yarn、cnpm、npx、pnpm 1 npm包管理工具 代码共享方案 包管理工具npm 2 package配置文件 npm的配置文件 方式二 常见的配置文件 常见的属性 常见的属性 常见的属性 依赖的版本管理 常见属性 npm install 命令 项目安装 3 npm install原理 npm instal…...

Maven安装配置以及Idea中的配置教程

一、下载Maven 我使用的是3.9.9的版本&#xff1a; 下载地址&#xff1a;Download Apache Maven – Maven 二、安装 将下载好的Maven压缩包解压到一个路径不包含中文的文件夹&#xff1a; 三、配置环境变量 以win11系统为例&#xff1a; 1.鼠标右键此电脑->属性->…...

【JavaScript】性能优化:打造高效前端应用

文章目录 一、执行效率优化(关键路径优化)1.1 算法时间复杂度控制1.2 Web Workers多线程计算二、内存管理(避免内存泄漏)2.1 定时器清理2.2 DOM引用释放三、DOM操作优化(渲染性能)3.1 批量DOM更新3.2 读写分离策略四、网络传输优化(加载性能)4.1 代码分割(Dynamic Imp…...

【C语言练习】018. 定义和初始化结构体

018. 定义和初始化结构体 018. 定义和初始化结构体1. 定义结构体示例1:定义一个简单的结构体输出结果2. 初始化结构体示例2:在声明时初始化结构体输出结果示例3:使用指定初始化器初始化结构体(C99及以上标准支持)输出结果3. 结构体数组示例4:定义和初始化结构体数组输出结…...

Three.js支持模型格式区别、建议

在 Three.js 中,3D 模型的种类和格式非常多样,每种格式都有其适用场景和优缺点。以下是常见的 Three.js 支持的模型格式、它们的区别、使用建议及推荐。 在这里推荐免费的blender工具,免费、占用空间不大,而且好用,前端打开模型时使用不错,或者有自己想做的模型也可以用它…...

JavaScript基础-流程控制概念

在JavaScript编程中&#xff0c;掌握如何控制程序的执行流程是编写功能强大、逻辑清晰代码的关键。流程控制语句允许我们根据不同的条件执行不同的代码块&#xff0c;或者重复执行某些操作&#xff0c;从而实现复杂的功能逻辑。本文将详细介绍JavaScript中的几种主要流程控制结…...

PowerBI企业运营分析——多维度日期指标分析

PowerBI企业运营分析——多维度日期指标分析 欢迎来到Powerbi小课堂&#xff0c;在竞争激烈的市场环境中&#xff0c;企业运营分析平台成为提升竞争力的核心工具。 通过整合多源数据、实时监控关键指标&#xff0c;该平台能够精准分析业务表现&#xff0c;快速识别问题与机会…...

施磊老师rpc(三)

文章目录 mprpc框架项目动态库编译框架生成动态库框架初始化函数-文件读取1. 为什么要传入 argc, argv2. 读取参数逻辑3. 配置文件设计 init部分实现 mprpc配置文件加载(一)配置文件加载类成员变量主要方法**src/include/mprpcconfig.h** 配置文件**bin/test.conf** 实现配置文…...

k8s 探针

Kubernetes 中的探针&#xff08;Probes&#xff09;用于检测容器的健康状态或就绪状态&#xff0c;确保应用在运行时的可靠性。Kubernetes 提供三种探针类型&#xff0c;它们的核心区别在于用途和失败后的处理逻辑。以下是它们的详细说明和对比&#xff1a; 1. 启动探针&…...

MIT6.S081-lab8

MIT6.S081-lab8 1. Large files 从 lecture 我们可以知道&#xff0c;我们目前的单个文件的最大大小很小&#xff0c;这是因为我们能够索引的索引块范围很小&#xff0c;实际上&#xff0c;目前的索引只有直接索引和一级索引&#xff0c;而这个实验就是需要我们去实现二级索引…...