如何实现Redisson分布式锁
首先,不要将分布式锁想的太复杂,如果我们只是平时业务中去使用,其实不算难,但是很多人写的文章不能让人快速上手,接下来,一起看下Redisson分布式锁的快速实现
Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格客户端(In-Memory Data Grid)。它不仅提供了一系列的 redis 常用数据结构命令服务,还提供了许多分布式服务,例如分布式锁、分布式对象、分布式集合、分布式远程服务、分布式调度任务服务等等。
Redisson:其实就是相当于在redis的基础上进行了加强,让redisson不像redis的分布式是直接基于指令setnx(set if not exists: 如果不存在)去实现的。
开始配置
因为redission是基于redis的,所以我们需要本地安装reids,redis安装这里就不演示了,这里是使用springboot创建的项目,我们默认项目已经创建完成了,所以直接开始配置
项目结构

1、配置redis
#以下是application.yml中的配置
server:port: 8083spring:redis:host: localhostport: 6379timeout: 1000jedis:pool:min-idle: 5max-idle: 10max-wait: -1
2、配置pom.xml 引入相关jar包
<!-- 引入redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 引入redisson --><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.17.7</version></dependency>
3、编写测试并发类
package cn.sendmsg.test;
import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.TimeUnit;@RestController
@Slf4j
public class redissonController {@RequestMapping("/testLock")public void testRedissLock(){// 使用Redisson 设置分布式锁//1、配置Redisson客户端 Config对象用于配置 Redisson 客户端的参数。Config config = new Config();//2、连接地址 连接方式redis:// 或者 rediss://// 集群使用// config.useClusterServers()// .setScanInterval(2000) // 集群状态扫描间隔时间,单位是毫秒// //可以用"rediss://"来启用SSL连接// .addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001")// .addNodeAddress("redis://127.0.0.1:7002");/** userSingleServer():指定使用单个redis服务配置* setAddress() : 设置 Redis 服务器的地址* setPassWord(): 设置连接 Redis 服务器的密码,如果有的话* setDatabase(0): 设置连接的数据库索引,0就表示第一个* */config.useSingleServer().setAddress("redis://localhost:6379");//3、 创建Redisson客户端RedissonClient redissonClient = Redisson.create(config);String lockValue = "isLock";// 获取红锁RLock redissonLock = redissonClient.getLock(lockValue);try {// 后去锁,如果获取到返回true// tryLock():尝试3秒内获取锁,如果获取到了,最长3秒自动释放boolean lock = redissonLock.tryLock(3L,3L, TimeUnit.SECONDS);// 获取锁后,开始执行需要加锁的逻辑代码if(lock){System.out.println("获取到锁了");for(int i =0;i<5;i++){log.info("执行逻辑,查看打印结果:{}",i);}}} catch (InterruptedException e) {log.info("获取锁失败,失败原因:{}",e.getMessage());throw new RuntimeException(e);}finally {// 最后一定要释放锁,不然有可能造成死锁现象redissonLock.unlock();}}// 用于jmater测试不加锁的信息,对比看@RequestMapping("/testNoLock")public void testRedissNoLock(){for(int i =0;i< 10;i++){log.info("无分布式锁的逻辑:"+i);}}}
4、使用jmater测试(这是个压测工具,可以一次性发多个线程,来进行压力测试),这个自行安装以下
以下是jmater工具页面截图,这个花3分钟时间,自己学习下,主要还是设置yml、pom.xml、测试类,这个属于工具

5、查看本地代码运行结果(注意看打印结果,因为获得了分布式锁,所以在执行代码块for循环时,是顺序的,不然不是顺序的)
获取到锁了
2023-11-14 14:51:45.840 INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.840 INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.840 INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.840 INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.840 INFO 40508 --- [nio-8083-exec-4] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:4
获取到锁了
2023-11-14 14:51:45.862 INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.862 INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.862 INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.862 INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.862 INFO 40508 --- [nio-8083-exec-5] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:4
获取到锁了
2023-11-14 14:51:45.866 INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.866 INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.866 INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.866 INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.866 INFO 40508 --- [nio-8083-exec-2] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:4
获取到锁了
2023-11-14 14:51:45.869 INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.869 INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.869 INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.869 INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.869 INFO 40508 --- [nio-8083-exec-3] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:4
获取到锁了
2023-11-14 14:51:45.872 INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:0
2023-11-14 14:51:45.872 INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:1
2023-11-14 14:51:45.872 INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:2
2023-11-14 14:51:45.872 INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:3
2023-11-14 14:51:45.872 INFO 40508 --- [nio-8083-exec-1] cn.sendmsg.test.redissonController : 执行逻辑,查看打印结果:4
到这里,其实我们就已经实现Redisson分布式锁了,不要把这个想的太复杂,可能在集群时需要注意些。 示例代码中演示了集群时如何设置。这是一个简单的案例,但实际开发者,获取锁-释放锁也是这么用的。加油
6、不加锁使用jmater打印的信息
不加锁,for循环打印时,输出日志就不是有顺序的
15:00:40.217 INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:3
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:4
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:5
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:6
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:7
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:8
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-17] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:9
2023-11-14 15:00:40.081 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:1
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:2
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:3
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:4
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:5
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:6
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:7
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:8
2023-11-14 15:00:40.217 INFO 40508 --- [io-8083-exec-16] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:9
2023-11-14 15:00:40.078 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:5
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:6
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:7
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:8
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:9
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:0
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:1
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:2
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:3
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:4
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:5
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:6
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:7
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:8
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-23] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:9
2023-11-14 15:00:40.210 INFO 40508 --- [io-8083-exec-25] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:6
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-25] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:7
2023-11-14 15:00:40.218 INFO 40508 --- [io-8083-exec-25] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:8
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:0
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:1
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:2
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:3
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:4
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:5
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:6
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:7
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:8
2023-11-14 15:00:40.218 INFO 40508 --- [nio-8083-exec-7] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:9
2023-11-14 15:00:40.211 INFO 40508 --- [io-8083-exec-26] cn.sendmsg.test.redissonController : 无分布式锁的逻辑:0
相关文章:
如何实现Redisson分布式锁
首先,不要将分布式锁想的太复杂,如果我们只是平时业务中去使用,其实不算难,但是很多人写的文章不能让人快速上手,接下来,一起看下Redisson分布式锁的快速实现 Redisson 是一个在 Redis 的基础上实现的 Java…...
Kafka(三)生产者发送消息
文章目录 生产者发送思路自定义序列化类配置生产者参数提升吞吐量 发送消息关闭生产者结语示例源码仓库 生产者发送思路 如何确保消息格式正确的前提下最终一定能发送到Kafka? 这里的实现思路是 ack使用默认的all开启重试在一定时间内重试不成功,则入库ÿ…...
2020年五一杯数学建模C题饲料混合加工问题解题全过程文档及程序
2020年五一杯数学建模 C题 饲料混合加工问题 原题再现 饲料加工厂需要加工一批动物能量饲料。饲料加工需要原料,如加工猪饲料需要玉米、荞麦、稻谷等。加工厂从不同的产区收购了原料,原料在收购的过程中由于运输、保鲜以及产品本身属性等原因ÿ…...
公益SRC实战|SQL注入漏洞攻略
目录 一、信息收集 二、实战演示 三、使用sqlmap进行验证 四、总结 一、信息收集 1.查找带有ID传参的网站(可以查找sql注入漏洞) inurl:asp idxx 2.查找网站后台(多数有登陆框,可以查找弱口令,暴力破解等漏洞&…...
Word软件手动安装Zotero插件
文章目录 Word软件手动安装Zotero插件方法一方法二 参考资料 Word软件手动安装Zotero插件 方法一 关闭word在zotero中依次点击编辑—首选项—引用—文字编辑软件—重新安装加载项Microsoft word 方法二 寻找Zotero.dotm存储位置, 例如D:\Program Files\Zotero\ext…...
idea 插件推荐第二期
文章目录 便捷开发CodeGlance Pro (代码缩略图)GenerateAllSetter(快速生成对象所有set方法)GsonFormatPlus:json转实体RestfulToolkitX(找到controller快捷请求接口) 美化activate-power-mode-x (敲击计数、动效)Nyan…...
plsql查询中文出现乱码
添加环境变量:如下 变量名:NLS_LANG 变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK 变量名:TNS_ADMIN 变量值:D:\instantclient_11_2\network\admin 在Path中添加instantclient_11_2存放路径...
【Docker】五分钟完成Docker部署Java应用,你也可以的!!!
文章目录 前言一、部署步骤1.项目结构2.Dockerfile3.docker-compose.yml4.启动5.常用命令 总结 前言 本文基于Docker Compose部署Java应用,请确保你已经安装了Docker和Docker Compose。 十分钟就能上手docker?要不你也试试? 一、部署步骤 1…...
如何准备2024年的系统设计面试?
1 前言 如果你正在准备软件工程师或软件开发人员的面试,那么你可能知道由于其开放性质和广泛性,准备系统设计是多么困难,但同时你也不能忽略它。在软件工程界,如果你正在申请高级工程师/主管/架构师或更高级别的角色,系统设计是最受追捧的技能,也是整个过程中最重要的环节之一…...
【开源】基于JAVA的电子元器件管理系统
目录 一、摘要1.1 项目简介1.2 项目详细录屏 二、研究内容三、界面展示3.1 登录&注册&主页3.2 元器件单位模块3.3 元器件仓库模块3.4 元器件供应商模块3.5 元器件品类模块3.6 元器件明细模块3.7 元器件类型模块3.8 元器件采购模块3.9 元器件领用模块3.10 系统基础模块 …...
足底筋膜炎怎么治疗治愈
足底筋膜炎又称为跖筋膜炎,跖筋膜主要在足弓下方,它维持足弓稳定性,对于喜欢长期长跑、跳远,或者越野运动,或者部队中的士兵进行拉练,还有需要久坐或者久站的人群中,容易发生跖筋膜炎。治疗方法…...
Keil工程忽略文件.gitignore、自动删除脚本:keilkilll.bat、自动生成目录文件列表脚本
Keil工程忽略文件:.gitignore 忽略规则 *.rar *.o *.d *.crf *.htm *.dep *.map *.bak *.lnp *.lst *.ini *.iex *.sct *.scvd *.dbg* *.uvguix.* *Log.*#忽略.gitignore根目录下的文件夹,根据自己的需要修改 RTE/ Templates/ Examples/ OBJ/#不能忽略…...
软考高级职称哪个好考?明确给你答案
软考考试分为初、中、高三级,其中高级5个方向分别为系统分析师、信息系统项目管理师、网络规划设计师、系统架构设计师、系统规划与管理师。软考高级职称考什么好?有很多人是因为要评高级职称而选择参考软考高级资格考试,那么软考高级里哪个资…...
智能客服外包服务适用于哪些行业?
在当今快节奏的商业环境下,企业需要更高效、更智能且更灵活的客户服务解决方案。而智能客服外包服务正是满足这一需求的利器。不仅可以帮助企业提升客户服务的品质和效率,还能降低企业的运营成本。智能客服外包服务适用于哪些行业呢? 1.电子…...
数字化企业各业务模块模型
1.计划 1.1采购计划执行情况 序号 采购计划号 采购订单号 业务员 供应商 物料 数量 金额 计划入库日期 实际入库日期 状态 针对企业执行中或者未关闭的采购计划进行统计与分析,主要目的在于引领企业员工与领导关注长期在途的采购…...
WPF动画小知识
一、动画合集 创建一个Storyboard演示画板,在画板里对动画进行定义与处理。 常见动画类型 提醒:更多介绍可查看microsoft提供的相关文档 DoubleAnimation //普通Double型控制动画 DoubleAnimationUsingKeyFrames //Dou…...
数据结构 顺序表和链表
1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串.. 线性表在逻辑上是线性结构,也就说是连续的一条直线…...
LMI相机配置步骤,使用Gocator2550相机
在此之前可以先浏览我编写的相机SDK通用类和LMISDK,进行配套观看 https://blog.csdn.net/m0_51559565/article/details/134404394 //LMI相机SDK https://blog.csdn.net/m0_51559565/article/details/134403745 //相机通用类1.启动LMI加速器 LMI加速器用于将相机…...
掌握Python中的控制流语句:break, continue, quit的应用技巧详解
引言 在Python编程中,控制流语句是非常重要的一部分,它们可以帮助我们控制程序的执行流程。其中,break、continue和quit是常用的控制流语句,它们可以在循环中起到关键作用。本文将详细介绍这些控制流语句的应用技巧,帮…...
TS手动编译和自动编译方法
把 TS 文件编译成 JS 文件 安装 npm i -g typescript检查是否安装成功 tsc -v方法一 先通过 tsc 把 .ts 文件编译成 .js 文件,再通过 node 把 .js 文件运行 方法二 通过监视配置页面 初始化 tsc --init自动生成一个tsconfig.json 文件 点击进入tsconfig.js…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
