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:16阅读更多 →
软路由玩家必看:在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:16阅读更多 →
厨卫翻新不搬家如何选择:牛牛快装等服务适用场景

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

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

2026/7/23 19:39:16阅读更多 →
销售沟通技巧实战指南:如何用AI录音转文字工具让每次对话都成为成交利器

销售沟通技巧实战指南:如何用AI录音转文字工具让每次对话都成为成交利器

一、销售沟通中的三大隐形痛点,你中了几条?做销售的朋友应该都有过这样的经历:刚结束一场长达两小时的客户拜访,感觉聊得热火朝天,但回到办公室打开笔记本,却发现能记下来的有效信息寥寥无几。客户提过的预…

2026/7/23 20:51:23阅读更多 →
Django毕业设计-基于 Django 的高校学生综合素质考评管理系统 大学生德智体综测评分信息化管理系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)

Django毕业设计-基于 Django 的高校学生综合素质考评管理系统 大学生德智体综测评分信息化管理系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/23 20:51:23阅读更多 →
指纹浏览器生态闭环:如何设计灵活的插件系统让第三方扩展浏览器功能?

指纹浏览器生态闭环:如何设计灵活的插件系统让第三方扩展浏览器功能?

更多内容请见: 《指纹浏览器开发实战》 - 专栏介绍和目录 文章目录 第一章:认知破局——为什么原生 Chrome 扩展与暴力注入是死路一条? 1. Manifest V3 的枷锁与裁剪架构的冲突 2. 暴力注入的灾难:全局污染与 `isTrusted` 穿帮 3. 内存泄漏与生命周期失控 第二章:溯源解剖…

2026/7/23 20:51:23阅读更多 →
传统 RPA 技术瓶颈深度解析:基于大模型 Agent 的替代路径与落地实践——企业智能自动化范式迁移指南

传统 RPA 技术瓶颈深度解析:基于大模型 Agent 的替代路径与落地实践——企业智能自动化范式迁移指南

在数字化转型步入深水区的 2026 年,企业对于自动化的诉求已从简单的“降本”转向复杂的“增效与创新”。曾经作为效率利器的传统 RPA(机器人流程自动化),在面对现代企业动态的应用环境、非结构化数据洪流以及长链路决策场景时&…

2026/7/23 20:51:23阅读更多 →
KeyStone I处理器电源完整性设计:滤波与去耦电容实战指南

KeyStone I处理器电源完整性设计:滤波与去耦电容实战指南

1. 项目概述与核心挑战在折腾高性能多核处理器,比如德州仪器的KeyStone I系列时,最让人头疼的往往不是复杂的算法编程,而是最基础的供电问题。你可能有过这样的经历:板子焊好了,程序烧进去了,但系统就是不稳…

2026/7/23 20:51:23阅读更多 →
油田通信维护进入集成时代|鼎讯 RM-1000 与一线运维模式探索

油田通信维护进入集成时代|鼎讯 RM-1000 与一线运维模式探索

在石油行业,通信维护是一项 “看不见” 的工作,却直接影响着生产的 “看得见” 的效率。 从钻井平台到输油管道,从炼化基地到储油库区,每一个环节的通信设备都需要定期检测和维护。过去,这项工作依赖多个独立仪器配合完…

2026/7/23 20:49:22阅读更多 →
Go语言静态资源打包方案对比与实践指南

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

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

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

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

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

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

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

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

2026/7/23 0:56:31阅读更多 →
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:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

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

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

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →