自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 收藏
  • 关注

原创 disryptor和rabbitmq

用于在。

2025-05-19 21:54:38 568

原创 Redis的缓存三兄弟,管道技术,内存淘汰策略以及多种线程模型

在系统对外提供服务之前,就把数据预先加载到Redis中,优化用户的请求不去访问数据库(使用异步线程或者定时job,定时的将数据库中的数据加载到Redis中)对一个key设置了过期时间时,Redis会把该key带上过期时间存储到一个过期字典中,字典保存了数据库中所有key的过期时间。事务提供了一种“将多个命令打包,然后一次性,按顺序地执行”的执行的机制,并且事务在执行的期间不会主动中断。发送的命令数量不会被限制,命令的最大的存储体积为1G,当命令超过限制,命令就不会执行了。

2025-05-19 21:53:26 521

原创 本地缓存的三种实现

当窗口中的条目要进入主区域,或者有新条目要替换主区域中的条目时,Caffeine 会使用 TinyLfu 估算的频率信息来决定是否“录取”这个条目进入主区域,以及淘汰主区域中的哪个条目。这是一种近似的 LFU (Least Frequently Used,最不常用) 算法,它通过一个紧凑的数据结构(如 Count-Min Sketch)来。Caffeine 将缓存分为一个小的“窗口”区域和一个大的“主”区域。Caffeine 使用的缓存淘汰算法比 Guava 的 LRU 更先进、更复杂和高效。

2025-05-13 21:21:26 348

原创 binlog日志以及MySQL的数据同步

给每一个从库,都需要有单独的线程来处理,数据传输多份就要消耗更多的带宽,这会给主库的性能造成很大的压力,不仅不能提升系统性能,反而适得其反,对于生产环境来说,一般都是两到三个从库。:从库会创建一个SQL线程,会读取relay-log中的终极日志,重放binlog,从而更新从库中的数据,其实就是把binlog重新执行了一遍,加载到从库的DB中,完成主从的复制。:MySQL的从库创建的IO线程会连接到主库的binlog,主库会为每一个从库创建一个。中接收到主库的文件,把binlog文件写入到本地的。

2025-05-13 21:20:08 469

原创 Mysql的索引,慢查询和数据库表的设计以及乐观锁和悲观锁

如果查询数据较少,没有超过系统的变量sort_buffer_size时候,则直接在内存中进行排序,是快排,如果超过了变量大小,则会用文件进行排序,也就是归并排序,会导致特别慢,因为涉及到磁盘间文件交换。使用FileSort查询(order by)(排序字段没有加索引, 使用多字段排序,但是排序规则不同)数据表字段都是not null的,即使没有数据,最好也使用无意义的值填充,并在业务代码中特殊处理。不追求严格的数据精简(灵活调整),通过字段冗余来优化查询,减少表关联。触发索引覆盖,不需要回表,速度最优。

2025-05-12 21:06:00 630

原创 Spring的异步

Async需要和@EnableAsync一起使用才有效果。异步任务可以有返回值,也可以没有返回值。常见,常用的Spring内建事件。:事件,事件监听者,事件发布者。事件驱动和消息驱动的区别与联系。最好自定义线程池和异常处理器。

2025-05-12 21:03:34 147

原创 BeanPostProcessor和AOP

编程式事务两种实现:TransactionTemplate,PlatformTransactionManager。对Bean分析,处理,例如记录初始化时间,安全风险检查等。解析Bean的自定义注解,针对注解做一些前置处理。声明式事务:@Transaction;归类Bean,聚合处理过程。底层实现原理:动态代理。

2025-05-10 22:27:20 256

原创 IOC和Bean

这样一来,对象不再需要主动去查找或创建它们的依赖,而是由容器在创建对象时帮助它们完成依赖注入的过程。控制反转的概念主要是与传统的直接构造(即 new 操作)来控制对象依赖的方式相反。

2025-05-10 22:25:30 672

原创 DTO,VO,PO,Entity

DTO 是数据传输对象,用于在不同系统或层之间传输数据。

2025-04-29 22:15:19 747

原创 Mysql中索引的知识

核心概念:索引是什么?想象一下你有一本很厚的书,你想找到其中关于某个特定主题的内容。从头到尾翻阅整本书:这就像数据库中的全表扫描 (Full Table Scan)。如果书很长,这个过程会非常慢。查阅书末尾的索引:索引列出了书中的重要词汇或主题,并指明了它们出现在书的哪一页。你只需要快速查找索引(索引本身通常按字母排序),找到你想找的主题,然后直接翻到对应的页码。这就像数据库中的使用索引。在数据库中,索引也是一个类似的数据结构。

2025-04-29 22:13:48 935

原创 InnoDB对LRU算法的优化

大量的、一次性访问的 Page(如全表扫描带来的)只会被加载到 Old Generation 的头部,它们需要在 Old Generation 中“冷却”一段时间并再次被访问后才有机会晋升到 Young Generation。当执行一个大的全表扫描时,会读取并访问表中所有的 Page。它的时间还没有超过 innodb_old_blocks_time 设定的阈值(默认是 0 毫秒),那么它不会被移动到 Young Generation,仍然留在 Old Generation 的原位。

2025-04-28 21:06:37 967

原创 Redo log,Undo log和binlog

mysql的日志

2025-04-28 21:05:59 492

原创 大模型应用开发(PAFR)

针对特有业务场景对基础大模型做数据训练和微调,以满足特定场景的需求。:将应用端业务能力与AI大模型推理能力结合,简化复杂业务功能开发。:给大模型外挂一个知识库,让大模型基于知识库内容做推理和回答。将检索结果和用户问题填入Prompt模板。:利用大模型推理能力完成应用的核心功能。用最终获得的Prompt调用LLM。检索知识库中相关知识片段。

2025-04-25 21:10:02 276

原创 JUC学习(1) 线程和进程

一个进程往往可以包含多个线程,至少包含一个!:充分利用CPU的资源。

2025-04-17 22:01:05 336

原创 docker的基础知识

volumes:volumes:在这里定义了两个卷redis-data和redis-conf,这些卷将由 Docker 管理。它们的具体存储位置将由 Docker 决定,用户无需关心具体路径。这个 Docker Compose 文件定义了一个 Redis 服务,配置了环境变量、端口映射和数据持久化等设置,适合用于开发或测试环境。

2025-04-17 21:59:57 1280

原创 jwt的无感刷新

实现无感刷新主要依赖于设计一个刷新机制(通常是 Refresh Token 方案)或采用滑动过期策略,让服务端和客户端协同工作,在 token 过期前自动更新 token,确保用户体验的连续性。:这种方式要求在中间件层拦截每个请求,判断 token 的剩余有效期,并在接近过期时返回一个新的 token,让客户端自动替换旧的 token,从而延长在线状态。:在用户每次请求时检测 JWT 的剩余有效期,如果快要过期,则自动生成新的 JWT,并更新 Redis 中的对应记录。

2025-04-16 21:49:32 286

原创 wait()和sleep()

wait()用于线程间的协调,线程通过释放锁进入等待状态,直到其他线程调用notify()或唤醒它。sleep()用于让线程暂停执行一段时间,线程会在指定时间后自动恢复,不会释放锁。

2025-04-16 21:46:59 828

原创 QPS是什么??

QPS=总请求数总时间(秒)QPS = \frac{\text{总请求数}}{\text{总时间(秒)}}QPS=总时间(秒)总请求数。在缓存系统(如 Redis、Memcached)中,QPS表示每秒可以服务的查询数量,是评估缓存性能的核心指标。表示服务器每秒响应用户请求的次数,通常用于衡量网站或API的负载能力和响应性能。高QPS意味着服务器可以同时处理大量用户请求,是衡量高性能系统的重要参数。QPS表示数据库每秒能够处理的查询次数,反映数据库的查询处理能力。:系统在单位时间内能够处理的任务量。

2025-04-14 22:41:11 569

原创 Redis持久化策略

名称描述fork创建子进程以执行后台任务,如 RDB 快照或 AOF 重写。rewrite对 AOF 文件进行优化,通过重写压缩日志大小,提高存储和加载效率。后台异步重写 AOF 文件,通过 fork 子进程进行,减少主线程性能影响。bgsave后台生成 RDB 快照,通过 fork 子进程进行。

2025-04-14 22:40:07 648

原创 面向对象的要素

面向对象是一种更优秀的程序设计方法,它的基本思想是使用类、对象、继承、封装、消息等基本概念进行程序设计。

2025-04-09 20:19:00 943

原创 Java程序的基本规则

➢ 在通常情况下,Java程序源文件的主文件名可以是任意的。➢ 垃圾回收器的工作目标是回收无用对象的内存空间,这些内存空间都是JVM堆内存里的内存空间,垃圾回收器只能回收内存资。➢ 现在的JVM有多种不同的垃圾回收实现,每种回收机制因其算法差异可能表现各异,有的当垃圾回收开始时就停止应用程序。的,有可能是当CPU空闲时发生的,也有可能和原始的垃圾回收一样,等到内存消耗出现极限时发生,这和垃圾回收实现机制。的运行,有的当垃圾回收运行时允许应用程序的线程运行,还有的在同一时间允许垃圾回收多线程运行。

2025-04-09 20:15:47 392

原创 hash方法

【代码】hash方法。

2025-04-06 21:20:10 139

原创 多级缓存的实现

缓存、限流和熔断。而缓存是排在最前面也是高并发系统之所以高效运行的关键手段,那么问题来了:缓存只使用 Redis 就够了吗?缓存功能的设计也是一样,我们在高并发系统中通常会使用多级缓存来保证其高效运行,其中的多级缓存就包含以下这些:浏览器缓存:它的实现主要依靠 HTTP 协议中的缓存机制,当浏览器第一次请求一个资源时,服务器会将该资源的相关缓存规则(如 Cache-Control、Expires 等)一同返回给客户端,浏览器会根据这些规则来判断是否需要缓存该资源以及该资源的有效期。

2025-04-01 19:49:44 886

原创 原子性的概念

在数据库中,一个事务内的所有操作是原子的,要么全部成功(提交),要么全部不生效(回滚)。例如,银行的转账操作涉及两个账户的余额更新,只有在所有操作都成功的情况下,转账才会完成,否则应保持初始状态。(Atomicity)是指某些操作要么全部完成,要么全部不做,操作不可分割,没有中间状态。看似简单的操作,实际由“读取-修改-写入”三步组成,不是原子的,如果不加锁或使用原子操作,可能出现多个线程同时读取和修改数据导致错误。在多线程环境下,如果多个线程访问共享变量,原子性可以确保每个线程看到的数据是一致的。

2025-03-30 21:23:55 418

原创 cookie,session,token

Cookie:存储在客户端,适合非敏感小数据,用于会话跟踪。Session:存储在服务器,适合保存用户的敏感信息和身份状态,依赖服务器状态。JWT:无状态令牌,适合分布式应用的认证,令牌本身包含用户信息且签名确保不被篡改。

2025-03-30 21:22:29 1015

原创 自旋锁策略和看门狗策略

保障这个线程不会因为意外中断导致锁失效(避免缓存未更新时释放锁)。来减少对数据库的直接访问,避免瞬间大量请求直接打到数据库。:如果查询数据库时间较长,线程可能自旋过久,影响吞吐量。(默认每 10 秒续期一次),确保持锁线程不会意外失效。来维护锁(但 Redisson 性能较好,影响较小)。:线程会一直轮询缓存,可能造成 CPU 高负载。线程获取到缓存数据后退出自旋,返回数据。线程完成数据库查询后,更新缓存并释放锁。(不断轮询)直到缓存更新完成。负责查询数据库,并回填缓存。,其他线程不会重复查询数据库。

2025-03-26 21:56:58 554

原创 带你理清前后端重定向问题

重定向

2025-03-24 11:40:45 393

原创 transient,序列化的秘密

序列化的一个关键字

2025-03-23 21:46:22 225

原创 IO密集型和CPU密集型

IO密集型任务主要依赖于。

2025-03-23 21:02:05 677

原创 Stream流式计算

Stream是 Java 8 引入的一个新的抽象,它代表一个元素的序列,支持对集合的顺序或并行的复杂操作。Stream本身并不存储数据,它是数据源(如集合、数组等)的一种视图,并通过流水线操作来处理数据。

2025-03-23 15:46:39 640

原创 乐观锁的举例

乐观锁是一种用于多线程并发控制的机制,常用于避免数据的并发修改冲突。与悲观锁不同,乐观锁假设多个事务同时处理同一份数据时,冲突的概率较低,因此不在事务开始时加锁,而是通过一种校验机制确保数据一致性。如果版本号或时间戳发生了变化,说明数据已经被其他事务修改,本次操作会被中止或回滚,用户需要重新读取数据并重试。如果版本号或时间戳没有变化,说明数据未被其他事务修改,可以继续进行更新并将版本号或时间戳加1。:每当进行数据修改时,会检查数据的版本号或时间戳是否发生了变化。线程 B 尝试更新数据,但它读取到的。

2025-03-15 21:48:39 184

原创 TransactionTemplate

/ 事务提交(如果不抛异常)// 发生异常时,手动回滚事务。事务成功和失败有不同的处理逻辑。(比如与第三方库的数据库操作)(比如业务逻辑决定是否回滚)) 的一个包装类,允许你。并进行自定义异常处理。

2025-03-13 19:28:05 796

原创 TraceId和SpanID(分布式ID)

一次完整的请求链路,从请求发起到请求结束,整个过程的所有请求都会有相同的。用户请求 → API 网关 → 订单服务 → 支付服务 → 库存服务。,比如执行了哪些操作、耗时多少、是否出错等。traceId 可能包含多个 spanId。一起使用,帮助开发者快速定位系统问题。,包括它经过的所有微服务和调用。,方便后续分析整个请求链路。代表整个请求的全局 ID。里的核心概念,主要用于。下的某个具体的请求片段。这些所有的调用,都会。继续上面的例子,一个。,代表整个请求链路。,用于记录调用关系。

2025-03-03 11:39:49 643

原创 密码加盐的概念及使用

这样即使黑客拿到 A 网站的密码哈希值,也无法直接在 B 网站使用。黑客可以在彩虹表里找到相同的哈希值,就能反查出你的密码。,因为每个用户的盐都是随机生成的,黑客无法批量破解。(Rainbow Table)是一个。,黑客可以用它来反查明文密码。,然后再进行哈希(Hash)处理。:如果盐是固定的,黑客还是能破解。是黑客利用在某个平台泄露的。去尝试登录其他平台。A 网站被黑客攻破,密码泄露。,黑客无法直接反查密码!

2025-03-02 20:59:19 1001

原创 SpringBoot项目启动时碰到数据库死锁问题

是 Liquibase 正在等待获取数据库的锁,这意味着在执行数据库迁移时,Liquibase 检测到数据库的。上面这个是我已经修改完成的,只要将LOCKED字段由true改为false即可。今天在启动SpringBoot项目时,碰到了这样一行提示。

2025-02-28 16:51:21 403

原创 缓存击穿问题

Redis是基于内存的,性能极高,官方给的指标是每秒可达到10W的吞吐量。:虽然我设置了过期时间,但是会出现一种情况:当业务执行之后,锁还被持有着,这是比较消耗Redis缓存资源,正确的做法应该是当业务执行完之后,立即释放锁。:过长的话,可能在我们加锁成功后,还没有执行到释放锁,在这一段过程中节点宕机了,那么在锁未过期的这段时间,其他线程是不能获取锁的,这样也不好。:如果某个数据项不存在于缓存中(例如数据库中没有),但是多个请求几乎同时访问此数据项,数据库的查询压力会瞬间增大,造成性能瓶颈。

2025-02-26 16:47:10 915

原创 mysql和Redis缓存一致性方案

mysql和redis缓存一致性的六种方案

2025-02-12 18:20:42 547

原创 @Resource和@Autowired注解

Resouce是JavaEE的一个包下的,可以跨框架使用。而@Autowired是来源于Spring框架中的,脱离Spring时候不可用。

2024-12-12 15:52:00 364

原创 力扣199

【代码】力扣199。

2024-11-25 16:42:43 385 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除