Java客户端-Jedis

简介: 通过本篇博文学习不同框架下使用Java客户端-Jedis。

1.什么是Jedis

①Jedis是Java语言开发的Redis客户端工具包,用于Java语言与Redis数据进行交互.
② Jedis只是对Redis命令的封装,掌握Redis命令便可轻易上手Jedis
③ Jedis遵循RESP协议规范开发,具有良好的通用性与可读性.

github官网地址:https://github.com/redis/jedis#readme
在这里插入图片描述

2.Jedis的简单使用

创建一个名为redisjedisproject的Maven项目
在这里插入图片描述

(1) 导入相关依赖

Jedis依赖:https://search.maven.org/artifact/redis.clients/jedis/4.2.3/jar
在这里插入图片描述

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

junit测试依赖:

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

在这里插入图片描述

(2) Getting started

github上学习链接:https://github.com/redis/jedis#readme
在这里插入图片描述
英文解释翻译:


接下来,你需要连接到 Redis。对于许多应用程序,最好使用连接池。你可以像这样实例化一个 Jedis 连接池:

JedisPool pool = new JedisPool("localhost", 6379);

对于 JedisPool 实例,可以使用 try-With-resources 块获得连接并运行 Redis 命令 ( 这种方式无须自己手动close() )。

try (Jedis jedis = pool.getResource()) {
  jedis.set("clientName", "Jedis");// 运行单个 SET 命令
}

Jedis 实例实现了大多数 Redis 命令,这些命令可以在https://www.javadoc.io/doc/redis.clients/jedis/latest/redis/clients/jedis/Jedis.htmlApI中查询命令对应的方法。
在这里插入图片描述


根据上面的说明,我们编写如下代码:
在这里插入图片描述

详细代码:

import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class JedisTest {

    @Test
    public void test1(){
        JedisPool pool = new JedisPool("192.168.1.6", 6666);// Redis服务端IP和端口号
        try (Jedis jedis = pool.getResource()) {
           // 使用auth()方法进行用户认证
            jedis.auth("123456");// 配置文件中的密码

            // 使用相关Redis的命令
            // 选择第0个数据库进行操作
            jedis.select(0);
            // 向0号数据库写入,字符串数据
            jedis.set("Java", "best");
            jedis.set("PHP", "good");

            // 查询是否写入
            System.out.println(jedis.get("Java"));
            System.out.println(jedis.get("PHP"));
            
        }
    }

}

运行测试用例:

在这里插入图片描述
在这里插入图片描述
备注:根据上面的操作,我们可以发现其实Jedis的操作是非常简单,以前我们在命令行中输入相应命令进行操作,在Jedis中我们只需要调用相应方法去执行相应命令即可。

(3) Easier way of using connection pool

英文解释翻译:


对每个命令使用 try-with-resources 块可能比较麻烦,因此您可以考虑使用 JedisPooled。

JedisPooled jedis = new JedisPooled("localhost", 6379);

根据上面的说明,我们编写如下代码:
在这里插入图片描述
详细代码:

    @Test
    public void test3(){
        JedisPooled pool = new JedisPooled("192.168.1.6", 6666,null,"123456");
        pool.set("Java_3", "best");
        pool.set("PHP_3", "good");
        System.out.println(pool.get("Java_3"));
        System.out.println(pool.get("PHP_3"));

    }

运行效果:
在这里插入图片描述
在这里插入图片描述

(4) 连接池

使用链接池是官方推荐的使用方式,通过连接池可以更好的使用Jedis的,我们可以通过GenericObjectPoolConfig对连接池进行相关配置,GenericObjectPoolConfig API文档: 点击跳转查询!

在这里插入图片描述
通过GenericObjectPoolConfig对象对连接池进行配置,具体代码如下:
在这里插入图片描述

详细代码:

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisTest {

    @Test
    public void test1(){
        GenericObjectPoolConfig config =new JedisPoolConfig();
        config.setMaxTotal(100); // 设置连接池中最多允许放100个Jedis对象
        config.setMaxIdle(100);// 设置连接池中最大允许空闲连接
        config.setMinIdle(10);// 设置连接池中最小允许的连接数
        config.setTestOnBorrow(false); // 借出连接的时候是否测试有效性,推荐false
        config.setTestOnReturn(false); // 归还时是否测试,推荐false
        config.setTestOnCreate(false); // 创建时是否测试有效  开发的时候设置为false,实践运行的时候设置为true
        config.setBlockWhenExhausted(true); // 当连接池内jedis无可用资源时,是否等待资源,true
        config.setMaxWaitMillis(1000);// 没有获取资源时最长等待1秒,1秒后没有还没有的话就报错

        JedisPool pool = new JedisPool(config,"192.168.1.6", 6666);

        try (Jedis jedis = pool.getResource()) {
           // 使用auth()方法进行用户认证
            jedis.auth("123456");

            // 使用相关Redis的命令
            // 选择第0个数据库进行操作
            jedis.select(0);
            // 向0号数据库写入,字符串数据
            jedis.set("Java", "best");
            jedis.set("PHP", "good");

            // 查询是否写入
            System.out.println(jedis.get("Java"));
            System.out.println(jedis.get("PHP"));

        }
    }

}

使用连接池的方式和直连的方式有什么区别:
在这里插入图片描述

关于什么是直连方式?

直连方式就是直接通过Jedis对象进行操作。

在这里插入图片描述

详细代码:

    @Test
    public void test2(){
        Jedis jedis = new Jedis("192.168.1.6", 6666);
        try {
            jedis.auth("123456");

            // 使用相关Redis的命令
            // 选择第0个数据库进行操作
            jedis.select(0);
            // 向0号数据库写入,字符串数据
            jedis.set("Java_2", "best");
            jedis.set("PHP_2", "good");

            // 查询是否写入
            System.out.println(jedis.get("Java_2"));
            System.out.println(jedis.get("PHP_2"));
        } catch (Exception e) {
            System.out.println(e.toString());
        }

        finally {
            jedis.close();
        }
    }

运行效果:
在这里插入图片描述
在这里插入图片描述

3.Spring环境下使用JedisPool

Spring Data Redis 是 Spring Data 大家族的一部分,它提供了简单的配置和从 Spring 应用程序访问 Redis 的方法。它提供了与存储交互的低层和高层抽象,将用户从基础设施关注中解放出来。

官网学习链接:https://spring.io/projects/spring-data-redis#overview
在这里插入图片描述

创建一个Maven项目,项目名为springredis
在这里插入图片描述
导入依赖:

( 注意一下这里使用的是com.yugabyte的jedis依赖 )

 <dependencies>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>2.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.yugabyte</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0-yb-11</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.17</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

applicationContext.xml配置内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/beans ">


    <!--连接池配置信息-->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="100"></property>
        <property name="maxIdle" value="100"></property>
        <property name="minIdle" value="10"></property>
        <property name="testOnBorrow" value="false"></property>
        <property name="testOnReturn" value="false"></property>
        <property name="testOnCreate" value="false"></property>
        <property name="blockWhenExhausted" value="true"></property>
        <property name="maxWaitMillis" value="1000"></property>
    </bean>

    <bean id="jedisConnFactory"
          class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
          p:use-pool="true"
          p:poolConfig-ref="poolConfig"
          p:hostName="192.168.1.6"
          p:port="6666"
          p:password="123456"
          p:database="1"
    />


    <!-- redis template definition -->
    <bean id="redisTemplate"
          class="org.springframework.data.redis.core.RedisTemplate"
          p:connection-factory-ref="jedisConnFactory"/>


</beans>

(1) String数据类型

测试代码:
( opsForValue()是对String字符串操作的类 )
在这里插入图片描述
详细代码:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class RedisTest {

    @Resource
    private RedisTemplate<String,Object> redisTemplate;
    @Test
    public void test1(){
            redisTemplate.opsForValue().set("a","张三");
            redisTemplate.opsForValue().set("b","李四");

        System.out.println("key=a,value="+redisTemplate.opsForValue().get("a"));
        System.out.println("key=b,value="+redisTemplate.opsForValue().get("b"));
    }

}

运行效果:
在这里插入图片描述
在这里插入图片描述

根据上面的操作会发现,存入到Redis中的数据出现了乱码,这是因为默认情况下,Spring-Data-Redis 会采用JDK 序列化的方式将所有key value进行二进制序列化,这会导致redis数据库的值可读性极差,通常我们需要用字符串或JSON的形式来保存对象:
解决方式一:字符串形式
在redisTemplate中添加配置
在这里插入图片描述

详细配置:

    <!-- redis template definition -->
    <bean id="redisTemplate"
          class="org.springframework.data.redis.core.RedisTemplate"
          p:connection-factory-ref="jedisConnFactory">
        <!-- keySerializer key序列化采用String原文保存 -->
        <property name="keySerializer">
            <!-- StringRedisSerializer 字符串原文序列化保存 -->
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
        </property>
        <property name="valueSerializer">
            <!--//字符串原文序列化保存-->
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
        </property>
    </bean>

再次运行测试用例:
在这里插入图片描述
解决方式二:JSON的形式
导入依赖:

 <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.6</version>
        </dependency>

修改配置:
在这里插入图片描述
详细配置:

    <!-- redis template definition -->
    <bean id="redisTemplate"
          class="org.springframework.data.redis.core.RedisTemplate"
          p:connection-factory-ref="jedisConnFactory">
        <!-- keySerializer key序列化采用String原文保存 -->
        <property name="keySerializer">
            <!-- StringRedisSerializer 字符串原文序列化保存 -->
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
        </property>
        <property name="valueSerializer">
            <!--//利用Jackson进行对象序列化-->
            <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"></bean>
        </property>
    </bean>

新增一个User类和test2测试方法:

User类
在这里插入图片描述

public class User {
    private String username;
    private String password;

    public User(){

    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

test2测试方法:

在这里插入图片描述

运行test2:
在这里插入图片描述

在这里插入图片描述

(2) Hash数据类型

( opsForHash()是对Hash数据类型操作的类 )

导入依赖:

( 这个依赖用于将JavaBean转为Map的操作 )

        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.3</version>
        </dependency>

测试代码:
在这里插入图片描述
运行效果:
在这里插入图片描述
在这里插入图片描述
运行后发现还是出现乱码,对于Hash进行数据存储也需要进行相应的配置(设置hashKeySerializer和hashValueSerializer):
在这里插入图片描述

详细配置:

  <property name="hashKeySerializer">
            <!-- StringRedisSerializer 字符串原文序列化保存 -->
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
        </property>
        <property name="hashValueSerializer">
            <!--//利用Jackson进行对象序列化-->
            <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"></bean>
        </property>

删掉乱码数据,再次运行问题解决:
在这里插入图片描述
运行效果:
在这里插入图片描述
在这里插入图片描述

(3) list数据类型

( opsForList()是对list数据类型操作的类 )
测试方法代码:
在这里插入图片描述

运行效果:
在这里插入图片描述
存入到数据库中的数据并没有出现乱码,而是以Json形式进行数据存储
在这里插入图片描述

(4) 底层操作

对于一些底层操作需要使用execute方法进行操作,底层操作指的通过命令方法对Redis数据库进行操作,如flushDb()命令,select()命令这些底层命令。

测试方法:
在这里插入图片描述
运行效果:
在这里插入图片描述
在这里插入图片描述

相关文章
|
8月前
|
人工智能 Java API
MCP客户端调用看这一篇就够了(Java版)
本文详细介绍了MCP(Model Context Protocol)客户端的开发方法,包括在没有MCP时的痛点、MCP的作用以及如何通过Spring-AI框架和原生SDK调用MCP服务。文章首先分析了MCP协议的必要性,接着分别讲解了Spring-AI框架和自研SDK的使用方式,涵盖配置LLM接口、工具注入、动态封装工具等步骤,并提供了代码示例。此外,还记录了开发过程中遇到的问题及解决办法,如版本冲突、服务连接超时等。最后,文章探讨了框架与原生SDK的选择,认为框架适合快速构建应用,而原生SDK更适合平台级开发,强调了两者结合使用的价值。
11412 33
MCP客户端调用看这一篇就够了(Java版)
|
8月前
|
存储 网络协议 Java
Java获取客户端IP问题:返回127.0.0.1
总结:要解决Java获取客户端IP返回127.0.0.1的问题,首先要找出原因,再采取合适的解决方案。请参考上述方案来改进代码,确保在各种网络环境下都能正确获取客户端IP地址。希望本文对您有所帮助。
552 25
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
968 4
|
分布式计算 Java Hadoop
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
267 1
|
JSON NoSQL Java
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
这篇文章介绍了在Java中使用Redis客户端的几种方法,包括Jedis、SpringDataRedis和SpringBoot整合Redis的操作。文章详细解释了Jedis的基本使用步骤,Jedis连接池的创建和使用,以及在SpringBoot项目中如何配置和使用RedisTemplate和StringRedisTemplate。此外,还探讨了RedisTemplate序列化的两种实践方案,包括默认的JDK序列化和自定义的JSON序列化,以及StringRedisTemplate的使用,它要求键和值都必须是String类型。
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
|
缓存 NoSQL Java
【Azure Redis 缓存】定位Java Spring Boot 使用 Jedis 或 Lettuce 无法连接到 Redis的网络连通性步骤
【Azure Redis 缓存】定位Java Spring Boot 使用 Jedis 或 Lettuce 无法连接到 Redis的网络连通性步骤
348 0
|
Java
Java使用FileInputStream&&FileOutputStream模拟客户端向服务器端上传文件(单线程)
Java使用FileInputStream&&FileOutputStream模拟客户端向服务器端上传文件(单线程)
224 1
Java模拟文件发送给服务器,服务器将文件转发给其他用户,并保存到服务器本地,其他用户可以接收,并保存到本地磁盘,支持各种文件格式,并解决通信中服务器怎么区分客户端发来的文件类型
Java模拟文件发送给服务器,服务器将文件转发给其他用户,并保存到服务器本地,其他用户可以接收,并保存到本地磁盘,支持各种文件格式,并解决通信中服务器怎么区分客户端发来的文件类型
235 0
|
消息中间件 Java Kafka
Java 客户端访问kafka
Java 客户端访问kafka
181 9
|
Java 数据格式
Java面试题:简述Java Socket编程的基本流程,包括客户端和服务器的创建与通信。
Java面试题:简述Java Socket编程的基本流程,包括客户端和服务器的创建与通信。
302 0