首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Redis学习路|第三篇】Redis的Java客户端

【Redis学习路|第三篇】Redis的Java客户端

作者头像
超级苦力怕
发布2025-12-23 17:55:27
发布2025-12-23 17:55:27
2610
举报

本章内容介绍了Redis的Java客户端,并简单介绍了客户端的选择与Jedis客户端,以及详细分析了解了SpringDataRedis客户端及内部StringRedisTemplate的使用。

请添加图片描述
请添加图片描述


1.Redis的Java客户端

目前主流的Redis的Java客户端有三种,分别为JedisLettuceRedisson

JedisLettuce:这两个主要是提供了Redis命令对应的API,方便我们操作Redis,而SpringDataRedis又对这两种做了抽象和封装,因此我们后期会直接以SpringDataRedis来学习。

Redisson:是在Redis基础上实现了分布式的可伸缩的java数据结构,例如Map、Queue等,而且支持跨进程的同步机制:Lock、Semaphore等待,比较适合用来实现特殊的功能需求。

在这里插入图片描述
在这里插入图片描述
2.Jedis客户端(可跳)

考虑到有企业使用Jedis,固简单记载Jedis笔记。官方网址:Jedis官网

(1) 快速入门

(1) 引入依赖

代码语言:javascript
复制
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>6.0.0</version>
</dependency>

(2) 创建Jedis对象,建立连接

代码语言:javascript
复制
private Jedis jedis;

@BeforeEach
void setUp() {
    // 1.建立连接
    jedis = new Jedis("192.168.150.101", 6379); 
    jedis = JedisConnectionFactory.getJedis();
    // 2.设置密码
    jedis.auth("123321");
    // 3.选择库
    jedis.select(0);
}

(3) 使用Jedis,方法名与Redis命令一致

代码语言:javascript
复制
@Test
void testString() {
    // 存入数据
    String result = jedis.set("name", "虎哥");
    System.out.println("result = " + result);
    // 获取数据
    String name = jedis.get("name");
    System.out.println("name = " + name);
}

@Test
void testHash() {
    // 插入hash数据
    jedis.hset("user:1", "name", "Jack");
    jedis.hset("user:1", "age", "21");

    // 获取
    Map<String, String> map = jedis.hgetAll("user:1");
    System.out.println(map);
}

(4) 释放资源

代码语言:javascript
复制
@AfterEach
void tearDown() {
    if (jedis != null) {
        jedis.close();
    }
}
(2) Jedis连接池

Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此推荐使用Jedis连接池代替Jedis的直连方式。

使用方式: 新建一个com.blog.util,用于存放我们编写的工具类,

代码语言:javascript
复制
public class JedisConnectionFactory {
    private static JedisPool jedisPool;
    static {
        // 配置连接池
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        // 最大连接
        poolConfig.setMaxTotal(8);
        // 最大空闲连接
        poolConfig.setMaxIdle(8);
        // 最小空闲连接
        poolConfig.setMinIdle(0);
        // 设置在最长等待时间
        poolConfig.setMaxWaitMillis(1000);
        // 创建连接池对象,参数:连接池配置、服务端ip、服务端端口、超时时间、密码
        jedisPool = new JedisPool(poolConfig, "192.168.150.101", 6379, 1000, "123321");
    }
		//获取Jedis对象
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}
  1. 改写测试类
代码语言:javascript
复制
@SpringBootTest
class RedisTestApplicationTests {

    private Jedis jedis = JedisConnectionFactory.getJedis();

    @Test
    void testString(){
        jedis.set("name","Kyle");
        String name = jedis.get("name");
        System.out.println("name = " + name);
    }

    @Test
    void testHash(){
        jedis.hset("reggie:user:1","name","Jack");
        jedis.hset("reggie:user:2","name","Rose");
        jedis.hset("reggie:user:3","name","Kyle");
        jedis.hset("reggie:user:1","age","21");
        jedis.hset("reggie:user:2","age","18");
        jedis.hset("reggie:user:3","age","18");
        Map<String, String> map = jedis.hgetAll("reggie:user:1");
        System.out.println(map);
    }

    @AfterEach
    void tearDown(){
        if (jedis != null){
            jedis.close();
        }
    }
}

但后面我们使用SpringDataRedis的时候,可以直接在yml配置文件里配置这些内容

3.SpringDataRedis

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis 官方网址:[官方网址]

功能:

1.提供了对不同Redis客户端的整合(Lettuce和Jedis) 2.提供了RedisTemplate统一API来操作Redis 3.支持Redis的发布订阅模型 4.支持Redis哨兵和Redis集群 5.支持基于Lettuce的响应式编程 6.支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化 7.支持基于Redis的JDKCollection实现 8.SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

API

返回值类型

说明

redisTemplate.opsForValue()

ValueOperations

操作String类型数据

redisTemplate.opsForHash()

HashOperations

操作Hash类型数据

redisTemplate.opsForList()

ListOperations

操作List类型数据

redisTemplate.opsForSet()

SetOperations

操作Set类型数据

redisTemplate.opsForZSet()

ZSetOperations

操作SortedSet类型数据

redisTemplate

-

通用的命令

(1) 快速入门

SpringBoot已经提供了对SpringDataRedis的支持,使用起来非常简单

  1. 引入spring-boot-starter-data-redis依赖
代码语言:javascript
复制
<!--redis依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--common-pool-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
        <!--Jackson依赖-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
  1. 在application.yml中配置Redis信息
代码语言:javascript
复制
spring:
  redis:
    host: IP地址
    port: 端口号
    password: 密码
    lettuce:
      pool:
        max-active: 8   # 最大连接数
        max-idle: 8     # 最大空闲连接
        min-idle: 0     # 最小空闲连接
        max-wait: 100ms # 连接等待时间
  1. 注入RedisTemplate
代码语言:javascript
复制
@Autowired
private RedisTemplate redisTemplate;
  1. 编写测试方法
代码语言:javascript
复制
@Test
void stringTest(){
    redisTemplate.opsForValue().set("name","Coolipa");
    String name = (String) redisTemplate.opsForValue().get("name");
    System.out.println(name);
}
(2) StringRedisTemplate

前言: RedisTemplate可以接收任意类型的对象,并默认采用JDK序列化,转成字节形式进行储存,如\xAC\xED\x00\x05t\x00\x06\xE5\x8C\x97\xE4\xBA\xAC

但也因为使用的是JDK序列化,导致可读性差内存占用大的缺点。

在这里插入图片描述
在这里插入图片描述

因此,我们可以统一使用String序列化器,要求只能存储String类型的Key和Value。当需要存储Java对象时,手动完成对象的序列化和反序列化。这样不仅可以节省额外的内存开销,可读性也更高。

拓:为什么不适用JSON序列化器来处理value? 使用JSON序列化器虽然可以将Jaava对象自动序列化为JSON字符串。但会记录序列化对应的class名称,如"@class": "com.sky.pojo.user",这样带来了额外的内存开销。

源码: SpringDataRedis就提供了RedisTemplate的子类:StringRedisTemplate,它的key和value的序列化方式默认就是String方式。源码如下

代码语言:javascript
复制
public class StringRedisTemplate extends RedisTemplate<String, String> {
    public StringRedisTemplate() {
        this.setKeySerializer(RedisSerializer.string());
        this.setValueSerializer(RedisSerializer.string());
        this.setHashKeySerializer(RedisSerializer.string());
        this.setHashValueSerializer(RedisSerializer.string());
    }

使用方法:

代码语言:javascript
复制
@Test
void stringTest() throws JsonProcessingException {
    //创建对象
    User user = new User("张三", 18);
    //手动序列化
    String json = mapper.writeValueAsString(user);
    //写入数据
    stringRedisTemplate.opsForValue().set("userdata", json);
    //获取数据
    String userdata = stringRedisTemplate.opsForValue().get("userdata");
    //手动反序列化
    User readValue = mapper.readValue(userdata, User.class);
    System.out.println(readValue);
}

本文为Redis学习笔记,持续更新中…

如果我的内容对你有帮助,希望可以收获你的点赞、评论、收藏。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.Redis的Java客户端
  • 2.Jedis客户端(可跳)
    • (1) 快速入门
    • (2) Jedis连接池
  • 3.SpringDataRedis
    • (1) 快速入门
    • (2) StringRedisTemplate
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档