Java案例怎么操作Redis数据?

wen java案例 7

本文目录导读:

Java案例怎么操作Redis数据?

  1. 环境准备
  2. 基础操作案例
  3. 使用连接池提高性能
  4. 常见Redis数据结构与Java操作总结
  5. 使用 Spring Boot 集成(推荐方式)
  6. 常见问题

在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操作,可以直接复制代码运行测试。

抱歉,评论功能暂时关闭!