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

Redis的Java客户端

前面已经提到了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数据结构集合 。包含了诸如Map、Queue、Lock、Semaphore、AtomicLong等强大功能。

SpringDataRedis简介

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

Jedis快速入门

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

1.引入依赖

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

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类型的数据,其Value是jack,其Key是username;并且通过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方法,因为这个方法会先检查是否有连接池,如果有连接池,就不会直接销毁连接,而是将连接归还连接池:

相关推荐
.痞老板.28 分钟前
mysql初阶--数据库基础
数据库·mysql
nice_lcj5201 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
城北徐宫2 小时前
MySQL约束条件一览
数据库·mysql
码农小河662 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
IT_陈寒2 小时前
Redis大key删除为什么会导致服务卡顿?我的线上事故复盘
前端·人工智能·后端
系统集成-鹰翔2 小时前
ERP图片改名后仍命中识别缓存:缓存键、十分钟到期与调用计数
javascript·经验分享·后端
用户8356290780512 小时前
使用 Python 在 Excel 中添加和自定义迷你图
后端·python
码事漫谈3 小时前
给AI看一颗❤️,它就开始写递归了
后端
用户8356290780513 小时前
使用 Python 在 Excel 图表中添加趋势线与回归方程
后端·python
你三大爷3 小时前
Netty / Kafka / Redis 保序问题的源码对比与 NIO 框架主流解法
后端·架构