- 博客(155)
- 收藏
- 关注
原创 SpringBoot学习笔记(万字长文警告)
本文介绍了SpringBoot开发中的实用技巧与整合方案,主要内容包括:1)基础配置部分涵盖属性配置方式、YAML语法及第三方技术整合(JUnit/MyBatis/Druid);2)SSMP整合案例演示了实体类开发、数据层配置及分页查询实现;3)运维篇涉及多环境配置、日志管理及热部署;4)开发实用篇重点讲解缓存技术整合(Ehcache/Redis/Memcached/JetCache)及邮件发送功能实现,包括简单邮件和多部件邮件的发送方法。全文通过代码示例展示了SpringBoot与各类技术的深度整合方案。
2025-12-12 14:50:34
396
原创 Redis学习笔记(五万字超详细,配具体代码及个人理解,包括redis在项目中的具体使用及优化查询)
本文详细介绍了Redis在Java项目中的应用实践,包括基础操作、高级功能及性能优化方案。主要内容涵盖:1. 基础篇:Jedis和Spring Data Redis的使用、短信登录实现、缓存穿透/雪崩/击穿解决方案(互斥锁/逻辑过期)、分布式锁实现与优化(Redisson)2. 实战篇:优惠券秒杀业务(全局ID生成、超卖控制、异步下单)、达人探店(点赞功能)、好友关注(共同关注)、附近商铺(GEO查询)3. 高级篇:Redis主从集群、哨兵机制、分片集群搭建,多级缓存架构(JVM进程缓存+Caffeine)
2025-12-01 16:49:47
905
原创 电商系统中在高并发情景下基于redis实现下单优化
本文探讨了基于Redis优化秒杀系统的解决方案。首先介绍全局ID生成器的实现,通过时间戳和序列号组合保证唯一性。针对超卖问题,提出乐观锁方案,利用版本号和CAS机制保证库存安全。对于一人一单场景,对比了悲观锁和分布式锁的优劣,详细分析了锁范围、事务失效等关键问题。重点讲解了Redis分布式锁的实现与改进,包括锁误删、原子性操作等问题的解决方案,最终使用Lua脚本确保操作的原子性。进一步引入Redisson优化分布式锁,解决了可重入、重试机制等问题。最后提出异步秒杀方案,将判断逻辑移至Redis,通过阻塞队列
2025-11-18 17:47:25
835
原创 项目中基于redis实现缓存
不依赖 Redis 的原生过期时间,而是在缓存数据中嵌入一个 "逻辑过期时间",当检测到数据过期时,先返回旧数据,同时异步重建缓存,避免大量请求阻塞或穿透到数据库。其优势是响应速度快(不阻塞请求),缺点是需要额外存储过期时间,且数据存在短暂不一致窗口。命令实现分布式锁,保证同一时间只有一个线程能执行缓存重建(从数据库查询数据并写入缓存),避免大量请求同时穿透到数据库。是 Redis 的原子命令,确保多个线程同时尝试获取锁时,只有一个线程能成功。方法的实现依赖 Redis 的。
2025-11-14 16:36:13
1194
原创 基于session实现短信登录
本文介绍了一种基于Redis实现分布式Session共享的登录方案,并设计了双重拦截器机制。系统通过Redis存储用户会话信息,解决集群环境下的Session共享问题。具体实现包括两个拦截器:RefreshTokenInterceptor拦截所有请求,自动刷新已登录用户的Redis token有效期;LoginInterceptor专门拦截需要登录的接口。拦截器配置类通过order属性控制执行顺序,支持路径排除规则。该方案实现了登录状态维护、游客访问控制、token自动刷新等功能,采用ThreadLocal
2025-11-14 16:29:05
177
原创 236. 二叉树的最近公共祖先
中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。节点 5 和节点 1 的最近公共祖先是节点 3。
2025-10-16 15:10:48
212
原创 763. 划分字母区间
本文介绍了划分字符串片段的算法。给定字符串s,要求将其划分为若干片段,每个字母只能出现在一个片段中。算法首先记录每个字符的最后出现位置,然后遍历字符串时动态维护当前片段的边界,当到达边界时完成一个片段划分。示例1将"ababcbacadefegdehijhklij"划分为[9,7,8],示例2将"eccbbbbdec"划分为[10]。该算法时间复杂度O(n),空间复杂度O(1),能高效解决问题。
2025-10-15 17:17:51
173
原创 739. 每日温度
题目要求计算每日温度之后第一个更高温度出现的天数差。给出了两种解法:1. 单调栈解法(高效):使用栈存储温度索引,遇到更高温度时弹出栈顶元素并计算天数差,时间复杂度O(n)。2. 暴力解法:对每一天向后遍历寻找更高温度,时间复杂度O(n²)。示例显示输入温度数组[73,74,75,71,69,72,76,73]对应输出为[1,1,4,2,1,1,0,0]。单调栈解法更优,适合处理大规模数据。
2025-10-15 16:19:01
259
原创 76. 最小覆盖子串
该题目要求找出字符串s中包含字符串t所有字符的最小子串。使用滑动窗口算法,通过双指针维护窗口边界,统计字符需求数组need。当窗口满足t字符需求时,记录最小窗口并尝试收缩左边界。时间复杂度O(n),空间复杂度O(1)。关键点:1)维护字符需求数组;2)使用missing计数判断窗口有效性;3)收缩窗口时更新最小长度。示例如s="ADOBECODEBANC",t="ABC"时,输出"BANC";当t字符数超过s时返回空串。该解法高效解决了字符串最小覆
2025-10-14 17:36:15
306
原创 438. 找到字符串中所有字母异位词
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
2025-10-14 17:04:04
378
原创 394. 字符串解码
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数。给定一个经过编码的字符串,返回它解码后的字符串。测试用例保证输出的长度不会超过。,表示其中方括号内部的。
2025-10-13 22:01:35
153
原创 322. 零钱兑换
题目要求用最少数量的硬币凑成指定金额,硬币无限使用。采用动态规划,dp[i]表示金额i的最小硬币数。初始化dp[amount+1]为极大值,dp[0]=0。遍历金额1到amount,对每个硬币面额,若可用则更新dp[i]为min(dp[i], dp[i-coin]+1)。最终返回dp[amount](若未被更新则返回-1)。例如,coins=[1,2,5], amount=11时,结果为3(5+5+1)。时间复杂度O(n*amount),空间复杂度O(amount)。
2025-10-11 11:19:16
131
原创 155. 最小栈
-> 返回 -3.minStack.getMin();--> 返回 -2.minStack.top();操作,并能在常数时间内检索到最小元素的栈。
2025-10-09 19:53:32
296
原创 543. 二叉树的直径
3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。这条路径可能经过也可能不经过根节点。是指树中任意两个节点之间最长路径的。给你一棵二叉树的根节点,返回该树的。由它们之间边数表示。
2025-10-04 20:57:15
232
原创 Redisson分布式限流
Redisson 是一个基于 Redis 的 Java 分布式框架,它不仅提供了对 Redis 各种数据结构的封装,还实现了许多分布式相关的服务,如分布式锁、限流器、信号量等,非常适合用于分布式系统中的流量控制、资源保护等场景。其核心特点包括:1.丰富的分布式对象:提供了分布式集合(如 Map、List、Set)、分布式锁(RLock)、限流器(RRateLimiter)、信号量(RSemaphore)等,简化分布式开发。2.高性能。
2025-10-04 14:36:56
1160
原创 通过Selenium实现网页截图来生成应用封面
Selenium 是一个开源的 Web 应用程序自动化测试工具集,主要用于模拟用户在浏览器中的各种操作,实现对 Web 应用的自动化测试、数据爬取、定期任务执行等功能。其核心是,它提供了一套跨编程语言、跨浏览器的 API,让开发者可以通过代码控制浏览器行为(如点击、输入、跳转、截图等)。在实际使用建议搭配WebDriverManager使用,可以1. 无需手动下载浏览器驱动,告别找版本、下文件的繁琐;2. 自动匹配浏览器版本,避免因版本不兼容导致的运行失败;
2025-09-28 21:07:48
844
原创 项目中为AI添加对话记忆
cc大部分时候根据用户提交的提示词给AI生成的网站没办法一次性满足需求,所以需要为用户提交网站修改功能。如果AI没有对话记忆,则每次修改都是重新生成代码,而不是在原有的基础上修改。因此我们需要为AI添加对话记忆,使得每次的生成都携带着之前的对话。
2025-09-27 15:35:56
1016
原创 游标查询在对话历史场景下的独特优势
类型核心定义对话历史模块中的实现方式传统分页查询基于 “页码(page)+ 页大小(size)” 的离散查询,后端通过LIMIT(页大小)和OFFSET(跳过前 N 条数据)实现数据截取(第 1 页,10 条 / 页)、OFFSET 10(第 2 页)游标查询基于 “游标(cursor)” 的连续查询,游标是上一页最后一条数据的唯一标识(如对话 ID、时间戳),后端通过 “游标过滤” 获取下一页数据用户点击 “加载更多”,后端以上一页最后一条对话的id(或。
2025-09-26 16:58:22
816
原创 应用部署(后端)
在项目中,将AI生成的应用存储在本地目录中,手动双击打开HTML来查看网站生成效果。我们想将其平台化,就要将应用部署到。考虑到成本原因,我们这里选择把本地生成的文件同步到一个Web服务器的不同目录上。用户通过URL访问应用(如https://code-ai.cn/app1/)。
2025-09-26 16:00:44
726
原创 2. 两数相加
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。的链表,表示两个非负的整数。它们每位数字都是按照。请你将两个数相加,并以相同形式返回一个表示和的链表。的方式存储的,并且每个节点只能存储。
2025-09-26 14:29:29
180
原创 153. 寻找旋转排序数组中的最小值
它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的。原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。的数组,预先按照升序排列,经由。你必须设计一个时间复杂度为。
2025-09-23 09:17:03
152
原创 198. 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 2 + 9 + 1 = 12 .偷窃到的最高金额 = 1 + 3 = 4。给定一个代表每个房屋存放金额的非负整数数组,计算你。,一夜之内能够偷窃到的最高金额。
2025-09-22 13:40:50
161
原创 33. 搜索旋转排序数组
则返回它的下标,否则返回。你必须设计一个时间复杂度为。按升序排列,数组中的值。在预先未知的某个下标。上向左旋转后可能变为。
2025-09-22 13:23:18
215
原创 34. 在排序数组中查找元素的第一个和最后一个位置
请你找出给定目标值在数组中的开始位置和结束位置。给你一个按照非递减顺序排列的整数数组。你必须设计并实现时间复杂度为。如果数组中不存在目标值。
2025-09-19 13:20:57
215
原创 128. 最长连续序列
找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。最长数字连续序列是 [1, 2, 3, 4]。请你设计并实现时间复杂度为。给定一个未排序的整数数组。
2025-09-18 11:21:24
145
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅