首页 文章 精选 留言 我的

精选列表

搜索[java ee],共10000篇文章
优秀的个人博客,低调大师

Redis分布式锁,java程序员必备技能!

**戴嘎猴啊**,我是程序员卡卡罗特~ ![](https://developer.qcloudimg.com/http-save/yehe-4860696/bb3b0c2a5007489a3c1d7a316bbdeedb.png) 在分布式系统架构中,随着业务规模的扩大,我们不可避免地会遇到**多节点并发操作共享资源**的问题。 **在企业真实项目中,Redis分布式锁一般是怎么用的呢?** ## ✿1、为什么需要Redis分布式锁? 在**单体应用**中,我们可以用`synchronized`或`ReentrantLock`等本地锁解决并发问题。 但当系统拆分为微服务,部署在**多台服务器**后,本地锁就失去了作用——因为不同服务器上的进程无法感知彼此的锁状态。 Redis分布式锁正是为解决这类跨**服务器节点**并发问题而生: **•** 保证同一时间,只有一个服务器节点的一个进程能执行**一段代码** **•** 防止因并发操作导致的数据不一致(如重复数据、数据错乱) ## ✿2、举个栗子 > *用Redis分布式锁解决用户重复注册问题* 用户注册场景中,如果同一用户(比如同一手机号)在极短时间内提交多次注册请求,可能导致重复创建用户记录。 实际上,前端会做**防抖校验**,也是防止用户重复点击的,但是后端是必须要做的!因为万一前端没做呢?或者有人在你的网站通过代码调用注册接口呢🤔,emmm... ![](https://developer.qcloudimg.com/http-save/yehe-4860696/8e56e312d4c45a63b9562ed089b792c8.png) 我们可以用Redis分布式锁来避免这种情况。 ### 1. 分布式锁核心实现 > *这个类可以作为公共类使用* ``` @Component public class RedisDistributedLock { @Autowired private StringRedisTemplate redisTemplate; // 锁的过期时间(30秒),防止死锁 private static final long LOCK_EXPIRE_MILLIS = 30000; // 尝试获取锁的超时时间(5秒) private static final long ACQUIRE_TIMEOUT_MILLIS = 5000; /** * 尝试获取分布式锁 * @param lockKey 业务唯一标识(如手机号) * @return 锁的value(用于释放锁时的身份验证) */ public boolean lock(String lockKey) { // SET NX PX:不存在则设置,同时设置过期时间 return redisTemplate.opsForValue().setIfAbsent(lockKey, "1", Duration.ofMillis(LOCK_EXPIRE_MILLIS)); } /** * 释放分布式锁 * @param lockKey 业务唯一标识 */ public void unlock(String lockKey) { if (lockValue == null) { return; } redisTemplate.delete(lockKey); } } ``` ### 2. 在用户注册业务中使用 ``` @Service public class UserRegistrationService { @Autowired private RedisDistributedLock distributedLock; @Autowired private UserRepository userRepository; /** * 用户注册方法 * @param phone 手机号(作为唯一标识) * @param userInfo 用户信息 * @return 注册结果 */ public Result registerUser(String phone, UserInfo userInfo) { boolean locked = false; String lockKey = "USER_REGISTER_LOCK_" + phone; try { // 1、加锁失败,提前退出 if (!distributedLock.lock(lockKey)) { return Result.fail("操作过于频繁,请稍后再试"); } // 2. 检查用户是否已注册(临界区操作) User existingUser = userRepository.findByPhone(phone); if (existingUser != null) { return Result.fail("该手机号已注册"); } // 3. 执行注册逻辑 User newUser = new User(); newUser.setPhone(phone); newUser.setUsername(userInfo.getUsername()); // ... 设置其他用户信息 userRepository.save(newUser); return Result.success("注册成功", newUser.getId()); } finally { if (locked) { distributedLock.unlock(lockKey); } } } } ``` ### 重点 ``` return redisTemplate.opsForValue().setIfAbsent(lockKey, "1", Duration.ofMillis(LOCK_EXPIRE_MILLIS)); ``` 核心是这段代码:当redis存在`lockKey`的时候,返回的是false。不存在的时候,返回的是true。 底层是依赖redis的`set nx`明了,来保证加锁的原子性。 ## ✿总结 Redis分布式锁是解决分布式系统并发问题的重要工具,它通过Redis的单线程特性和原子命令,为跨节点的临界区操作提供了可靠的互斥保障。 在用户注册、商品秒杀、订单创建等核心场景中,合理使用分布式锁能有效避免数据不一致问题,保障系统的稳定性和数据准确性。 需要注意的是,Redis分布式锁在某些情况存在坑🤔,在实际使用中还需考虑Redis集群环境下的锁可靠性、锁过期时间设置等细节**,这些我们会在后续文章中深入探讨**。 ![](https://developer.qcloudimg.com/http-save/yehe-4860696/4799f845bf763daeb05349f62ec4c2a9.png) ---

优秀的个人博客,低调大师

🎉smart-mqtt v1.5.4 发布:Java MQTT Broker

继 v1.5.3 版本完成 Broker 性能优化与插件生命周期增强后,我们很高兴地宣布 smart-mqtt v1.5.4 正式发布! 本次版本围绕一个非常关键的主题展开:企业级连接认证能力升级。 我们正式推出全新的 advanced-auth-plugin 高级认证插件。 通过认证链机制、异步认证模型与多种认证后端支持,帮助企业更从容地应对高并发设备接入场景。 一、核心亮点与配置体验 v1.5.4 的重点很明确:通过 advanced-auth-plugin,让 smart-mqtt 的连接认证更适合企业真实场景。它不是只多了一个认证插件,而是把“认证能力、稳定性、接入方式”一起做了升级。 更容易落地:支持 Redis 和 HTTP 两类常见认证方式,既能对接现有业务系统,也能兼顾高频设备接入场景 更稳:面对设备批量重连或外部认证服务波动时,Broker 更不容易被认证压力拖垮 更好演进:可以先走 Redis 提升效率,再用 HTTP 做兜底,让认证体系按业务节奏逐步升级 这也不是在一个“只够用”的 Broker 底座上叠加新能力。smart-mqtt 过往公开压测中,QoS0 吞吐曾达到 1000W/秒,产品也持续围绕 10万+ 设备接入场景 做优化。v1.5.4 的高级认证插件,正是在这套高性能底座上继续补齐企业级接入能力。 如果你关注 Redis 方向的轻量异步能力,也欢迎了解 redisun 项目,它是 smartboot 体系下持续打磨的 Redis 基础组件。 最常见的落地方式,就是采用“Redis 优先、HTTP 兜底”的认证链: stopOnError: false allowAnonymous: false chain: - redis - http redis: address: redis://localhost:6379 database: 0 http: url: http://localhost:8080/api/auth timeout: 5000 这类配置的价值很直接:接入门槛低,替换成本也低。不用侵入 Broker 核心逻辑,就能把现有认证系统逐步接进来。 二、获取 v1.5.4 📦 下载地址 GitHub Releases: https://github.com/smartboot/smart-mqtt/releases/tag/v1.5.4 Gitee Releases: https://gitee.com/smartboot/smart-mqtt/releases/v1.5.4 🐳 Docker 一键部署 docker run --name smart-mqtt \\ -p 1883:1883 \\ -p 18083:18083 \\ -d smartboot/smart-mqtt:latest 🚀 快速启动 # 下载并解压 curl -LO https://gitee.com/smartboot/smart-mqtt/releases/download/v1.5.4/smart-mqtt-full-v1.5.4.zip unzip smart-mqtt-full-v1.5.4.zip -d smart-mqtt && cd smart-mqtt # 启动服务 ./start.sh 三、未来展望 基于 v1.5.4 的高级认证能力,我们接下来将继续推进以下方向: 认证器类型扩展:继续完善更多认证后端支持,覆盖更丰富的企业接入场景 认证链增强:支持更细粒度的链路编排与策略控制 观测能力补齐:完善认证日志、失败统计、耗时指标等可观测能力 插件生态完善:围绕连接治理、消息治理、安全管控持续丰富插件矩阵 企业级稳定性提升:持续优化 Broker 在高并发连接和异常场景下的服务韧性 四、加入社区 欢迎所有对 MQTT、物联网平台、企业级中间件感兴趣的朋友加入我们的社区! 社区资源 官方文档:https://smartboot.tech/smart-mqtt GitHub 仓库:https://github.com/smartboot/smart-mqtt Gitee 仓库:https://gitee.com/smartboot/smart-mqtt 扫描微信二维码备注:smart-mqtt 可加入 smartboot 社群。(PS:若无备注将拒绝好友申请) smart-mqtt v1.5.4:更灵活的认证,更稳定的接入 用异步认证链承接企业级设备集中接入高峰,为物联网基础设施提供更强的安全与韧性

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册