Redis基础(5):Redis的Java客户端

0 阅读5分钟

RedisJava客户端

前面已经提到了Redis的常用的五种数据结构,并且通过命令行的方式进行了操作,但是在日常使用Redis时,大部分情况下都是基于编码的方式完成的。Redis的官网(https://redis.io/clients)提供了各种语言的客户端:

image.png
Redis对于Java语言的支持也十分到位,其提供了很多Java语言的客户端:

image.png

Jedis简介

Jedis是一个十分经典的RedisJava客户端,其Redis的命令作为方法名称,学习成本较低(会用Redis就能使用Jedis),简单实用,但是Jedis实例是线程不安全的,多线程环境下需要和连接池配合使用。

Lettuce简介

Lettuce是基于Netty实现的,支持同步、异步和响应式编程的方式,并且线程是安全的,可以完美支持Redis哨兵模式、集群模式和管道模式。

Redisson简介

Redisson是基于Redis实现的分布式、可伸缩的Java数据结构集合。包含了诸如MapQueueLockSemaphoreAtomicLong等强大功能。

SpringDataRedis简介

SpringDataReidsJedisLettuce的结合体:它在两者基础上提供了统一的操作模板(如RedisTemplate)、序列化支持、事务管理及Spring生态集成,既保留了Jedis的简洁性和Lettuce的高并发性能,又通过抽象层简化了Redis的复杂操作,是开发比较推荐的RedisJava客户端

Jedis快速入门

Jedis的快速入门十分简单,主要分为三步(以Maven为例):1.引入依赖、2.建立Redis连接、3.进行Redis操作,接下来就根据这三步进行讲解:

1.引入依赖

由于使用了Maven作为构建工具,引入Jedis的依赖相当的简单,我们只需要在pom.xml文件中引入JedisMaven坐标即可:

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

上述代码只是我的版本选择,不一定需要这么高版本的Jedis依赖,根据自己的需求选择即可。

2.建立连接

由于在使用Jedis操作Redis之前,都必须建立和Redis的连接,所以说我们可以将建立Redis连接的代码封装成一个方法,在每次操作之前调用即可:

@BeforeEach
void setUp() {
    // 建立连接
    jedis = new Jedis("192.168.181.134", 6379);
    // 设置密码
    jedis.auth("your password");
    // 选择库
    jedis.select(0);
}

测试时,可以使用@BeforeEach注解自动在每一个测试方法执行前,先执行setUp方法和Redis建立连接。可以直接通过new直接初始化一个Jedis对象,需要传入的参数是Redis主机地址和端口号,如果Redis设置了密码,那么需要通过auth方法进行验证,这和命令行是一样的。

3.Redis操作

当连接建立好之后,就可以通过Jedis中的方法,通过Java代码操作Redis了,Jedis有一个好处就是方法名是以Redis中的命令命名的,所以说操作起来就会十分简单

void testString() {
    // 存入数据
    String result = jedis.set("username", "jack");
    System.out.println(result);
    // 获取数据
    String username = jedis.get("username");
    System.out.println(username);
}

通过set方法向Redis中存入了一条String类型的数据,其Valuejack,其Keyusername;并且通过get方法,我们也能通过Key取得对应的Value
建立了与Redis的连接之后,完成了对应的操作就需要进行资源释放,关闭和Redis的连接:

@AfterEach
void close() {
    jedis.close();
}

Jedis连接池

上文提到Jedis本身的线程是不安全的,并且在频繁的创建和销毁连接的时候会有性能损耗,所以说建议使用Jedis连接池替代本身Jedis直连的方式。其中Jedis连接池和关系型数据库连接池需要配置的选项差不多,主要需要配置的是:最大连接数最大空闲连接数最长等待时间等……,并且,我们可以将连接池配置的代码封装为一个工具类,之后就可以直接从这个工具类中获取Jedis的连接了:

package com.wzb.util;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisConnectionFactory {

    private static final JedisPool jedisPool;

    static {
        // 配置连接池
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        // 设置连接池最大连接数
        poolConfig.setMaxTotal(8);
        // 设置连接池最大空闲连接数
        poolConfig.setMaxIdle(8);
        // 设置连接池最小空闲连接数
        poolConfig.setMaxIdle(4);
        // 设置连接池最大等待时间
        poolConfig.setMaxWaitMillis(1000);
        // 创建连接池对象
        jedisPool = new JedisPool(poolConfig, "192.168.181.134", 6379,
                1000, "your password"); 
        // 连接池对象初始化需要连接池配置类、Redis主机、端口、超时时间(ms),密码
    }

    public static Jedis getConnection() {
        return jedisPool.getResource();
    }
}

Jedis本身自带了JedisPool连接池,所以说我们可以直接在类中对JedisPool进行配置,从而完成Jedis连接池的配置。并且我们在工具类中封装了static方法来获取Jedis连接,这个方法是调用的JedisPool中的getResource方法获取Jedis连接的,这个方法会从连接池中返回一个Jedis连接:

image.png
有了连接池之后,我们就可以修改原来的setUp方法,将直接new Jedis连接改为工具类中的getConnection方法,从连接池中获取连接:

@BeforeEach
void setUp() {
    // 建立连接
    jedis = JedisConnectionFactory.getConnection();
    // 选择库
    jedis.select(0);
}

但是在释放资源的时候,可以直接使用Jedis中的close方法,因为这个方法会先检查是否有连接池,如果有连接池,就不会直接销毁连接,而是将连接归还连接池:

image.png