Redis解讀(2):Redis的Java客戶端
Redis的Java客戶端
Redis不僅使用命令客戶端來操作,而且可以使用程序客戶端操作,其實(shí)配置和實(shí)現(xiàn)起來也非常容易。
現(xiàn)在基本上主流的語言都有客戶端支持,比如Java、C、C#、C++、php、Node.js、Go等。在官方網(wǎng)站里列一些Java的客戶端,有Jedis、Redisson、Jredis、JDBC-Redis等,其中官方推薦使用Jedis和Redisson,在企業(yè)中用的最多的就是Jedis。
開啟遠(yuǎn)程連接
Redis 默認(rèn)是不支持遠(yuǎn)程連接的,需要手動(dòng)開啟。
一共修改兩個(gè)地方:
- 注釋掉 bind: 127.0.0.1
- 開啟密碼校驗(yàn),去掉 requirepass 的注釋
改完之后,保存退出,啟動(dòng) Redis。
Jedis
1.基本使用
Jedis 的 GitHub 地址:https://github.com/xetorthio/jedis
首先創(chuàng)建一個(gè)普通的 Maven 項(xiàng)目,項(xiàng)目創(chuàng)建成功后,添加 Jedis 依賴:
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.5.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
創(chuàng)建測(cè)試類:
import redis.clients.jedis.Jedis;
/**
* @author taoguoguo
* @description MyJedis
* @website http://www.rzrgm.cn/doondo
* @create 2021-04-09 15:21
*/
public class MyJedis {
public static void main(String[] args) {
//1.構(gòu)造一個(gè)Jedis對(duì)象 默認(rèn)端口6379也可省略
Jedis jedis = new Jedis("192.168.199.229", 6379);
//2.密碼認(rèn)證
jedis.auth("123456");
//3.測(cè)試是否連接成功
String ping = jedis.ping();
//4.返回pong表示連接成功
System.out.println(ping);
}
}
對(duì)于 Jedis 而言,一旦連接上 Redis 服務(wù)端,剩下的操作都很容易了。
在 Jedis 中,由于方法的 API 和 Redis 的命令高度一致,所以,Jedis 中的方法見名知意,直接使用即可。
2.連接池
在實(shí)際應(yīng)用中,Jedis 實(shí)例我們一般都是通過連接池來獲取,由于 Jedis 對(duì)象不是線城安全的,所以,當(dāng)
我們使用 Jedis 對(duì)象時(shí),從連接池獲取 Jedis,使用完成之后,再還給連接池。
package org.taoguoguo.redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
/**
* @author taoguoguo
* @description JedisPoolTest
* @website http://www.rzrgm.cn/doondo
* @create 2021-04-09 15:44
*/
public class JedisPoolTest {
public static void main(String[] args) {
//1.構(gòu)造一個(gè)Jedis連接池
JedisPool pool = new JedisPool("192.168.199.229", 6379);
//2.從連接池中
Jedis jedis = pool.getResource();
//3.Jedis操作
String ping = jedis.ping();
System.out.println(ping);
//4.歸還連接
jedis.close();
}
}
如果第三步拋出異常的話,會(huì)導(dǎo)致第四步無法執(zhí)行,所以,我們要對(duì)代碼進(jìn)行改進(jìn),確保第四步能夠執(zhí)行。
package org.taoguoguo.redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
/**
* @author taoguoguo
* @description JedisPoolTest
* @website http://www.rzrgm.cn/doondo
* @create 2021-04-09 15:44
*/
public class JedisPoolTest {
public static void main(String[] args) {
//1.構(gòu)造一個(gè)Jedis連接池
JedisPool pool = new JedisPool("192.168.199.229", 6379);
//2.從連接池中
Jedis jedis = pool.getResource();
try {
//3.Jedis操作
String ping = jedis.ping();
System.out.println(ping);
} catch (Exception e) {
e.printStackTrace();
} finally {
//4.歸還連接
if (jedis!=null) {
jedis.close();
}
}
}
}
通過 finally 我們可以確保 jedis 一定被關(guān)閉。
利用 JDK1.7 中的 try-with-resource 特性,可以對(duì)上面的代碼進(jìn)行改造
package org.taoguoguo.redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
/**
* @author taoguoguo
* @description JedisPoolTest
* @website http://www.rzrgm.cn/doondo
* @create 2021-04-09 15:44
*/
public class JedisPoolTest {
public static void main(String[] args) {
//1.構(gòu)造一個(gè)Jedis連接池
JedisPool pool = new JedisPool("192.168.199.229", 6379);
try(Jedis jedis = pool.getResource()){
//3.Jedis操作
jedis.auth("123456");
String ping = jedis.ping();
System.out.println(ping);
}
}
}
這段代碼的作用和上面的是一致的。
但是,上面這段代碼無法實(shí)現(xiàn)強(qiáng)約束。我們可以做進(jìn)一步的改進(jìn),通過接口約定規(guī)范調(diào)用:
package org.taoguoguo.redis;
import redis.clients.jedis.Jedis;
/**
* @author taoguoguo
* @description CallWithRedis
* @website http://www.rzrgm.cn/doondo
* @create 2021-04-09 16:51
*/
public interface CallWithRedis {
void call(Jedis jedis);
}
package org.taoguoguo.redis;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
/**
* @author taoguoguo
* @description Redis
* @website http://www.rzrgm.cn/doondo
* @create 2021-04-09 16:52
*/
public class Redis {
private JedisPool pool;
//無參構(gòu)造方法中初始化
public Redis() {
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
//連接池最大空閑數(shù)
config.setMaxIdle(300);
//最大連接數(shù)
config.setMaxTotal(1000);
//連接最大等待時(shí)間,如果是 -1 表示沒有限制
config.setMaxWaitMillis(30000);
//在空閑時(shí)檢查有效性
config.setTestOnBorrow(true);
/**
* 1. Redis 地址
* 2. Redis 端口
* 3. 連接超時(shí)時(shí)間
* 4. 密碼
*/
pool = new JedisPool(config,"192.168.199.229",6379,30000,"123456");
}
public void execute(CallWithRedis callWithRedis){
try(Jedis jedis = pool.getResource()){
callWithRedis.call(jedis);
}
}
}
package org.taoguoguo.redis;
/**
* @author taoguoguo
* @description JedisPoolTest
* @website http://www.rzrgm.cn/doondo
* @create 2021-04-09 15:44
*/
public class JedisPoolTest {
public static void main(String[] args) {
//1.構(gòu)造一個(gè)Jedis連接池
/*JedisPool pool = new JedisPool("192.168.199.229", 6379);
try(Jedis jedis = pool.getResource()){
//2.認(rèn)證
jedis.auth("123456");
//3.Jedis操作
String ping = jedis.ping();
System.out.println(ping);
}*/
Redis redis = new Redis();
redis.execute(jedis -> {
System.out.println(jedis.ping());
});
}
}
Lettuce
GitHub:https://github.com/lettuce-io/lettuce-core
Lettuce 和 Jedis 的一個(gè)比較:
- Jedis 在實(shí)現(xiàn)的過程中是直接連接 Redis 的,在多個(gè)線程之間共享一個(gè) Jedis 實(shí)例,這是線城不安
全的,如果想在多線程場(chǎng)景下使用 Jedis,就得使用連接池,這樣,每個(gè)線城都有自己的 Jedis 實(shí)
例,但這樣也會(huì)帶來不好的一點(diǎn)會(huì)消耗更多的物理資源。 - Lettuce 基于目前很火的 Netty NIO 框架來構(gòu)建,所以克服了 Jedis 中線程不安全的問題,Lettuce
支持同步、異步 以及 響應(yīng)式調(diào)用,多個(gè)線程可以共享一個(gè)連接實(shí)例。
使用 Lettuce,首先創(chuàng)建一個(gè)普通的 Maven 項(xiàng)目,添加 Lettuce 依賴:
1.基本使用
使用 Lettuce,首先創(chuàng)建一個(gè)普通的 Maven 項(xiàng)目,添加 Lettuce 依賴:
<dependencies>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
</dependencies>
然后來一個(gè)簡(jiǎn)單的測(cè)試案例:
package org.taoguoguo;
import io.lettuce.core.RedisClient;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.sync.RedisCommands;
/**
* @author taoguoguo
* @description LettuceTest
* @website http://www.rzrgm.cn/doondo
* @create 2021-04-11 16:00
*/
public class LettuceTest {
public static void main(String[] args) {
RedisClient redisClient = RedisClient.create("redis://123456@192.168.0.104");
//2.獲取連接對(duì)象
StatefulRedisConnection<String, String> connect = redisClient.connect();
//3.獲取redis同步調(diào)用對(duì)象
RedisCommands<String, String> sync = connect.sync();
//4.操作redis
sync.set("name", "taoguoguo");
String name = sync.get("name");
System.out.println(name);
}
}

浙公網(wǎng)安備 33010602011771號(hào)