Redis Java 客户端
对比项 Jedis Spring Data Redis
层级 底层客户端驱动 Spring 高层封装框架
API 风格 原生 API,jedis.set()、get(),命令和 redis 命令几乎一一对应 RedisTemplate,序列化封装,opsForValue/opsForHash 等
连接模型 阻塞 IO,需要手动维护连接池(JedisPool) 底层驱动决定;用 Jedis 则使用 JedisPool;Lettuce 是 Netty 非阻塞,单连接多线程安全
线程安全 Jedis 实例非线程安全,不能多线程共用同一个 Jedis 对象,必须从池里拿连接 RedisTemplate 是线程安全,可以单例注入使用
序列化 需要自己手动序列化 / 反序列化(对象转字符串) 自带序列化器(JdkSerializationRedisSerializer,坑很多,项目一般改成 Jackson2JsonRedisSerializer)
使用场景 原生开发,精细控制底层 Redis 命令 SpringBoot 项目,快速集成 Redis,主流企业方案

Redis Java 客户端

一、Redis Java 客户端概述

Redis 的 Java 客户端有多种实现,常用的主流方案分为两类:

  • Jedis:Redis 官方推出的 Java 客户端,提供与原生 Redis 命令一一对应的 API。
  • Spring Data Redis:Spring 生态的组成部分,对 Redis 底层客户端进行高度封装,在 Spring 项目中可大幅简化 Redis 开发。

二、Jedis 客户端

Jedis 是 Redis 官方提供的原生 Java 客户端,直接封装 Redis 命令,使用方式与命令行操作高度一致。

1. Maven 依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

2. 基础使用示例

写入数据

@Test
public void testSet() {
    // 1. 连接 Redis
    Jedis jedis = new Jedis("127.0.0.1", 6379);
    // 2. 操作 Redis
    jedis.set("name", "张三");
    // 3. 关闭连接
    jedis.close();
}

读取数据

@Test
public void testGet() {
    // 1. 连接 Redis
    Jedis jedis = new Jedis("127.0.0.1", 6379);
    // 2. 操作 Redis
    String name = jedis.get("name");
    System.out.println(name);
    // 3. 关闭连接
    jedis.close();
}

三、Spring Data Redis

Spring Data Redis 是 Spring 生态的组成部分,在 Spring Boot 项目中通过简单配置即可访问 Redis,对底层 Jedis 客户端做了高度封装。核心类为 RedisTemplate,提供了统一的操作 API、异常处理、序列化机制以及发布订阅等能力。

核心封装特性

  1. 自动管理连接池,提供高度封装的 RedisTemplate 工具类
  2. 按数据类型对 API 进行归类封装,对应不同的操作接口:
  • ValueOperations:字符串(简单 Key-Value)操作
  • HashOperations:哈希(Map 类型)数据操作
  • ListOperations:列表类型数据操作
  • SetOperations:集合类型数据操作
  • ZSetOperations:有序集合类型数据操作

1. Maven 依赖

Spring Boot 项目直接引入启动器:

<!-- Spring Data Redis 启动器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2. 配置文件(application.yml)

spring:
  data:
    redis:
      host: 127.0.0.1
      port: 6379
      database: 0

3. ValueOperations:字符串(Key-Value)操作

@SpringBootTest
public class TestValueOperations {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 写入数据
     */
    @Test
    public void setValue() {
        redisTemplate.opsForValue().set("name", "gao1");
    }

    /**
     * 读取数据
     */
    @Test
    public void getValue() {
        String name = (String) redisTemplate.opsForValue().get("name");
        System.out.println(name);
    }

    /**
     * 删除数据
     */
    @Test
    public void deleteValue() {
        redisTemplate.delete("name");
    }
}

4. ListOperations:列表类型操作

@SpringBootTest
public class TestListOperations {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 右压栈:后添加的元素排在列表尾部
     */
    @Test
    public void testRightPush() {
        redisTemplate.opsForList().rightPush("nameList1", "刘备");
        redisTemplate.opsForList().rightPush("nameList1", "关羽");
        redisTemplate.opsForList().rightPush("nameList1", "张飞");
    }

    /**
     * 获取右压栈列表全部元素
     */
    @Test
    public void testGetRightList() {
        // 0 表示第一个元素,-1 表示最后一个元素
        List list = redisTemplate.opsForList().range("nameList1", 0, -1);
        System.out.println(list);
    }

    /**
     * 左压栈:后添加的元素排在列表头部
     */
    @Test
    public void testLeftPush() {
        redisTemplate.opsForList().leftPush("nameList2", "刘备");
        redisTemplate.opsForList().leftPush("nameList2", "关羽");
        redisTemplate.opsForList().leftPush("nameList2", "张飞");
    }

    /**
     * 获取左压栈列表全部元素
     */
    @Test
    public void testGetLeftList() {
        List list = redisTemplate.opsForList().range("nameList2", 0, -1);
        System.out.println(list);
    }

    /**
     * 根据索引查询元素
     */
    @Test
    public void testSearchByIndex() {
        String s = (String) redisTemplate.opsForList().index("nameList1", 1);
        System.out.println(s);
    }

    /**
     * 移除列表中指定元素
     */
    @Test
    public void testRemoveByValue() {
        redisTemplate.opsForList().remove("nameList1", 1, "关羽");
    }
}

5. HashOperations:哈希(Map)类型操作

@SpringBootTest
public class TestHashOperations {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 写入哈希字段
     */
    @Test
    public void testSetValue() {
        redisTemplate.opsForHash().put("nameHash", "a", "唐僧");
        redisTemplate.opsForHash().put("nameHash", "b", "悟空");
        redisTemplate.opsForHash().put("nameHash", "c", "八戒");
        redisTemplate.opsForHash().put("nameHash", "d", "沙僧");
    }

    /**
     * 获取所有字段名
     */
    @Test
    public void testGetKeys() {
        Set keys = redisTemplate.opsForHash().keys("nameHash");
        System.out.println(keys);
    }

    /**
     * 获取所有字段值
     */
    @Test
    public void testGetValues() {
        List values = redisTemplate.opsForHash().values("nameHash");
        System.out.println(values);
    }

    /**
     * 根据字段名获取值
     */
    @Test
    public void testGetValueByKey() {
        Object object = redisTemplate.opsForHash().get("nameHash", "b");
        System.out.println(object);
    }

    /**
     * 删除指定字段
     */
    @Test
    public void testRemoveByKey() {
        redisTemplate.opsForHash().delete("nameHash", "c");
    }
}

6. SetOperations:集合类型操作

@SpringBootTest
public class TestSetOperations {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 向集合添加元素
     */
    @Test
    public void setValue() {
        redisTemplate.opsForSet().add("nameSet", "操作");
        redisTemplate.opsForSet().add("nameSet", "刘备");
        redisTemplate.opsForSet().add("nameSet", "孙权");
    }

    /**
     * 获取集合所有元素
     */
    @Test
    public void getValue() {
        Set members = redisTemplate.opsForSet().members("nameSet");
        System.out.println(members);
    }

    /**
     * 删除集合中指定元素
     */
    @Test
    public void deleteValue() {
        redisTemplate.opsForSet().remove("nameSet", "孙权");
    }

    /**
     * 删除整个集合
     */
    @Test
    public void deleteAllValue() {
        redisTemplate.delete("nameSet");
    }
}
上一篇
下一篇