自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 学习笔记之注册用户如何防止缓存穿透

缓存穿透是指在使用缓存系统时,恶意或频繁地请求一个不存在于缓存中的数据,导致每次请求都需要查询数据库或其他数据存储系统,从而绕过了缓存的效果,严重影响系统性能。这种情况通常发生在恶意攻击、大量请求缓存中不存在的数据或缓存数据过期后的高并发访问。频繁的查询数据库或其他数据存储系统,增加了数据库负载,降低了系统的吞吐量。大量的缓存不存在的数据请求可能会导致缓存服务器的内存被耗尽,影响其他正常的缓存操作。用户体验下降,因为请求的数据无法从缓存中获取,导致响应时间延长。

2025-03-14 17:24:38 1030

原创 学习笔记之实现用户购票责任链验证

在责任链模式中,多个处理器依次处理同一个请求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再传递给 C 处理器,以此类推,形成一个链条,链条上的每个处理器各自承担各自的处理职责。@Override。

2025-03-14 14:58:14 238

原创 学习笔记之车票搜索为什么用Redis而不是ES?

12306列车数据搜索具有多个搜索条件,包括单程/往返、出发地、目的地、出发日期/返程日期、乘客类型、车次类型、出发车站、到达车站、车次席别、发车时间、显示积分兑换车次以及显示全部可预订车次等。这些条件使搜索功能变得复杂,但在实际使用中,大部分条件是前端筛选,而不是每个条件都会发起后端请求。实时性: Redis 以内存为基础,具有极低的读取延迟,可以快速响应实时查询请求,这对于需要即时更新的列车数据非常重要。单程或往返、出发日期等条件可以通过快速的 Redis 查询来满足。

2025-03-14 14:38:27 1270

原创 学习笔记之如何发起一笔支付

跳过 Debug 模式后,查看数据库支付表和订单表的记录状态,都会进行相应变更,也意味着一笔订单购票全流程顺利结束。当用户支付完一笔订单,支付宝付款渠道接收到支付结果后,对请求支付的系统进行支付结果回调。试想下,如果我们提供本地地址,支付宝肯定是访问不到的。注意,这个内网穿透地址并不是固定,当你电脑锁屏再打开后它自己也是会变,或者你退出再启动也会变。当用户抢到票后,开始发起订单支付请求,假设选择支付宝作为支付方式,支付流程如下。当返回支付成功结果后,咱们支付服务回调接口也会接到对应的支付宝回调请求。

2025-03-14 14:04:49 303

原创 SpringBoot Starter——从零到一实现封装Starter

SpringBoot Starter 类似于一种插件机制,抛弃了之前繁琐的配置,将复杂依赖统一集成进 Starter。所有依赖模块都遵循着约定成俗的默认配置,并允许我们调整这些配置,即遵循“约定大于配置”的理念官方对 Starter 包定义的 ArtifactId 是有要求的,当然也可以不遵守(毕竟你的项目你做主)。

2025-03-12 18:16:36 919

原创 一文掌握Redisson分布式锁原理

在说 Redisson 之前我们先来说一下 JDK 可重入锁: ReentrantLock。ReentrantLock 保证了 JVM 共享资源同一时刻只允许单个线程进行操作。ReentrantLock 内部公平锁与非公平锁继承了 AQS[AbstractQueuedSynchronizer]。实现思路:可以直接查看 Github Redisson 官网 介绍,没有了解过的小伙伴,看一下 Redisson 的 WIKI 目录,仔细瞅瞅 Redis 是如何被 Redisson 武装到牙齿的。这里先过一下和文章

2025-03-11 19:26:42 1095

原创 查询千万数据避免内存溢出

由于现在 ORM 框架的成熟运用,很多小伙伴对于 JDBC 的概念有些薄弱,(JavaDataBase Connectivity)是 Java 数据库连接, 说的直白点就是使用, 并提供相对应的连接数据库协议标准, 然后。

2025-03-11 17:55:16 583

原创 缓存与数据库一致性如何解决?

如果是扣减库存的方案,比如说你将列车余票扣减为 16,但是同时又有一个请求将列车余票扣减为 15,这个时候,扣减为 15 的这个请求先到消息队列执行,将缓存更新为余票 15,但是随之而来的是第一个请求余票为 16,会将缓存余票为 15 给覆盖掉。同上所诉,参考对应的业务场景和多请求并发场景,不同的是前者先更新缓存,后者先更新的是数据库,相同的是都存在并发问题,导致结果与预期并不相符。如果说上图的读请求回写缓存在写请求第二次删除缓存之前,那这种技术方案是比较好的,而且也不用引入过多复杂的中间件。

2025-03-10 17:30:06 706

原创 参考Dubbo线程池模型实现快速消费线程池

如何解决 JDK 线程池中不超过最大线程数下即时快速消费任务,而不是在队列中堆积。

2025-03-07 16:49:59 915

原创 一文读懂策略模式

总的来说,策略模式是一种非常有用的设计模式,它可以帮助我们在运行时动态地选择不同的算法实现,从而提高代码的灵活性、可维护性和可扩展性。通过将算法实现封装在不同的策略类中,并定义一个策略接口来描述算法,策略模式使得客户端可以独立于算法实现进行编程,同时也可以方便地更换算法实现或者添加新的算法实现。策略模式的优点包括提高代码的灵活性、可维护性、可扩展性和复用性,同时也可以避免使用大量的条件语句和提高代码的可读性。

2025-03-07 16:23:40 852

原创 如何创建SpringBoot多模块

如果将 SpringBoot 框架用作与单体项目,可能不存在多模块的情况。但是并不代表没有,因为父子模块并不局限于微服务,,随着架构师对于项目结构的不同理解,可能会衍生出不同的模块。比较经典的就是 Dubbo 将接口 API 进行抽离提供生产者接口,打为 Jar 包供消费端调用。本篇文章也会从零到一创建 SpringBoot 父子模块的项目,McaBook Pro / Linux / Win (本文采用Mac进行演示)

2025-03-07 15:34:44 1384

原创 从零到一学习中间件之Sharding-JDBC(三)——动手实现

5.x.x 版本后,ShardingSphere-JDBC 的配置文件配置方式有了大的变化,从之前和 Spring 耦合变更为完全解耦,大家需要明确。创建用户接口,为了避免重复代码,这里直接继承 MyBatisPlus 的 IService 通用接口,实现增删改查。通过新增用户方法调用得知,返回数据为成功。并在返回信息中,添加了用户 ID,可以根据该 ID 去查询数据库记录。拿到刚才的方法返回 ID,根据 ID 查询这条数据的信息。,创建后,执行以下数据库表创建语句。,调用定义的新增数据和查询数据方法。

2025-03-06 14:51:59 319

原创 从零到一学习中间件之Sharding-JDBC(二)

​db0db1​提供接口让应用开发者自行实现与业务实现紧密相关的分片算法,并允许使用者自行管理真实表的物理分布。自定义分片算法又分为:标准分片算法:用于处理使用单一键作为分片键的IN>=<=进行分片的场景。复合分片算法:用于处理使用多键作为分片键进行分片的场景,包含多个分片键的逻辑较复杂,需要应用开发者自行处理其中的复杂度。Hint 分片算法:用于处理使用Hint行分片的场景。

2025-03-06 14:30:38 755

原创 从零到一学习中间件之Sharding-JDBC(一)

​分库分表是一种数据库分片技术,用于解决大规模应用中单一数据库容量不足以支持高并发和大数据量的问题。它将一个大型的数据库拆分成多个小型数据库,每个小型数据库称为一个分片。每个分片存储部分数据,从而降低了单个数据库的负担。简单来说,分库是将原本的单库拆分为多个库,分表是将原来的单表拆分为多个表。很多情况下,分库分表并不是从系统设计开始就存在的,而是系统运行过程中,出现数据量庞大或者查询性能慢等问题延伸而来。

2025-03-06 14:12:38 785

原创 一文读懂责任链模式

举个例子,SpringMvc 中可以定义拦截器,并且可以定义多个。当一个用户发起请求时,顺利的话请求会经过所有拦截器,最终到达业务代码逻辑,SpringMvc 拦截器设计就是使用了责任链模式。在责任链模式中,多个处理器(参照上述拦截器)依次处理同一个请求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再传递给 C 处理器,以此类推,形成一个链条,链条上的每个处理器这里通过代码的形式对两种处理方式作出解答,方便读者更好的理解。

2025-03-06 11:46:24 1207

原创 如何生成分布式雪花算法ID

Snowflake 中文的意思是雪花,所以常被称为雪花算法,是 Twitter 开源的分布式 ID 生成算法。Twitter 雪花算法生成后是一个 64bit 的 long 型的数值,组成部分引入了时间戳,基本保持了自增。高性能高可用:生成时不依赖于数据库,完全在内存中生成。高吞吐:每秒钟能生成数百万的自增 ID。ID 自增:存入数据库中,索引效率高。SnowFlake 算法的缺点:依赖与系统时间的一致性,如果系统时间被回调,或者改变,可能会造成 ID 冲突或者重复。

2025-03-04 19:20:29 1150

原创 RocketMQ-中间件学习(三)—— 动手尝试

本项目来自Gitee,。环境:JDK17及以上, docker。

2025-03-04 17:10:14 565

原创 RocketMQ-中间件学习(二)—— 基础概念

Master 与 Slave 的对应关系通过指定相同的 BrokerName,不同的 BrokerId 来定义,BrokerId 为 0 表示 Master,非 0 表示 Slave。Broker 是向每一台 NameServer 注册自己的路由信息,所以每一个 NameServer 实例上面都保存一份完整的路由信息。Producer 通过 MQ 的负载均衡模块选择相应的 Broker 集群队列进行消息投递,投递的过程支持快速失败和重试。Broker主要负责消息的存储、投递和查询以及服务高可用保证。

2025-03-04 14:31:07 807

原创 RocketMQ-中间件学习(一)

用户只需在注册页面等待注册数据写入注册系统和 RocketMQ 的时间,即等待55ms即可登录。

2025-03-04 14:21:43 220

原创 Ubuntu22.04下JDK安装与多版本JDK切换

【代码】Ubuntu22.04下JDK安装与多版本JDK切换。

2025-02-24 11:59:25 156

原创 LeetCode[08] 字符串转换成整数

请你来实现一个) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。返回整数作为最终结果。注意:本题中的空白字符只包括空格字符 ’ ’。除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

2022-11-21 17:20:05 99 1

转载 LeetCode[239]滑动窗口最大值问题——单调队列解法

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值。

2022-11-17 21:07:02 141

空空如也

空空如也

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

TA关注的人

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