- 博客(26)
- 收藏
- 关注
原创 物联网项目开发全流程
物联网项目的开发是一个复杂的过程,涉及到硬件、软件、通信和数据等多个方面。从需求分析到系统设计,再到硬件选型、软件开发、测试和部署,每一步都需要精心规划与实施。通过合理的架构设计、合适的技术选型和充分的测试,可以确保物联网项目的成功实施。随着技术的不断进步,物联网的应用场景也在不断扩展,未来物联网将在各行各业中发挥更加重要的作用。希望通过本文,能够帮助你了解物联网项目开发的全过程,助你在未来的物联网项目开发中更加得心应手。
2025-12-10 16:55:04
795
原创 新建三个线程t1、t2、t3,如何实现按顺序打印1-100
通过使用和机制,我们能够确保多个线程按顺序执行打印任务。wait和notify使得线程能够在合适的时机挂起和唤醒,从而实现精确的执行控制。这种方法在多线程任务中非常常见,可以帮助解决许多类似的同步问题。希望这篇文章对你有帮助!如果你有任何问题或改进意见,欢迎留言讨论。
2025-12-10 16:30:26
514
原创 新建三个线程t1、t2、t3,如何让它们按顺序执行
join()方法可以确保一个线程在另一个线程完成之后再执行。我们可以通过让T2等待T1执行完,T3等待T2执行完,来保证线程按顺序执行。
2025-12-10 16:27:31
135
原创 MySQL 中的 B+树和 B树的区别详解
B 树是一种多路平衡查找树,常用于文件系统和数据库索引。一个节点可以有多个孩子(m 阶 B 树最多 m 个孩子)。节点中存储 key 和 data,每个 key 对应一条数据。所有叶子节点的深度相同,树始终保持平衡。B+ 树是 B 树的一种变体,也是MySQL InnoDB 索引的底层结构。非叶子节点只存储索引,不存储数据,数据全部存在叶子节点。叶子节点通过链表相连,便于范围查询和顺序遍历。树的高度更低—— 因为非叶子节点只存索引,所以能容纳更多 key。B 树。
2025-09-09 11:35:04
930
原创 ArrayList、LinkedList、Vector 的区别与底层实现
ArrayList:基于动态数组,查询快,插入删除慢,适合读多写少。LinkedList:基于双向链表,插入删除快,查询慢,适合写多读少。Vector:基于动态数组,线程安全,但性能差,已被替代。👉 在实际开发中,ArrayList是最常用的,LinkedList适合做队列/栈,Vector基本淘汰,推荐使用并发容器。
2025-09-08 14:48:35
759
原创 Java 常见集合类详解
类名底层结构是否有序是否允许重复是否线程安全适用场景ArrayList动态数组有序✅❌查询多LinkedList双向链表有序✅❌插入/删除多HashSetHashMap无序❌❌去重HashMap+链表插入顺序❌❌去重+保持顺序TreeSet红黑树排序❌❌有序集合HashMap数组+链表+红黑树无序❌常用 MapHashMap+链表插入/访问顺序❌LRU 缓存TreeMap红黑树排序❌有序 Map。
2025-09-08 14:46:00
1050
原创 线程池原理与使用详解
线程池是高并发编程中的重要工具,它通过线程复用、任务排队和统一管理,有效提升了系统性能与稳定性。本文总结了线程池的原理、构造参数、常见类型、使用示例及注意事项。在实际开发中,应根据业务场景合理配置线程池,避免资源浪费或系统崩溃。一句话总结:线程池就是“线程的复用工厂”,合理使用能让你的程序既快又稳。
2025-09-08 14:36:18
523
原创 一文搞懂 volatile 关键字的作用
volatile是一种轻量级同步机制。作用:保证可见性、禁止指令重排序。不能保证原子性,遇到复合操作需要搭配或Atomic类。常见于状态标志、单例模式等场景。一句话记忆:“volatile:看得见,排得开,看不住(原子性)。
2025-09-05 17:50:32
512
原创 ThreadLocal 原理与内存泄漏问题
并不是一个 Thread(线程),而是一个线程本地存储工具类。为每个线程提供一个独立的变量副本,互不干扰。例子:threadLocal.set("线程1的值");}, "T1");threadLocal.set("线程2的值");}, "T2");t1.start();t2.start();T1:线程1的值T2:线程2的值每个线程都存了自己的值,互不影响。每个线程维护一个,key 是 ThreadLocal(弱引用),value 是值。
2025-09-05 17:43:47
652
原创 HashMap 底层原理,一文搞懂扩容和冲突解决
兼顾空间利用率和冲突概率。太低(如 0.5):浪费空间。太高(如 0.9):冲突严重,查找效率下降。HashMap 底层是数组 + 链表 + 红黑树。哈希冲突:链表解决,冲突严重时转为红黑树。扩容机制:长度翻倍,JDK1.8 优化为只需 O(1) 判断。线程不安全 → 并发环境用。一句话记忆:“HashMap 用数组存储,链表/红黑树解决冲突,容量不够就翻倍扩容。
2025-09-02 09:40:02
837
原创 String、StringBuilder、StringBuffer 的区别,为什么 String 是不可变的?
特性String可变性❌ 不可变✅ 可变✅ 可变线程安全✅ 安全(不可变带来的特性)❌ 非线程安全✅ 线程安全(方法加性能低(频繁拼接会产生很多对象)高(适合单线程操作字符串)较低(比 StringBuilder 慢一点)底层存储结构byte[]可扩容char[]byte[]可扩容char[]byte[]适用场景不变字符串,如常量、配置、少量拼接高频拼接、单线程环境高频拼接、多线程环境String:不可变,线程安全,适合少量拼接、常量场景。
2025-09-02 09:32:20
348
原创 Spring Boot + 和风天气 API 实战:批量获取未来 7 日天气并入库
在农业、城市管理、旅游等业务系统中,天气信息往往是核心数据之一。今天我们来实现一个 Spring Boot 定时任务,调用批量获取多个地块的并入库。本案例结合实际业务逻辑,重点演示的完整流程。
2025-08-13 18:41:51
445
原创 大华摄像头对接全流程实战
本文记录了在项目中对接大华摄像头云平台的完整流程,涵盖等功能的实现细节,并结合 Redis、数据库存储、文件下载等实际业务场景进行讲解。
2025-08-13 11:00:45
1429
原创 redis是单线程吗? 为什么快
1.纯内存操作,redis的读写都是基于内存操作,避免大量访问数据数据库,减少直接读取磁盘数据,redis将数据存到内存中,读写数据的时候不会受到磁盘I/O的速度的限制,所以快。2.单线程操作,避免了多线程之间的竞争,避免了多进程或多线程的切换导致消耗cpu,也不用考虑各种锁的问题。3.redis6.0引入了多线程I/O,主要用于处理网络数据与协议的解析,但是读写操作仍然是单线程。2.redis4.0开始,也有后台线程在工作,例如aof重写机制。1.redis4.0之前完全是单线程。redis是单线程吗?
2025-07-26 19:47:27
137
原创 基于Redis+Rabbitmq,实现数据库缓存一致性(延迟双删)
当数据修改/新增/删除的时候,去第一次删除缓存,然后构建消息(商品id,超时时间500ms)发送异步消息到队列,当5s时间到了,消息会被发送到死信队列被消费掉,从而实现了延迟双删。创建一个普通交换机,普通队列,死信交换机,死信队列,互相绑定...这里我就不多说了。b在a删除缓存后查询,此时缓存未命中,去查询数据库但查询到的是旧数据。b在a更新数据库,删除缓存之间去查询数据库,此时b获取到的是旧数据。假如先更新数据库,后删除缓存,然后删除缓存。先删缓存,后更新数据库,然后在删除缓存。a删除缓存再更新数据库。
2025-07-24 20:31:53
310
原创 基于Redis+分布式锁,解决缓存雪崩,击穿,穿透
当未命中缓存时,线程a获取锁去查询数据库重建缓存,其他线程阻塞等待,如果a阻塞导致超时释放,其他线程去尝试获取锁重建缓存(自旋:也称递归,调用本身方法并且阻塞100ms)。这里我加了ThreadLocal,存储的自旋次数t,每次自旋t+1,如果自旋次数超过8次,则直接返回错误(避免重建缓存时间过长超过了客户的容忍度),记得最后删除ThreadLocal。是指在高并发下,某个被大量访问的key失效,导致大量的请求打到数据上,给数据库造成压力。2.设置定时任务,刷新缓存中热点数据的键值对,让热点数据永不过期。
2025-07-24 17:55:51
428
原创 springcloudalibaba聚合父工程项目
packaging>pom</packaging>和springboot,springcloud,springcloudalibaba的版本对应的依赖并统一管理。3.在设置里面修改文件编码为都为UTF-8,启用注解处理,忽略你不需要的文件。5.在.idea目录的workspace.xml加。2.创建完项目后把src目录删掉。目的是:能看到各个服务之间的运行。1.新建项目,jdk选1.8。
2025-03-16 16:08:16
368
原创 找到并杀掉占用8080端口的进程
netstat -ano | findstr :8080(查看占用8080端口的进程)1.win+r打开cmd,并运行。3.运行以下命令杀掉该进程。其中12345是进程ID。2.你会看到类似的输出。
2025-02-25 18:41:59
581
原创 若依框架生成代码中包路径,模块名,业务名分别代表什么
1.包路径:就代表包名,也就是后面的Controller,domain,service,mapper等都在该包下。2.模块名和业务名:与包路径无关 与controller的请求路径有关,模块名通常与表名一样。例:模块名为student 业务名为manage则请求路径为:student/manage。
2025-01-09 21:41:26
660
原创 若依框架Ruoyi-Vue-master怎么创建新模块并继承父模块
2.该模块的父maven自动生成为com.ruoyi,ruoyi的pom中自动生成。1.右键创建新模块,选择java模块,创建成功后删除Main类。4.在ruoyi-admin模块pom中添加。例如:模块名为ruoyi-teacher。5.在ruoyi模块pom中添加。
2025-01-09 21:32:35
345
原创 若依框架怎么启动前端(前后端分离版)
注:在NPM设置为淘宝源出现UNABLE_TO_GET_ISSUER_CERT_LOCALLY。清除npm中的代理和缓存:npm cache clean --force。解决命令:npm config set strict-ssl false。将终端切换成ruoyi-ui的命令:cd ruoyi-ui。最后的步骤:npm代理修改成功后,把npm切换成淘宝源。原因:这是因为淘宝源的ssl证书不能被npm接受导致的。查看镜像地址:npm get registry。访问地址localhost:80。
2024-11-04 16:25:36
843
原创 解决mapper.xml写sql语句没有提醒
最后也是最重要的:创建数据库的时候数据库必须选你要选择的架构(这个架构里面有很多表,你对这些表要进行sql操作的)才会有提醒 (比如我的:studentschema;1.在设置/settings里找到sql方言,然后两个sql语言都要选mysql,最后添加要作用的mapper/mapper.xml文件。2.鼠标靠近任意sql字段 alt+回车,选中语言注入设置,ID选择mysql。3.https:改成http。4.如果上面都没解决。
2024-10-28 17:16:48
587
原创 List的五种遍历方法和用处
ListIterator:用于添加元素//也可以用于删除元素。增强for循环和foreach:仅用于遍历集合或对象。迭代器Iterator:用于删除元素列表迭代器。普通for循环:用于获取需要的索引。
2024-03-31 10:37:14
217
1
原创 解决mysql连接失败问题connection refused:connection
解决:首先打开任务管理器,再打开服务,找到Mysql右键开始。出现这个问题很有可能是mysql/数据库没有打开。
2024-03-30 10:40:56
8400
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅