一.Redis的Java客户端
Redis的Java客户端常用的有Jedis,Lettuce,Spring Data Redis,其中Spring Data Redis对Redis底层开发包进行了高度封装,在Spring项目中,
可以使用Spring Data Reids来简化操作。
二.Spring Data Redis使用方式
1.导入Spring Data Redis的maven坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置Redis数据源
redis:
host: ${sky.redis.host}
port: ${sky.redis.port}
password: ${sky.redis.password}
database: ${sky.redis.database}
redis:
host: localhost
port: 6739
password:
database: 0
database如果胜率默认为0号数据库
配置文件不建议写死,方便后期更新和维护
3.编写配置类,创建Redis Template对象
配置类
package com.sky.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
@Slf4j
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
log.info("开始创建RedisTemplate对象...");
RedisTemplate redisTemplate = new RedisTemplate();
//设置redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis key的序列化容器
redisTemplate.setKeySerializer(new StringRedisSerializer());
//设置redis value的序列化容器
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
如果不设置序列化器会出现乱码问题,但是不影响数据的使用
4.通过RedisTemplate对象操作Redis
1.操作字符串类型数据
| 用途 | 核心语法 | 说明 |
|---|---|---|
| 设置值 | redisTemplate.opsForValue().set("键", "值"); |
如:set ("name", "张三") |
| 设置值 + 过期时间 | redisTemplate.opsForValue().set("键", "值", 5, TimeUnit.MINUTES); |
5 分钟过期,TimeUnit 可选 SECONDS/HOURS 等 |
| 获取值 | redisTemplate.opsForValue().get("键"); |
返回 Object 类型,可强转成 String |
| 删除值 | redisTemplate.delete("键"); |
通用删除语法,所有类型都能用 |
2.操作哈希类型数据
| 用途 | 核心语法 | 说明 |
|---|---|---|
| 设置单个字段 | redisTemplate.opsForHash().put("哈希键", "字段名", "值"); |
如:put ("user:1", "name", "李四") |
| 批量设置字段 | redisTemplate.opsForHash().putAll("哈希键", map); |
map 是 HashMap,key = 字段名,value = 值 |
| 获取单个字段 | redisTemplate.opsForHash().get("哈希键", "字段名"); |
如:get ("user:1", "name") 返回 "李四" |
| 获取所有字段 + 值 | redisTemplate.opsForHash().entries("哈希键"); |
返回 Map<Object, Object>,包含所有字段 |
| 删除指定字段 | redisTemplate.opsForHash().delete("哈希键", "字段1", "字段2"); |
可删多个字段,返回删除数量 |
| 判断字段是否存在 | redisTemplate.opsForHash().hasKey("哈希键", "字段名"); |
返回 true/false |
3.操作List类型数据
| 用途 | 核心语法 | |
|---|---|---|
| 右侧加元素 | redisTemplate.opsForList().rightPush("listKey", "值"); |
|
| 左侧加元素 | redisTemplate.opsForList().leftPush("listKey", "值"); |
|
| 左侧弹出元素 | redisTemplate.opsForList().leftPop("listKey"); |
|
| 获取指定范围元素 | redisTemplate.opsForList().range("listKey", 0, -1); |
0=-1 表示获取所有元素 |
4.操作set类型的数据
| 用途 | 核心语法 |
|---|---|
| 添加元素 | redisTemplate.opsForSet().add("setKey", "值1", "值2"); |
| 获取所有元素 | redisTemplate.opsForSet().members("setKey"); |
| 判断元素是否存在 | redisTemplate.opsForSet().isMember("setKey", "值"); |
| 取两个集合交集 | redisTemplate.opsForSet().intersect("set1", "set2"); |
5.操作zset类型的数据
| 用途 | 核心语法 | |
|---|---|---|
| 添加元素(带分数) | redisTemplate.opsForZSet().add("zsetKey", "值", 90.0); |
分数 90.0,用于排序 |
| 按分数降序取前 3 名 | redisTemplate.opsForZSet().reverseRange("zsetKey", 0, 2); |
|
| 给元素加分数 | redisTemplate.opsForZSet().incrementScore("zsetKey", "值", 5.0); |
分数 + 5 |
6.通用操作
| 用途 | 核心语法 | 说明 / 示例 |
|---|---|---|
| 判断键是否存在 | redisTemplate.hasKey("键名"); |
返回 boolean,如 hasKey("name") → true/false |
| 删除键(任意类型) | redisTemplate.delete("键名"); |
删除单个键,返回 boolean(是否删除成功) |
| 批量删除键 | redisTemplate.delete(Collections.singletonList("键1", "键2")); |
传入集合批量删,返回删除成功的数量(Long 类型) |
| 设置键的过期时间 | redisTemplate.expire("键名", 60, TimeUnit.SECONDS); |
给已存在的键设置过期时间(60 秒),TimeUnit 可选 SECONDS/MINUTES/HOURS 等 |
| 设置键的过期时间(指定时间点) | redisTemplate.expireAt("键名", new Date(System.currentTimeMillis() + 60000)); |
到指定时间戳(60 秒后)过期 |
| 移除键的过期时间(永久有效) | redisTemplate.persist("键名"); |
取消过期时间,键变为永久存储 |
| 获取键的剩余过期时间 | redisTemplate.getExpire("键名"); |
返回剩余秒数(Long),-1 = 永久有效,-2 = 键不存在 |
| 获取键的剩余过期时间(指定单位) | redisTemplate.getExpire("键名", TimeUnit.MINUTES); |
按指定单位返回剩余时间,如 TimeUnit.MINUTES → 剩余分钟数 |
| 重命名键 | redisTemplate.rename("旧键名", "新键名"); |
旧键必须存在,否则报错 |
| 安全重命名键(旧键存在才改名) | redisTemplate.renameIfAbsent("旧键名", "新键名"); |
新键若已存在则改名失败,返回 false |
| 获取键的数据类型 | redisTemplate.type("键名"); |
返回枚举类型(如 StringType/HASH/LIST),表示键对应的 Redis 数据类型 |
| 模糊匹配键 | redisTemplate.keys("通配符"); |
如 keys("user:*") → 匹配所有以 user: 开头的键,返回 Set<String> |