Redis全套实战手册:命令、环境搭建、工具类 + Token / 缓存双案例
目录一、常用 Redis 命令二、服务器上 Redis 问题排查三、Redis 环境搭建与连接1.1 引入依赖pom.xml1.2 配置数据源application.yml / application-dev.yml 四、Redis 工具类通用版实战模板4.1用户登录 Token存用户信息4.2 缓存查询先查Redis没有再查MySQLRedis基础核心知识速忆一、常用 Redis 命令Redis Hash 存储我们把每一行数据存成一个 Hashkey 哪一行field 列名。场景Redis 命令说明存一个字符串SET key valueSET verify_code:3364 999取一个字符串GET keyGET verify_code:1存一个对象HashHSET key field valueHSET user:1 username 张三取一个对象HashHGET key fieldHGET user:1 username取整个对象HashHGETALL keyHGETALL user:1设置过期时间秒EXPIRE key 秒数EXPIRE verify_code:3364 3005分钟过期存同时设置过期时间SETEX key 秒数 valueSETEX verify_code:3364721800 300 123456删除 keyDEL keyDEL verify_code:1380013800二、服务器上 Redis 问题排查场景命令说明进入Redis客户端redis-cli输完按回车验证密码如果设了AUTH 你的密码进入后先输这个查看所有keyKEYS *看有哪些key生产环境慎用查看某个key的值GET key名字看具体内容查看key剩余过期时间TTL key名字-1永不过期-2已过期查看Redis内存情况INFO memory看用了多少内存查看Redis实时命令MONITOR实时看所有操作排错用三、Redis 环境搭建与连接1.1 引入依赖pom.xml!-- Spring Boot 操作 Redis 的核心包 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency !-- 连接池大多数项目都会用到 -- dependency groupIdorg.apache.commons/groupId artifactIdcommons-pool2/artifactId /dependency1.2 配置数据源application.yml / application-dev.yml sky: redis: host: 127.0.0.1 # 服务器地址本地就写 localhost port: 6379 # 默认端口 password: # 如果设了密码就填没有就空着 database: 0 # 默认库0-15一般用0spring: redis: host: ${sky.redis.host} port: ${sky.redis.port} password: ${sky.redis.password} database: ${sky.redis.database} lettuce: pool: max-active: 8 # 最大连接数 max-idle: 8 # 最大空闲连接 min-idle: 0 # 最小空闲连接四、Redis 工具类通用版可直接粘贴到项目里以后所有地方都用它。public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ // 1. 新建原生RedisTemplate对象 RedisTemplate redisTemplate new RedisTemplate(); // 2. 设置Redis连接工厂绑定 Redis 连接否则会报空指针无法连接Redis数据库 redisTemplate.setConnectionFactory(redisConnectionFactory); // 3. 修改key value的序列化规则使用字符串序列化器 redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new StringRedisSerializer()); // 4. 返回自定义好的RedisTemplate交给Spring管理 return redisTemplate; } /** SpringBoot 自带的RedisTemplate默认会把key转成二进制乱码存入 Redis 在 Redis 客户端工具里看全是看不懂的字符。 自定义 RedisTemplate把 key 改成普通字符串序列化 存进 Redis 的 key 能正常看懂方便调试。 **/package com.niunai.demo.utils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; /** * Redis 工具类通用版 * 用法在 Service 里 Autowired 注入然后直接调用方法 */ Component public class RedisUtil { Autowired private RedisTemplateString, Object redisTemplate; // 1. 通用操作 /** * 判断 key 是否存在 */ public boolean hasKey(String key) { return Boolean.TRUE.equals(redisTemplate.hasKey(key)); } /** * 设置过期时间单位秒 */ public boolean expire(String key, long seconds) { return Boolean.TRUE.equals(redisTemplate.expire(key, seconds, TimeUnit.SECONDS)); } /** * 获取 key 的剩余过期时间单位秒-1永不过期-2已过期 */ public long getExpire(String key) { Long expire redisTemplate.getExpire(key, TimeUnit.SECONDS); return expire ! null ? expire : -2L; } /** * 删除 key可以传多个 */ public void delete(String... keys) { if (keys ! null keys.length 0) { if (keys.length 1) { redisTemplate.delete(keys[0]); } else { for (String key : keys) { redisTemplate.delete(key); } } } } // 2. String字符串操作 // 场景存验证码、Token、单个缓存 /** * 存字符串无过期时间 */ public void set(String key, Object value) { redisTemplate.opsForValue().set(key, value); } /** * 存字符串 过期时间单位秒 */ public void set(String key, Object value, long seconds) { redisTemplate.opsForValue().set(key, value, seconds, TimeUnit.SECONDS); } /** * 取字符串 */ public Object get(String key) { return redisTemplate.opsForValue().get(key); } /** * 取字符串如果存的是String直接强转 */ public String getString(String key) { Object value redisTemplate.opsForValue().get(key); return value ! null ? value.toString() : null; } // 3. Hash哈希操作 // 场景存用户信息、购物车一个key下面有多个字段 /** * 存 Hash 的一个字段 */ public void hset(String key, String field, Object value) { redisTemplate.opsForHash().put(key, field, value); } /** * 存 Hash 的多个字段传Map */ public void hsetAll(String key, MapString, Object map) { redisTemplate.opsForHash().putAll(key, map); } /** * 取 Hash 的一个字段 */ public Object hget(String key, String field) { return redisTemplate.opsForHash().get(key, field); } /** * 取 Hash 的所有字段和值 */ public MapObject, Object hgetAll(String key) { return redisTemplate.opsForHash().entries(key); } /** * 删除 Hash 的一个或多个字段 */ public void hdel(String key, String... fields) { redisTemplate.opsForHash().delete(key, (Object[]) fields); } /** * 判断 Hash 中是否存在某个字段 */ public boolean hHasKey(String key, String field) { return redisTemplate.opsForHash().hasKey(key, field); } // 4. Set集合操作 // 场景签到、抽奖、共同好友 /** * 往 Set 里添加元素 */ public void sadd(String key, Object... values) { redisTemplate.opsForSet().add(key, values); } /** * 获取 Set 的所有元素 */ public SetObject smembers(String key) { return redisTemplate.opsForSet().members(key); } /** * 判断 Set 里是否包含某个元素 */ public boolean sIsMember(String key, Object value) { return Boolean.TRUE.equals(redisTemplate.opsForSet().isMember(key, value)); } /** * 移除 Set 中的某个元素 */ public void srem(String key, Object... values) { redisTemplate.opsForSet().remove(key, values); } /** * 获取 Set 的大小 */ public long sSize(String key) { Long size redisTemplate.opsForSet().size(key); return size ! null ? size : 0L; } }实战模板4.1用户登录 Token存用户信息Service public class UserService { Autowired private RedisUtil redisUtil; // 用户登录成功存Token public void login(Long userId, String token) { String key user:token: token; redisUtil.set(key, userId, 7200); // 2小时过期 } // 校验 Token 是否有效 public Long checkToken(String token) { String key user:token: token; Object userId redisUtil.get(key); return userId ! null ? Long.valueOf(userId.toString()) : null; } // 用户登出清除Token public void logout(String token) { String key user:token: token; redisUtil.delete(key); } }4.2 缓存查询先查Redis没有再查MySQLService public class ProductService { Autowired private RedisUtil redisUtil; Autowired private ProductMapper productMapper; public Product getById(Long id) { String key product:cache: id; // 1. 先查 Redis Object cached redisUtil.get(key); if (cached ! null) { return (Product) cached; // 命中缓存直接返回 } // 2. Redis没有查 MySQL Product product productMapper.selectById(id); if (product ! null) { redisUtil.set(key, product, 3600); // 放入缓存1小时过期 } return product; } }

相关新闻

各省铁路里程、公路里程、交通网密度(2000-2024年)

各省铁路里程、公路里程、交通网密度(2000-2024年)

数据简介:公路里程是指一定时期内实际达到《公路工程技术标准》规定的等级公路,并经公路主管部门正式验收交付使用的公路里程数。交通网密度是指某一区域内交通线路的密集程度,通常用单位面积内所拥有的交通线路长度来表示。 数据来源&#…

2026/7/23 23:03:55阅读更多 →
20K芯片在天然产物靶点筛选中的应用价值

20K芯片在天然产物靶点筛选中的应用价值

天然产物因具有复杂的化学结构和多样化的生物学功能,在现代药物研究中受到持续关注。许多天然来源活性分子已经被发现具有明显的调节作用,但从活性表现进一步深入到分子机制解析,仍需要明确其直接作用靶点。因此,建立科学有效的天…

2026/7/23 23:03:55阅读更多 →
慈溪暮色相守:岁月漫长,总有人记得你的小心愿

慈溪暮色相守:岁月漫长,总有人记得你的小心愿

慈溪的傍晚,晚风裹挟着家家户户飘出的饭菜香气,街道上往来的,都是结束一天忙碌匆匆归家的普通人。陈峰和晚晴相伴快十五年,没有跌宕起伏的浪漫桥段,生活就在柴米油盐、互相扶持之中缓缓流淌。 年轻的时候两人一同在外打…

2026/7/23 23:03:55阅读更多 →
stm32注册机

stm32注册机

通过网盘分享的文件:最新注册机.zip 链接: https://pan.baidu.com/s/170xlivOIIGGoDiXMkGVWbQ 提取码: h1wv

2026/7/24 0:34:11阅读更多 →
计算机专业全解析:从入门到精通

计算机专业全解析:从入门到精通

高考告终, 志愿填报之时迫在眉睫。每一年, 皆有数以万计的学子怀抱着对于未来的憧憬, 而论以计算机专业当作其一志愿。然而, 这个被称作有着“薪酬丰、供职优”之称的专业, 到底研究些什么? 困难程度几许? 怎么样方可掌握得好? 今日, 我们就要深切地剖析计算机专业的研习全貌…

2026/7/24 0:34:11阅读更多 →
新人写小说用哪个软件?10款 AI 写小说工具深度实测【含避坑建议】

新人写小说用哪个软件?10款 AI 写小说工具深度实测【含避坑建议】

写网文这几年,我试过不少 AI 写小说软件。 有的生成出来像机翻,有的完全没有网文爽点,还有些软件看着功能很多,真到码字的时候根本帮不上忙。尤其是新手,最怕的不是不会写,而是把时间耗在一堆不合适的写小…

2026/7/24 0:34:11阅读更多 →
STELLA自进化LLM在生物医学研究的应用与实现

STELLA自进化LLM在生物医学研究的应用与实现

1. 项目背景与核心价值STELLA项目代表了当前生物医学研究与人工智能交叉领域的前沿探索。这个自进化的大型语言模型(LLM)智能体系统,正在改变传统生物医学研究的范式。作为一名长期关注AI在生命科学领域应用的从业者,我见证了这类系统从概念验证到实际落…

2026/7/24 0:32:11阅读更多 →
信息系统管理工程师-信息技术发展之计算机硬件与网络全解析

信息系统管理工程师-信息技术发展之计算机硬件与网络全解析

一、引言信息技术发展是软考中级信息系统管理工程师考试的基础模块,在上午客观题中占比约 15%-20%,其中计算机硬件、计算机软件、计算机网络是核心考查内容。本模块知识起源于 1946 年第一台通用计算机 ENIAC 的诞生,历经 70 余年演进&#x…

2026/7/24 0:32:11阅读更多 →
视频理解——从3D Conv到Tube Transformer,算力黑洞的探索史

视频理解——从3D Conv到Tube Transformer,算力黑洞的探索史

为啥说"大的"?因为视频数据太特么大了。一张 224x224 的图算起来轻松,一段 10 秒的 1080p 视频每秒 30 帧,那就是 300 张图,像素量是单张图的 300 倍。处理视频,本质上是在处理一个三维信号——高度、宽度、…

2026/7/24 0:32:11阅读更多 →
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阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述: 解法: 1、模拟(参考自【LeetCode 54】螺旋矩阵-CSDN博客) int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会,昔日AI六小龙来了五家,分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了,唯一缺席的竟是近几个月来风光无限的智谱。(DeepSeek一直不参加)WAI…

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

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

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

2026/7/23 22:58:43阅读更多 →
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阅读更多 →