Redis全套实战手册:命令、环境搭建、工具类 + Token / 缓存双案例

📅 2026/7/23 23:24:03 👁️ 阅读次数 📝 编程学习
Redis全套实战手册:命令、环境搭建、工具类 + Token / 缓存双案例

目录

一、常用 Redis 命令

二、服务器上 Redis 问题排查

三、Redis 环境搭建与连接

1.1 引入依赖(pom.xml)

1.2 配置数据源(application.yml / application-dev.yml )

四、Redis 工具类(通用版)

实战模板

4.1用户登录 Token(存用户信息)

4.2 缓存查询(先查Redis,没有再查MySQL)


Redis基础核心知识速忆

一、常用 Redis 命令

🔑Redis Hash 存储:我们把每一行数据存成一个 Hash,key= 哪一行,field= 列名。

场景

Redis 命令

说明

存一个字符串

SET key value

SET verify_code:3364 999

取一个字符串

GET key

GET verify_code:1

存一个对象(Hash)

HSET key field value

HSET user:1 username 张三

取一个对象(Hash)

HGET key field

HGET user:1 username

取整个对象(Hash)

HGETALL key

HGETALL user:1

设置过期时间(秒)

EXPIRE key 秒数

EXPIRE verify_code:3364 300(5分钟过期)

存同时设置过期时间

SETEX key 秒数 value

SETEX verify_code:3364721800 300 123456

删除 key

DEL key

DEL verify_code:1380013800


二、服务器上 Redis 问题排查

场景

命令

说明

进入Redis客户端

redis-cli

输完按回车

验证密码(如果设了)

AUTH 你的密码

进入后先输这个

查看所有key

KEYS *

看有哪些key(生产环境慎用)

查看某个key的值

GET key名字

看具体内容

查看key剩余过期时间

TTL key名字

-1=永不过期,-2=已过期

查看Redis内存情况

INFO memory

看用了多少内存

查看Redis实时命令

MONITOR

实时看所有操作(排错用)

三、Redis 环境搭建与连接

1.1 引入依赖(pom.xml)

<!-- Spring Boot 操作 Redis 的核心包 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 连接池(大多数项目都会用到) --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency>

1.2 配置数据源(application.yml / application-dev.yml )

sky: redis: host: 127.0.0.1 # 服务器地址(本地就写 localhost) port: 6379 # 默认端口 password: # 如果设了密码就填,没有就空着 database: 0 # 默认库(0-15,一般用0)
spring: 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 RedisTemplate<String, 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, Map<String, Object> map) { redisTemplate.opsForHash().putAll(key, map); } /** * 取 Hash 的一个字段 */ public Object hget(String key, String field) { return redisTemplate.opsForHash().get(key, field); } /** * 取 Hash 的所有字段和值 */ public Map<Object, 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 Set<Object> 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,没有再查MySQL)

@Service 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; } }