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

发布时间:2026/7/23 23:03:57
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; } }