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

RedisJava客户端

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

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

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坐标即可:

java 复制代码
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>5.2.0</version>
</dependency>

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

2.建立连接

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

java 复制代码
@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中的命令命名的,所以说操作起来就会十分简单

java 复制代码
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的连接:

java 复制代码
@AfterEach
void close() {
    jedis.close();
}

Jedis连接池

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

java 复制代码
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连接:

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

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

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

相关推荐
Hommy88几秒前
【剪映小助手】添加图片接口(Add Images)
后端·github·剪映小助手·视频剪辑自动化
凡人叶枫16 分钟前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
GetcharZp33 分钟前
别再盲目用 OpenCV 读图了,这才是 CV 预处理的终极杀手锏!
后端
学逆向的40 分钟前
C++纯虚函数
开发语言·c++·网络安全
何极光1 小时前
IDEA集成Maven
java·maven·intellij-idea
火山上的企鹅1 小时前
Codex实战:APP远程升级服务搭建(三)后台管理页面(APK 上传、版本管理、多应用页签)
服务器·网络·数据库·oracle·qgc
程序员二叉1 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉1 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
老马识途2.01 小时前
在AI的帮助下理解spring的启动过程
java·前端·spring
青山木1 小时前
Hot 100 --- 轮转数组
java·数据结构·算法