SpringBoot18-集成Redis
一、SpringBoot集成Redis1-1、先理解什么是 RedisRedis 就是一个超快的数据库但它专门存数据在内存里不是硬盘。你可以把它想象成一个超级快的“笔记本”用来暂时记一些数据。比如登录状态、验证码、排行榜、购物车、点赞数……为什么用 Redis因为它速度非常快比 MySQL 快几十~上百倍可以自动过期适合存验证码、token可以解决并发问题比如抢票、库存扣减1-2、第一步安装 Redis1如果你用Windows下载 Redis for Windows无需安装https://github.com/tporadowski/redis/releases打开redis-server.exe就启动了。2如果是Macbrew install redis brew services start redis启动成功后Redis 会在6379端口上运行。3验证是否安装了redis1-3、第二步在 Spring Boot 项目中加依赖在pom.xml加dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency就这样Redis 支持就进项目了。1-4、第三步配置连接 Redis在application.yml里写spring: data: redis: host: 127.0.0.1 # 本机 port: 6379 # 默认端口如果你 Redis 设置了密码这里再加password: xxx1-5、第四步写一个最简单的 Redis 代码存 取1、写一个 Service 类Service public class RedisTestService { Autowired private StringRedisTemplate stringRedisTemplate; // 专门操作字符串 // 存数据 public void saveData() { stringRedisTemplate.opsForValue().set(name, Tom); } // 取数据 public String getData() { return stringRedisTemplate.opsForValue().get(name); } }Maven中添加了redis的依赖之后StringRedisTemplate就能直接注入使用了2、写个 Controller 调用它RestController public class TestController { Autowired private RedisTestService redisTestService; GetMapping(/save) public String save() { redisTestService.saveData(); return 保存成功; } GetMapping(/get) public String get() { return redisTestService.getData(); } }3、运行测试浏览器访问① 保存数据http://localhost:8080/save② 获取数据http://localhost:8080/get你将看到返回Tom你已经成功用 Spring Boot 操作 Redis 了4、或者直接写一个redis的测试类1-6、小结二、令牌主动失效目标登录成功 → 把发给浏览器的令牌token同时存进 Redis每次请求在拦截器里比对“浏览器带来的令牌 Redis里为该用户保存的令牌”用户改密成功 → 主动删除 Redis 里的旧令牌使其立刻失效。2-1、Redis 存储设计双向映射便于比对和失效auth:user:{userId} - {token}用户当前有效 token便于改密时一把踢下线auth:token:{token} - {userId}用 token 找到用户拦截器校验时用两个 key 都设置相同TTL比如 2 小时再次登录会覆盖旧 token。2-2、登录生成并落库含顶替旧令牌Service RequiredArgsConstructor public class AuthService { private final StringRedisTemplate redis; // 令牌有效期 private static final long TOKEN_TTL_MINUTES 120; public String login(Long userId, String rawPassword) { // 1. 这里省略账号密码校验查库比对哈希 // if (!passOK) throw new BizException(...); // 2. 生成新 token String token UUID.randomUUID().toString(); // 3. 顶替旧 token如果有就删 String oldToken redis.opsForValue().get(auth:user: userId); if (oldToken ! null) { redis.delete(auth:token: oldToken); } // 4. 双向写入 过期时间 redis.opsForValue().set(auth:user: userId, token, TOKEN_TTL_MINUTES, TimeUnit.MINUTES); redis.opsForValue().set(auth:token: token, String.valueOf(userId), TOKEN_TTL_MINUTES, TimeUnit.MINUTES); // 5. 返回给前端 return token; } // 退出登录前端丢弃 服务端删除 public void logout(String token) { if (token null) return; String userId redis.opsForValue().get(auth:token: token); if (userId ! null) { redis.delete(auth:token: token); redis.delete(auth:user: userId); } } // 改密后让旧令牌立即失效主动删除 public void invalidateUserTokenOnPasswordChange(Long userId) { String oldToken redis.opsForValue().get(auth:user: userId); if (oldToken ! null) { redis.delete(auth:user: userId); redis.delete(auth:token: oldToken); } } }示例 Controller返回 token 给前端退出改密后失效RestController RequiredArgsConstructor public class AuthController { private final AuthService authService; PostMapping(/login) public String login(RequestParam Long userId, RequestParam String password) { return authService.login(userId, password); } PostMapping(/logout) public void logout(RequestHeader(Authorization) String token) { authService.logout(token); } // 改密成功后调用旧 token 立刻失效 PostMapping(/password/change) public String changePwd(RequestParam Long userId, RequestParam String oldPwd, RequestParam String newPwd) { // 1) 校验旧密码并更新为新密码略 // 2) 主动失效旧令牌 authService.invalidateUserTokenOnPasswordChange(userId); // 3) 可选直接让用户重新登录或这里返回新 token return OK; } }2-3、拦截器校验比对“请求令牌 Redis 存的令牌”Component RequiredArgsConstructor public class LoginInterceptor implements HandlerInterceptor { private final StringRedisTemplate redis; Override public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception { String token req.getHeader(Authorization); if (token null || token.isEmpty()) { resp.setStatus(401); return false; } // 1) 通过 token 找 userId无则说明 token 无效或过期 String userId redis.opsForValue().get(auth:token: token); if (userId null) { resp.setStatus(401); return false; } // 2) 再用 userId 取当前有效 token必须“完全相等”才算有效 String currentToken redis.opsForValue().get(auth:user: userId); if (!token.equals(currentToken)) { // 出现这种情况用户在别处重新登录/改了密码/已被踢下线 resp.setStatus(401); return false; } // 校验通过 return true; } }注册拦截器Configuration RequiredArgsConstructor public class WebConfig implements WebMvcConfigurer { private final LoginInterceptor loginInterceptor; Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor) .addPathPatterns(/**) .excludePathPatterns(/login); // 登录接口放行 } }2-4、前端怎么带令牌登录后保存服务端返回的token之后每个请求都在请求头带上Authorization: token名字可自定义统一即可2-5、可选增强自动续期活跃会话不掉线在拦截器校验通过后给两个 key 续命重置 TTL// 校验通过后 redis.expire(auth:token: token, 120, TimeUnit.MINUTES); redis.expire(auth:user: userId, 120, TimeUnit.MINUTES);单设备登录上面的“顶替旧令牌”已经实现了单设备登录——新登录会让旧 token 失效。多端共存把auth:user:{userId}改成 Set允许保存多个 tokenPC/手机各一个改密时删除该用户所有 token。

相关新闻

《手把手教你写一个生产级 K8s Operator:CRD + Controller + Webhook 全链路实践》

《手把手教你写一个生产级 K8s Operator:CRD + Controller + Webhook 全链路实践》

K8s Operator 控制器 进行深度全链路实践,增加以下生产级特性:并发协调控制(MaxConcurrentReconciles)事件记录(Event Recorder)最终一致性保证(Requeue 策略优化)子资源冲突处理&am…

2026/7/23 19:39:11 阅读更多 →
软路由玩家必看:在PVE7.3上实现iKuai+OpenWRT双路由+NAS+Win10的5个性能优化技巧

软路由玩家必看:在PVE7.3上实现iKuai+OpenWRT双路由+NAS+Win10的5个性能优化技巧

软路由性能调优实战:从J4125到PVE,榨干每一分硬件潜力的进阶指南 如果你已经成功在J4125小主机上部署了PVE,并搭建了iKuai主路由、OpenWRT旁路由、NAS乃至Windows 10的All-in-One系统,那么恭喜你,已经迈入了高阶玩家的行列。但搭建成功只是第一步,真正的挑战在于如何让这…

2026/7/23 19:39:11 阅读更多 →
厨卫翻新不搬家如何选择:牛牛快装等服务适用场景

厨卫翻新不搬家如何选择:牛牛快装等服务适用场景

厨卫翻新不搬家:如何理性选择“快与净”的局部改造服务在老旧小区的居住体验中,厨卫空间往往是痛点最集中的区域。水管老化、瓷砖空鼓、防水失效等问题直接影响日常生活品质。然而,传统装修伴随的噪音污染、粉尘飞扬以及漫长的工期&#xff0…

2026/7/23 19:39:11 阅读更多 →

最新新闻

1.2 amdgpu_bo的设计分析 — gem层和ttm层

1.2 amdgpu_bo的设计分析 — gem层和ttm层

接下来的两篇我们对AMD KFD中使用的 BO 涉及的概念和结构体作了一个整体的分析,内容较多,偏理论一些,可以和后面的文章反复对照。如果你对drm系统还不熟悉,那先理解drm框架,可以参见:linux DRM 子系统专栏介绍。不管有没有基础,该文都是一个参考性的文档,不必都理解。 …

2026/7/23 19:49:18 阅读更多 →
文献综述写不下去?通义千问智能降维技巧来了,1小时生成逻辑闭环框架,导师当场点赞

文献综述写不下去?通义千问智能降维技巧来了,1小时生成逻辑闭环框架,导师当场点赞

更多请点击: https://intelliparadigm.com 第一章:通义千问赋能文献综述的底层逻辑 文献综述是学术研究的基石,传统流程依赖人工检索、筛选、比对与归纳,耗时长且易受认知偏差影响。通义千问通过大语言模型的语义理解、跨文档推理…

2026/7/23 19:49:18 阅读更多 →
【UE4】Generate Visual Studio Project Files sln生成失败 Failed to generate project files

【UE4】Generate Visual Studio Project Files sln生成失败 Failed to generate project files

在安装了UE5后,右键 *.uproject Generate Visual Studio Project Files 后报错如下这是由于UE5的 UnrealBuildTool.exe 的路径和UE4不同导致的 解决方法 方式一:将UE5的 UnrealBuildTool.exe 改名,并双击UE4的 UnrealBuildTool.exe 重新Regis…

2026/7/23 19:49:18 阅读更多 →
37岁运维转网络安全:不是冲动,是被现实逼出来的选择

37岁运维转网络安全:不是冲动,是被现实逼出来的选择

37岁运维转网络安全:不是冲动,是被现实逼出来的选择 37岁,做了多年运维。 以前总觉得运维挺稳定:服务器、系统、网络、故障处理,哪里出问题就去哪里救火。 但这两年明显感觉不一样了。 岗位在压缩,自动…

2026/7/23 19:49:18 阅读更多 →
ICM创芯微 CM1003-BKS SOT23-6 BMS电池保护芯片

ICM创芯微 CM1003-BKS SOT23-6 BMS电池保护芯片

特性 高精度电压检测功能 过充电保护电压 3.500V ~ 4.600V,精度 25mV 过充电解除电压 3.100V ~ 4.600V,精度 45mV 过放电保护电压 2.000V ~ 3.400V,精度 50mV 过放电解除电压 2.000V ~ 3.400V,精度 100mV 放电过流保护电压 0.015V…

2026/7/23 19:48:18 阅读更多 →
软路由玩家必备:ImmortalWrt与OpenWrt功能对比及编译优化指南(2024新版)

软路由玩家必备:ImmortalWrt与OpenWrt功能对比及编译优化指南(2024新版)

软路由玩家进阶指南:ImmortalWrt与OpenWrt深度对比与编译实战(2024版) 在追求网络性能极致的玩家圈子里,软路由早已从单纯的网络设备进化为可高度定制的计算平台。当标准路由器固件无法满足需求时,基于Linux的开源解决方案成为技术爱好者的首选。ImmortalWrt和OpenWrt作为…

2026/7/23 19:48:18 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻