Java中Jedis基本使用

网友投稿 306 2023-01-13

Java中Jedis基本使用

在前面我们已经学习了Redis命令行客户端redis-cli的使用,接下来我们了解一下Redis基于java编程语言的客户端。

在Java语言体系下,有三个常用的Redis客户端Jedis、Redisson、Lettuce。三者各有特点,各有适用的场景。

Jedis:Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;

Jedis中的方法调用是比较底层的暴露的Redis的API,也即Jedis中的Java方法基本和Redis的API保持着一致,了解Redis的API,也就能熟练的使用Jedis。

Redisson:实现了分布式和可扩展的Java数据结构,提供很多分布式相关操作服务,例如,分布式锁,分布式集合,可通过Redis支持延迟队列。和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

Redisson中的方法则是进行比较高的抽象,每个方法调用可能进行了一个或多个Redis方法调用。

Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。是SpringBoot2.x版本默认的客户端。

好了,我们开始学习Jedis的使用吧。

1、Jedis的基本使用

创建Maven工程,在项目中添加Jedis依赖。

redis.clients

jedis

2.8.2

Jedis的使用方法非常简单,只要三行代码就可以实现基本的set/get功能:

//1.生成一个Jedis对象,这个对象负责和指定Redis实例进行通信

Jedis jedis = new Jedis("127.0.0.1", 6379);

// 2.jedis执行set操作

jedis.set("hello", "world");

//3.jedis执行get操作,value="world"

String value = jedis.get("hello");

初始化Jedis需要两个参数:Redis实例的IP和端口,除了这两个参数外,还有一个包含了四个参数的构造函数是比较常用的:

Jedis(final String host, final int port, final int connectionTimeout, final int soTimeout)

参数说明:

host:Redis实例的所在机器的IP

port:Redis实例的端口

connectionTimeout:客户端连接超时

soTimeout:客户端读写超时

可以打印输出一下上面程序的结果:

和JDBC类似,一般涉及到这种网络I/O的操作,最好使用try catch finally的形式,稍微修改一下上面的例子:

Jedis jedis = null;

try {

jedis = new Jedis("127.0.0.1", 6379);

jedis.get("hello");

} catch (Exception e) {

e.printStackTrace();

} finally {

if (jedis != null) {

jedis.close();

}

}

接下来我们看一下Jedis对各种基本数据类型的操作:

字符串

jedis.set("hello", "world");

//结果 world

System.out.println(jedis.get("hello"));

//结果 1

System.out.println(jedis.incr("counter"));

hash

jedis.hset("myhash", "f1", "v1");

jedis.hset("myhash", "f2", "v2");

//运行结果 {f2=v2, f1=v1}

System.out.println(jedis.hgetAll("myhash"));

list

jedis.rpush("mylist", "1");

jedis.rpush("mylist", "2");

jedis.rpush("mylist", "3");

//运行结果 [1, 2, 3]

System.out.println(jedis.lrange("mylist",0,-1));

set

jedis.sadd("myset", "a");

jedis.sadd("myset", "b");

jedis.sadd("myset", "a");

//运行结果 [b, a]

System.out.println(jedis.smembers("myset"));

zset

Jedis jedis = new Jedis("127.0.0.1", 6379);

jedis.zadd("thezset", 99, "tom");

jedis.zadd("thezset", 66, "peter");

jedis.zadd("thezset", 33, "james");

//运行结果 james 33.0 peter 66.0 tom 99.0

jedis.zrangeWithScores("thezset",0,-1).stream().forEach(s->{

System.out.print(s.getElement()+" "+s.getScore()+" ");

});

2、序列化

在Java中,存储对象一般会进行序列化和反序列化,Jedis本身并不支持序列化。可以引入游戏额第三方的序列化工具,例如XML、json、谷歌的Protobuf、Facebook的Thrift等等。

我们以protostuff(Protobuf的Java客户端)为例来进行学习:

引入protostuff依赖

1.0.11

com.dyuproject.protostuff

protostuff-runtime

${protostuff.version}

com.dyuproject.protostuff

protostuff-core

${protostuff.version}

定义实体类

public class Club implements Serializable {

private int id; // id

private String name; // 名称

private String info; // 描述

private Date createDate; // 创建日期

private int rank; // 排名

//省略getter/setter等

}

测试序列化和反序列化

// 1.生成序列化工具类

ProtostuffSerializer protostuffSerializer = new ProtostuffSerializer();

// 2.生成Jedis对象

Jedis jedis = new Jedis("127.0.0.1", 6379);

/http:/// 3.序列化

String key = "club:1";

// 定义实体对象

Club club = new Club(1, "AC", "米兰", new Date(), 1);

// 序列化

byte[] clubBtyes = protostuffSerializer.serialize(club);

jedis.set(key.getBytes(), clubBtyes);

// 4.反序列化

byte[] resultBtyes = jedis.get(key.getBytes());

Club resultClub = protostuffSerializer.deserialize(resultBtyes);

//结果 Club{id=1, name='AC', info='米兰', createDate=Sat May 15 22:21:42 CST 2021, rank=1}

System.out.println(resultClub.toString());

3、Jedis连接池

在上面我们使用的是Jedis的直连方式,每次都会新建TCP 连接,使用后再断开连接。

这种频繁的连接/断开连接的过程显然是对资源的一种浪费。

和数据库连接池一样,同样可以引入池化技术,将Jedis连接存在池子(JedisPool)里,每次去池子里取,而不用重新创建。

连接池的方式是可以预先初始化好Jedis连接,所以每次只需要从 Jedis连接池借用即可,而借用和归还操作是在本地进行的,只有少量的并发同步开销,远远小于新建TCP连接的开销。

Jedis提供了JedisPool这个类作为对Jedis的连接池,同时使用了Apache的通用对象池工具common-pool作为资源的管理工具。

使用JedisPool操 作Redis示例如下:

1)Jedis连接池(通常JedisPool是单例的):

// common-pool连接池配置,这里使用默认配置

GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();

// 初始化Jedis连接池

JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);

2)获取Jedis对象不再是直接生成一个Jedis对象进行直连,而是从连接池直接获取:

Jedis jedis = null;

try {

// 1. 从连接池获取jedis对象

jedis = jedisPool.getResource();

// 2. 执行操作

jedis.get("hello");

} catch (Exception e) {

e.printStackTrace();

} finally {

if (jedis != null) {

// 如果使用JedisPool,close操作不是关闭连接,代表归还连接池

jedis.close();

}

}

面GenericObjectPoolConfig使用的是默认配置,实际它提供有很多参数,例如池子中最大连接数、最大空闲连接数、最小空闲连接数、连接活性检测,等等。

参考:

【1】:《Redis开发与运维》

【2】:redis几种java客户端比较

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:这么设置IDEA中的Maven,再也不用担心依赖下载失败了
下一篇:中远快运物流查询(中远物流地址)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~