摘要
Redis破障之途第四步,让我们来了解一下Redis的Java手机客户端Jedis吧!它是Redis的得力助手,给我们提供了丰富的API,让我们在Java语言的世界里轻松管理Redis。
正文
【Redis破障之途】四:Jedis基本上应用
在前面大家早已学了Rediscmd手机客户端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依靠。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.2</version>
</dependency>
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必须2个主要参数: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、Google的Protobuf、Facebook的Thrift这些。
大家以protostuff(Protobuf的Java手机客户端)为例子来开展学习培训:
- 引进protostuff依靠
<properties>
<protostuff.version>1.0.11</protostuff.version>
</properties>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>${protostuff.version}</version>
</dependency>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>${protostuff.version}</version>
</dependency>
- 界定dao层
public class Club implements Serializable {
private int id; // id
private String name; // 名字
private String info; // 叙述
private Date createDate; // 建立日期
private int rank; // 排行
//省去getter/setter等
}
- 检测实例化和反序列化
// 1.转化成实例化java工具
ProtostuffSerializer protostuffSerializer = new ProtostuffSerializer();
// 2.转化成Jedis目标
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 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手机客户端较为
关注不迷路
扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!
评论0