短链接跳转功能(缓存击穿)功能描述实现短链接跳转功能,通过短链接映射到原始链接并完成页面重定向,同时处理缓存与并发问题,避免缓存击穿。
功能流程
获取完整短链接 URL:
从请求中获取 shortUri 和服务器域名,拼接成完整的短链接 URL,例如:serverName/shortUri。
查询缓存:
从 Redis 缓存中获取短链接对应的原始链接。
如果缓存中存在,则直接重定向到原始链接。
处理缓存击穿:
如果缓存中不存在,通过 Redisson 分布式锁控制并发查询,避免缓存击穿。
加锁后再检查缓存,防止重复查询。
查询数据库:
如果缓存仍不存在,从数据库查询短链接对应的原始链接。
查询逻辑:
检查短链接是否存在,且状态有效(未删除且启用)。
如果短链接存在,将原始链接存入缓存,并重定向。
处理不存在的短链接:
如果数据库中也不存在对应的短链接,可以根据业务需求进行封控或提示。
释放锁:
最终释放分布式锁,确保并发情况下锁资源正常回收。
核心代码逻辑1. 获取完整短链接12String serverName = request.get ...
短链接跳转(缓存穿透)功能概述短链接跳转功能通过优化缓存策略,结合布隆过滤器、空值缓存和分布式锁,有效解决 缓存穿透 和 缓存击穿 问题。在高并发场景下确保系统的稳定性和性能。
功能流程
生成完整短链接 URL
根据请求的 shortUri 和 serverName 拼接生成完整短链接 URL(fullShortUrl)。
查询缓存
在 Redis 缓存中检查短链接是否存在。
若存在,直接返回原始链接进行重定向。
布隆过滤器校验
通过布隆过滤器快速判断短链接是否有效。
若不存在,直接返回无效状态,避免访问数据库。
查询空值缓存
检查 Redis 是否已缓存空值(标记无效短链接)。
若已缓存空值,直接返回无效状态,避免重复查询。
处理缓存击穿
若缓存和布隆过滤器均未命中,使用分布式锁(如 Redisson)防止并发查询。
获取锁后,再次检查缓存是否已更新。
查询数据库
在数据库中查询完整短链接的原始链接,并验证其状态(如未删除、已启用)。
若查询成功,将结果写入缓存并返回。
若查询失败,缓存空值,减少无效查询。
释放锁
无论查询成功或失败,均释放分 ...
短链接分页查询根据 分组标识 (gid) 和分页参数,查询符合条件的短链接列表。
功能说明:该方法实现了通过分页查询短链接,查询条件包括 分组标识 和 启用状态 以及 删除标记,并按照创建时间降序排序。返回的结果是经过分页后的短链接数据,并且在最终结果中,使用 BeanUtil.toBean 将 ShortLinkDO 转换为 ShortLinkPageRespDTO。
具体实现:
查询条件设置:
gid (分组标识):用于筛选属于特定分组的短链接,ShortLinkDO::getGid 与请求参数中的 requestParam.getGid() 进行匹配。
启用状态 (enableStatus):只有启用状态为 0(假设代表有效状态)的短链接才会被查询出来。
删除标记 (delFlag):只有删除标记为 0(表示未删除)的短链接才会被查询出来。
排序:
通过 orderByDesc(ShortLinkDO::getCreateTime) 对结果按创建时间降序排列,确保最新的短链接排在前面。
分页查询:
使用 baseMapper.selectPage(requestParam ...
新增短链接代码中的主要组件包括数据库操作、短链接生成、布隆过滤器等。
服务实现类 LinkServiceImpl
继承和实现:LinkServiceImpl 类继承了 MyBatis-Plus 的 ServiceImpl,实现了 ShortLinkService 接口。通过这种方式,LinkServiceImpl 类可以享受 MyBatis-Plus 提供的 CRUD 操作,同时可以扩展自定义的业务逻辑。
构造器注入:使用了 @RequiredArgsConstructor 注解,自动生成一个构造器来注入所有的 final 字段(依赖注入),这减少了显式的构造方法编写。
短链接创建方法:create1234567891011121314151617181920212223242526272829303132333435@Overridepublic ShortLinkCreateRespDTO create(ShortLinkCreateReqDTO requestParam) { // 生成短链接后缀 String shortLinkSuffix = gene ...
概览
基于SpringBoot框架的程序开发步骤
使用SpringBoot配置信息修改服务器配置
基于SpringBoot的完成SSM整合项目开发
一、SpringBoot简介1. 入门案例问题导入
SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程
原生开发SpringMVC程序过程
1.1 入门案例开发步骤①:创建新模块,选择Spring初始化,并配置模块相关基础信息
②:选择当前模块需要使用的技术集
③:开发控制器类
123456789@RestController@RequestMapping("/books")public class BookController { @GetMapping("/{id}") public String getById(@PathVariable Integer id) { System.out.println("id ==> " ...
条件注解(Conditional Annotations)条件注解(Conditional Annotations)是 Spring Framework 中的一种机制,允许根据特定的条件动态地加载 Bean 或配置。通过使用条件注解,开发者可以灵活地控制某些组件是否被加载到 Spring 容器中。
常见的条件注解1. @Conditional@Conditional 是一个通用的条件注解,可以结合自定义的 Condition 实现类来定义复杂的条件逻辑。
使用方法:123456789@Configurationpublic class MyConfig { @Bean @Conditional(MyCondition.class) public MyService myService() { return new MyService(); }}
自定义条件类:123456789101112import org.springframework.context.annotation.Condition;imp ...
SpringMVC
SpringMVC相关概念
SpringMVC的入门案例
使用PostMan工具发送请求和数据
SpringMVC如何接收请求、数据和响应结果
RESTful风格及其使用
基于RESTful的案例编写
1,SpringMVC简介看到SpringMVC这个名字我们会发现其中包含Spring,那么SpringMVC和Spring之间的会有关系么?答案是肯定有,SpringMVC隶属于Spring,是Spring技术中的一部分。那么SpringMVC到底是用来做什么的呢?
回想web阶段,我们学习过Servlet,而SpringMVC与Servlet技术功能等同,均属于web层或者说表现层开发技术。
那么既然已经有了Servlet为什么还需要花时间再学习一个SpringMVC技术?要回答这个问题,我们就需要搞清楚SpringMVC与Servlet相比,有什么优势:
框架我们都知道是用来简化开发的,所以SpringMVC与Servlet相比,开发起来更简单快捷,用更少的代码完成表现层代码的开发,那么问题又来了,到底有多简单呢?我们通过一个例子来体验一把吧。
将资料 ...
概览
注解开发定义Bean对象
纯注解开发模式
配置注解开发依赖注入
配置注解开发管理第三方Bean
配置注解开发为第三方Bean注入资源
使用Spring整合Mybatis
使用Spring整合Junit
一、第三方资源配置管理
说明:以管理DataSource连接池对象为例讲解第三方资源配置管理
1 管理DataSource连接池对象问题导入配置数据库连接参数时,注入驱动类名是用driverClassName还是driver?
1.1 管理Druid连接池【重点】数据库准备
123456789create database if not exists spring_db character set utf8;use spring_db;create table if not exists tbl_account( id int primary key auto_increment, name varchar(20), money double);insert into tbl_account values(null,'Tom',1000); ...
概览
Spring的体系结构
IOC与DI
配置setter方式注入属性值
配置构造方式注入属性值
自动装配
一、Spring简介1 Spring课程介绍问题导入我们为什么要学习Spring框架?
1.1 为什么要学
Spring技术是JavaEE开发必备技能,企业开发技术选型命中率>==90%==
专业角度
==简化开发==,降低企业级开发的复杂性
==框架整合==,高效整合其他技术,提高企业级应用开发与运行效率
1.2 学什么
简化开发
==IOC(反转控制)==
==AOP(面向切面编程)==
==事务处理==
框架整合
MyBatis
MyBatis-plus
Struts
Struts2
Hibernate
……
1.3 怎么学
学习Spring框架设计思想
学习基础操作,思考操作与思想间的联系
学习案 ...
VUE1.1 概述==免除原生JavaScript中的DOM操作,数据绑定,简化书写。==
1.2 简单实现Vue 使用起来是比较简单的,总共分为如下三步:
新建 HTML 页面,引入 Vue.js文件
1<script src="js/vue.js"></script>
在JS代码区域,创建Vue核心对象,进行数据绑定
12345678new Vue({ el: "#app", data() { return { username: "" } }});
创建 Vue 对象时,需要传递一个 js 对象,而该对象中需要如下属性:
el : 用来指定哪儿些标签受 Vue 管理。 该属性取值 #app 中的 app 需要是受管理的标签的id属性值
data :用来定义数据模型
methods :用来定义函数。这个我们在后面就会用到
...