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 命令 | 说明 |
存一个字符串 |
|
|
取一个字符串 |
|
|
存一个对象(Hash) |
|
|
取一个对象(Hash) |
|
|
取整个对象(Hash) |
|
|
设置过期时间(秒) |
|
|
存同时设置过期时间 |
|
|
删除 key |
|
|
二、服务器上 Redis 问题排查
场景 | 命令 | 说明 |
进入Redis客户端 |
| 输完按回车 |
验证密码(如果设了) |
| 进入后先输这个 |
查看所有key |
| 看有哪些key(生产环境慎用) |
查看某个key的值 |
| 看具体内容 |
查看key剩余过期时间 |
| -1=永不过期,-2=已过期 |
查看Redis内存情况 |
| 看用了多少内存 |
查看Redis实时命令 |
| 实时看所有操作(排错用) |
三、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; } }