本文目录导读:

在Java中操作Redis数据,最常用的客户端库是 Jedis(同步)和 Lettuce(支持响应式,Spring Boot默认),下面通过一个完整案例演示如何使用 Jedis 来操作Redis。
环境准备
1 添加 Maven 依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.0.2</version>
</dependency>
2 启动 Redis 服务
确保本地Redis已启动(默认端口6379,无密码)。
基础操作案例
1 连接Redis并操作String类型
import redis.clients.jedis.Jedis;
public class RedisStringExample {
public static void main(String[] args) {
// 1. 连接Redis
Jedis jedis = new Jedis("localhost", 6379);
System.out.println("连接成功");
// 2. 操作String类型
jedis.set("name", "张三");
String name = jedis.get("name");
System.out.println("获取name: " + name); // 输出:张三
// 3. 设置过期时间(5秒后自动删除)
jedis.setex("code", 5, "123456");
System.out.println("code: " + jedis.get("code")); // 5秒内可获取
// 4. 自增操作(常用于计数器)
jedis.incr("counter");
jedis.incrBy("counter", 5);
System.out.println("counter: " + jedis.get("counter")); // 输出:6
// 5. 关闭连接
jedis.close();
}
}
2 操作Hash类型(适合存储对象)
Jedis jedis = new Jedis("localhost", 6379);
// 存储用户信息(Hash)
jedis.hset("user:1001", "name", "李四");
jedis.hset("user:1001", "age", "25");
jedis.hset("user:1001", "city", "北京");
// 获取单个字段
String userName = jedis.hget("user:1001", "name");
System.out.println("用户名: " + userName);
// 获取所有字段
Map<String, String> userMap = jedis.hgetAll("user:1001");
userMap.forEach((key, value) ->
System.out.println(key + " -> " + value));
jedis.close();
3 操作List类型(消息队列/排行榜)
Jedis jedis = new Jedis("localhost", 6379);
// 从右侧插入(类似队列)
jedis.rpush("messages", "msg1", "msg2", "msg3");
// 从左侧弹出(FIFO)
String msg = jedis.lpop("messages");
System.out.println("弹出消息: " + msg); // msg1
// 获取列表所有元素
List<String> allMsg = jedis.lrange("messages", 0, -1);
System.out.println("剩余消息: " + allMsg); // [msg2, msg3]
jedis.close();
4 操作Set类型(去重、交集等)
Jedis jedis = new Jedis("localhost", 6379);
// 添加元素
jedis.sadd("hobby:zhangsan", "篮球", "足球", "编程");
jedis.sadd("hobby:lisi", "篮球", "游泳", "编程");
// 获取张三的兴趣
Set<String> hobbies = jedis.smembers("hobby:zhangsan");
System.out.println("张三的兴趣: " + hobbies);
// 获取共同兴趣(交集)
Set<String> intersect = jedis.sinter("hobby:zhangsan", "hobby:lisi");
System.out.println("共同兴趣: " + intersect); // [篮球, 编程]
jedis.close();
5 操作ZSet类型(带权重的有序集合)
Jedis jedis = new Jedis("localhost", 6379);
// 添加学生成绩(分数作为权重)
jedis.zadd("scores", 95.0, "张三");
jedis.zadd("scores", 88.5, "李四");
jedis.zadd("scores", 72.0, "王五");
// 按分数从高到低获取前两名
Set<String> top2 = jedis.zrevrange("scores", 0, 1);
System.out.println("前两名: " + top2); // [张三, 李四]
// 获取李四的排名(从0开始,0为最高分)
Long rank = jedis.zrevrank("scores", "李四");
System.out.println("李四排名: " + (rank + 1)); // 第2名
jedis.close();
使用连接池提高性能
实际生产环境不要每次新建连接,应使用连接池:
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisPoolExample {
private static JedisPool pool;
static {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50); // 最大连接数
config.setMaxIdle(10); // 最大空闲连接
config.setMinIdle(5); // 最小空闲连接
config.setTestOnBorrow(true); // 获取连接时测试有效性
pool = new JedisPool(config, "localhost", 6379);
}
public static void main(String[] args) {
try (Jedis jedis = pool.getResource()) {
jedis.set("pool_test", "连接池示例");
System.out.println(jedis.get("pool_test"));
} // 自动归还连接到池中
// 应用关闭时销毁连接池
pool.close();
}
}
常见Redis数据结构与Java操作总结
| Redis类型 | 常用操作 | Java对应方法 | 典型场景 |
|---|---|---|---|
| String | set/get | set(), get(), incr() |
缓存、计数器 |
| Hash | hset/hget | hset(), hgetAll() |
存储对象字段 |
| List | lpush/rpop | lpush(), rpop(), lrange() |
消息队列、任务队列 |
| Set | sadd/smembers | sadd(), smembers(), sinter() |
标签系统、去重 |
| ZSet | zadd/zrange | zadd(), zrevrange(), zrevrank() |
排行榜、优先级队列 |
使用 Spring Boot 集成(推荐方式)
实际项目推荐使用 Spring Data Redis(基于 Lettuce):
application.yml 配置:
spring:
data:
redis:
host: localhost
port: 6379
操作代码(使用RedisTemplate):
@Service
public class RedisService {
@Autowired
private StringRedisTemplate redisTemplate; // 默认处理字符串
public void setValue(String key, String value) {
redisTemplate.opsForValue().set(key, value, 10, TimeUnit.MINUTES);
}
public String getValue(String key) {
return redisTemplate.opsForValue().get(key);
}
public void addToSet(String key, String... values) {
redisTemplate.opsForSet().add(key, values);
}
}
常见问题
- 连接超时:检查Redis是否启动,防火墙是否开放6379端口
- 密码认证:如Redis有密码,在
jedis.auth("password")或在连接池配置密码 - 序列化问题:使用Spring RedisTemplate时注意对象序列化,推荐使用JSON序列化
这个案例覆盖了Redis最常用的5种数据类型的Java操作,可以直接复制代码运行测试。