欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis Java Lettuce驅(qū)動(dòng)框架原理解析

 更新時(shí)間:2020年12月04日 15:11:04   作者:codedot  
這篇文章主要介紹了Redis Java Lettuce驅(qū)動(dòng)框架原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

Lettuce是一個(gè)高性能基于Java編寫(xiě)的Redis驅(qū)動(dòng)框架,底層集成了Project Reactor提供天然的反應(yīng)式編程,通信框架集成了Netty使用了非阻塞IO,5.x版本之后融合了JDK1.8的異步編程特性,在保證高性能的同時(shí)提供了十分豐富易用的API,5.1版本的新特性如下:

  • 支持Redis的新增命令ZPOPMIN, ZPOPMAX, BZPOPMIN, BZPOPMAX。
  • 支持通過(guò)Brave模塊跟蹤Redis命令執(zhí)行。
  • 支持Redis Streams。
  • 支持異步的主從連接。
  • 支持異步連接池。
  • 新增命令最多執(zhí)行一次模式(禁止自動(dòng)重連)。
  • 全局命令超時(shí)設(shè)置(對(duì)異步和反應(yīng)式命令也有效)。
  • ......等等

注意一點(diǎn):Redis的版本至少需要2.6,當(dāng)然越高越好,API的兼容性比較強(qiáng)大。

引入依賴(lài)項(xiàng):

<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>5.3.4.RELEASE</version>
</dependency>

一、連接Redis

單機(jī)、哨兵、集群模式下連接Redis需要一個(gè)統(tǒng)一的標(biāo)準(zhǔn)去表示連接的細(xì)節(jié)信息,在Lettuce中這個(gè)統(tǒng)一的標(biāo)準(zhǔn)是RedisURI??梢酝ㄟ^(guò)三種方式構(gòu)造一個(gè)RedisURI實(shí)例:

定制的字符串URI語(yǔ)法:

RedisURI uri = RedisURI.create("redis://localhost/");

使用建造器(RedisURI.Builder):

RedisURI uri = RedisURI.builder().withHost("localhost").withPort(6379).build();

直接通過(guò)構(gòu)造函數(shù)實(shí)例化:

RedisURI uri = new RedisURI("localhost", 6379, 60, TimeUnit.SECONDS);

二、基本使用

Lettuce使用的時(shí)候依賴(lài)于四個(gè)主要組件:

  • RedisURI:連接信息。
  • RedisClient:Redis客戶端,特殊地,集群連接有一個(gè)定制的RedisClusterClient。
  • Connection:Redis連接,主要是StatefulConnection或者StatefulRedisConnection的子類(lèi),連接的類(lèi)型主要由連接的具體方式(單機(jī)、哨兵、集群、訂閱發(fā)布等等)選定,比較重要。
  • RedisCommands:Redis命令A(yù)PI接口,基本上覆蓋了Redis發(fā)行版本的所有命令,提供了同步(sync)、異步(async)、反應(yīng)式(reative)的調(diào)用方式,對(duì)于使用者而言,會(huì)經(jīng)常跟RedisCommands系列接口打交道。

一個(gè)基本使用例子如下:

RedisURI redisUri = RedisURI.builder()          // <1> 創(chuàng)建單機(jī)連接的連接信息
    .withHost("localhost")
    .withPort(6379)
    .withTimeout(Duration.of(10, ChronoUnit.SECONDS))
    .build();
RedisClient redisClient = RedisClient.create(redisUri);  // <2> 創(chuàng)建客戶端
StatefulRedisConnection<String, String> connection = redisClient.connect();   // <3> 創(chuàng)建線程安全的連接
RedisCommands<String, String> redisCommands = connection.sync();        // <4> 創(chuàng)建同步命令
SetArgs setArgs = SetArgs.Builder.nx().ex(5);
String result = redisCommands.set("name", "throwable", setArgs);
result = redisCommands.get("name");
System.out.println(result);
// ... 其他操作
connection.close();  // <5> 關(guān)閉連接
redisClient.shutdown(); // <6> 關(guān)閉客戶端

關(guān)閉連接一般在應(yīng)用程序停止之前操作,一個(gè)應(yīng)用程序中的一個(gè)Redis驅(qū)動(dòng)實(shí)例不需要太多的連接(一般情況下只需要一個(gè)連接實(shí)例就可以,如果有多個(gè)連接的需要可以考慮使用連接池,其實(shí)Redis目前處理命令的模塊是單線程,在客戶端多個(gè)連接多線程調(diào)用理論上沒(méi)有效果)。

關(guān)閉客戶端一般應(yīng)用程序停止之前操作,如果條件允許的話,基于后開(kāi)先閉原則,客戶端關(guān)閉應(yīng)該在連接關(guān)閉之后操作。

三、Lettuce API

  • 同步(sync):RedisCommands。
  • 異步(async):RedisAsyncCommands。
  • 反應(yīng)式(reactive):RedisReactiveCommands。
RedisURI redisUri = RedisURI.builder()
    .withHost("localhost")
    .withPort(6379)
    .withTimeout(Duration.of(10, ChronoUnit.SECONDS))
    .build();
RedisClient client = RedisClient.create(redisUri);
StatefulRedisConnection<String, String> connection = client.connect();

Redis命令A(yù)PI的具體實(shí)現(xiàn)可以直接從StatefulRedisConnection實(shí)例獲取,見(jiàn)其接口定義:

public interface StatefulRedisConnection<K, V> extends StatefulConnection<K, V> {
  boolean isMulti();
  RedisCommands<K, V> sync();
  RedisAsyncCommands<K, V> async();
  RedisReactiveCommands<K, V> reactive();
} 

值得注意的是,在不指定編碼解碼器RedisCodec的前提下,RedisClient創(chuàng)建的StatefulRedisConnection實(shí)例一般是泛型實(shí)例StatefulRedisConnection<String,String>,也就是所有命令A(yù)PI的KEY和VALUE都是String類(lèi)型,這種使用方式能滿足大部分的使用場(chǎng)景。當(dāng)然,必要的時(shí)候可以定制編碼解碼器RedisCodec<K,V>。

同步API

先構(gòu)建RedisCommands實(shí)例

RedisCommands<String, String> redisCommands= connection.sync();
String pong = redisCommands.ping();
// 返回PONG
System.out.println("pong:" + pong);

SetArgs setArgs = SetArgs.Builder.nx().ex(5);
redisCommands.set("name", "throwable", setArgs);
String value = redisCommands.get("name");
System.out.println("name:" + value);

同步API在所有命令調(diào)用之后會(huì)立即返回結(jié)果。如果熟悉Jedis的話,RedisCommands的用法其實(shí)和它相差不大。

異步API

先構(gòu)建RedisAsyncCommands實(shí)例:

RedisAsyncCommands<String, String> redisCommands = connection.async();

基本使用:

RedisAsyncCommands<String, String> redisCommands = connection.async();
RedisFuture<String> redisFuture = redisCommands.ping();
// 返回PONG
System.out.println("pong:" + redisFuture.get());

SetArgs setArgs = SetArgs.Builder.nx().ex(5);
RedisFuture<String> future = redisCommands.set("name", "throwable", setArgs);
System.out.println("name:" + future.get());

RedisAsyncCommands所有方法執(zhí)行返回結(jié)果都是RedisFuture實(shí)例,而RedisFuture接口的定義如下:

public interface RedisFuture<V> extends CompletionStage<V>, Future<V> {
  String getError();
  boolean await(long timeout, TimeUnit unit) throws InterruptedException;
}  

也就是,RedisFuture可以無(wú)縫使用Future或者JDK1.8中引入的CompletableFuture提供的方法。

反應(yīng)式API

Lettuce引入的反應(yīng)式編程框架是Project Reactor,如果沒(méi)有反應(yīng)式編程經(jīng)驗(yàn)可以先自行了解一下Project Reactor。

構(gòu)建RedisReactiveCommands實(shí)例:

RedisReactiveCommands<String, String> redisCommands = connection.reactive();

根據(jù)Project Reactor,RedisReactiveCommands的方法如果返回的結(jié)果只包含0或1個(gè)元素,那么返回值類(lèi)型是Mono,如果返回的結(jié)果包含0到N(N大于0)個(gè)元素,那么返回值是Flux。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot用實(shí)體接收Get請(qǐng)求傳遞過(guò)來(lái)的多個(gè)參數(shù)的兩種方式

    SpringBoot用實(shí)體接收Get請(qǐng)求傳遞過(guò)來(lái)的多個(gè)參數(shù)的兩種方式

    本文主要介紹SpringBoot用實(shí)體接收Get請(qǐng)求傳遞過(guò)來(lái)的多個(gè)參數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • SpringBoot+Vue.js實(shí)現(xiàn)前后端分離的文件上傳功能

    SpringBoot+Vue.js實(shí)現(xiàn)前后端分離的文件上傳功能

    這篇文章主要介紹了SpringBoot+Vue.js實(shí)現(xiàn)前后端分離的文件上傳功能,需要的朋友可以參考下
    2018-06-06
  • 關(guān)于Java中你所不知道的Integer詳解

    關(guān)于Java中你所不知道的Integer詳解

    這篇文章主要給大家介紹了關(guān)于Java中你所不知道的一些關(guān)于Integer的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • Java JDBC基本使用方法詳解

    Java JDBC基本使用方法詳解

    這篇文章主要介紹了Java JDBC基本使用方法,結(jié)合實(shí)例形式詳細(xì)分析了java JDBC基本原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • Java基礎(chǔ)之自動(dòng)裝箱,注解操作示例

    Java基礎(chǔ)之自動(dòng)裝箱,注解操作示例

    這篇文章主要介紹了Java基礎(chǔ)之自動(dòng)裝箱,注解操作,結(jié)合實(shí)例形式分析了java拆箱、裝箱、靜態(tài)導(dǎo)入、注釋等相關(guān)使用技巧,需要的朋友可以參考下
    2019-08-08
  • Java ArrayList擴(kuò)容機(jī)制原理深入分析

    Java ArrayList擴(kuò)容機(jī)制原理深入分析

    在Java中,ArrayList是最常用的集合之一。它是一種容器,它的內(nèi)部定義了一個(gè)Object類(lèi)型的數(shù)組elementData,因此可用于存儲(chǔ)任意類(lèi)型的數(shù)據(jù)。我們知道,數(shù)組是長(zhǎng)度恒定的。而ArrayList相當(dāng)于是一個(gè)長(zhǎng)度可變的動(dòng)態(tài)數(shù)組,一起來(lái)看看的它的擴(kuò)容機(jī)制
    2023-02-02
  • Spring Boot實(shí)戰(zhàn)教程之自動(dòng)配置詳解

    Spring Boot實(shí)戰(zhàn)教程之自動(dòng)配置詳解

    Spring Boot的自動(dòng)配置給開(kāi)發(fā)者帶來(lái)了很大的便利,當(dāng)開(kāi)發(fā)人員在pom文件中添加starter依賴(lài)后,maven或者gradle會(huì)自動(dòng)下載很多jar包到classpath中。下面這篇文章主要給大家介紹了關(guān)于Spring Boot自動(dòng)配置的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-07-07
  • Springboot hibernate envers使用過(guò)程詳解

    Springboot hibernate envers使用過(guò)程詳解

    這篇文章主要介紹了Springboot hibernate envers使用過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • idea數(shù)據(jù)庫(kù)驅(qū)動(dòng)下載失敗的問(wèn)題及解決

    idea數(shù)據(jù)庫(kù)驅(qū)動(dòng)下載失敗的問(wèn)題及解決

    這篇文章主要介紹了idea數(shù)據(jù)庫(kù)驅(qū)動(dòng)下載失敗的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 淺談SpringBoot2.4 配置文件加載機(jī)制大變化

    淺談SpringBoot2.4 配置文件加載機(jī)制大變化

    這篇文章主要介紹了淺談SpringBoot2.4 配置文件加載機(jī)制大變化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評(píng)論