 Java Redis 客戶端快速上手:同步、異步與響應(yīng)式 API 實(shí)戰(zhàn)指南)
數(shù)據(jù)庫(kù)后端緩存【免費(fèi)下載鏈接】lettuce-coreRedis Java client項(xiàng)目地址https://gitcode.com/gh_mirrors/le/lettuce-core點(diǎn)擊查看免費(fèi)下載Lettuce 是一個(gè)可擴(kuò)展、線程安全的 Java Redis 客戶端同時(shí)支持同步synchronous、異步asynchronous與響應(yīng)式reactive三種執(zhí)行模型底層基于 Netty 構(gòu)建并原生支持 Sentinel、Cluster、Pipelining、自動(dòng)重連及 Redis 數(shù)據(jù)模型等高級(jí)特性。閱讀本文后你將能夠完成 Lettuce 的依賴引入、連接創(chuàng)建與基礎(chǔ)命令調(diào)用掌握同步/異步/響應(yīng)式三種 API 的核心用法與差異并了解 Pub/Sub、RedisURI 連接配置以及如何從源碼構(gòu)建測(cè)試該項(xiàng)目。項(xiàng)目概覽一個(gè)連接三種執(zhí)行模型Lettuce 的核心設(shè)計(jì)理念是可擴(kuò)展且線程安全。官方文檔與 RedisClient 類源碼 均明確指出多個(gè)線程可以共享同一條連接前提是這些線程避免阻塞型操作如BLPOP和事務(wù)型操作如MULTI/EXEC。從 pom.xml 可以看到本項(xiàng)目當(dāng)前版本為7.9.0-SNAPSHOT底層依賴 Netty4.2.17.Final與 Reactor3.8.7這也是其能夠同時(shí)提供阻塞式調(diào)用和響應(yīng)式流Reactive Streams支持的基礎(chǔ)。Lettuce 支持的核心能力包括同步、異步、響應(yīng)式三種 API同一連接上通過(guò)sync()、async()、reactive()三個(gè)訪問(wèn)器切換執(zhí)行模型互不沖突高可用方案Redis Sentinel、Redis Cluster連接安全與形態(tài)SSL / TLS、Unix Domain Socket流式 APIStreaming API以回調(diào)方式逐條消費(fèi)大數(shù)據(jù)量結(jié)果編解碼器Codecs自定義 key/value 的 UTF-8、二進(jìn)制、JSON 等序列化表示動(dòng)態(tài)命令接口Command Interfaces以類型安全的方式聲明式調(diào)用 Redis 命令原生傳輸Native TransportsEpoll、Kqueue 等Redis 模塊支持RediSearch、RedisJSON、Redis Vector Sets、Bloom Filter、TDigest、TopK、Cuckoo Filter 等兼容性兼容 Java 8以隱式自動(dòng)模塊方式提供無(wú) module descriptor。引入依賴Maven 坐標(biāo)與快照倉(cāng)庫(kù)Lettuce 的正式版本發(fā)布在 Maven Central 倉(cāng)庫(kù)。以 Maven 為例在pom.xml中添加如下依賴dependency groupIdio.lettuce/groupId artifactIdlettuce-core/artifactId versionx.y.z/version /dependency其中x.y.z替換為實(shí)際使用的發(fā)布版本號(hào)例如當(dāng)前源碼對(duì)應(yīng)的主線版本為7.9.0-SNAPSHOT。如果你希望使用下一個(gè)大版本的每日構(gòu)建快照可以使用 Sonatype 快照倉(cāng)庫(kù)并聲明BUILD-SNAPSHOT版本dependency groupIdio.lettuce/groupId artifactIdlettuce-core/artifactId versionx.y.z.BUILD-SNAPSHOT/version /dependency repositories repository idsonatype-snapshots/id nameSonatype Snapshot Repository/name urlhttps://oss.sonatype.org/content/repositories/snapshots//url snapshots enabledtrue/enabled /snapshots /repository /repositories注意快照版本不穩(wěn)定僅建議在嘗鮮新特性或參與上游開(kāi)發(fā)時(shí)使用生產(chǎn)環(huán)境請(qǐng)鎖定 Maven Central 上的正式發(fā)布版本?;A(chǔ)用法同步 API 與連接生命周期Lettuce 的最基本用法只需要三步創(chuàng)建客戶端、建立連接、獲取命令 API 并執(zhí)行命令。官方 README 給出了最精簡(jiǎn)的示例RedisClient client RedisClient.create(redis://localhost); StatefulRedisConnectionString, String connection client.connect(); RedisStringCommands sync connection.sync(); String value sync.get(key);更完整的寫(xiě)法含泛型與資源釋放可以參照倉(cāng)庫(kù)中的官方示例 ConnectToRedis.java// Syntax: redis://[password]host[:port][/databaseNumber] // Syntax: redis://[username:password]host[:port][/databaseNumber] RedisClient redisClient RedisClient.create(redis://passwordlocalhost:6379/0); StatefulRedisConnectionString, String connection redisClient.connect(); // 通過(guò) sync() 獲取同步命令 API RedisStringCommandsString, String sync connection.sync(); String value sync.get(key); connection.close(); redisClient.shutdown();命令命名約定Lettuce 中每個(gè) Redis 命令都由一個(gè)或多個(gè)方法實(shí)現(xiàn)方法名與 Redis 命令的小寫(xiě)名稱完全一致。對(duì)于帶多個(gè)修飾符、會(huì)改變結(jié)果類型的復(fù)雜命令其修飾符以駝峰形式拼接到命令名中例如zrangebyscore按分?jǐn)?shù)區(qū)間返回成員zrangebyscoreWithScores同樣命令但附帶分?jǐn)?shù)返回。也就是說(shuō)方法名本身既是命令名也是結(jié)果形態(tài)的說(shuō)明書(shū)。連接是昂貴的資源RedisClient 的類注釋 特別提醒RedisClient是一種昂貴資源它持有 Netty 的EventLoopGroup內(nèi)部使用多個(gè)線程。因此盡量復(fù)用同一個(gè)RedisClient實(shí)例或者在多個(gè) client 實(shí)例之間共享一個(gè)ClientResources實(shí)例連接StatefulRedisConnection是線程安全的可被多線程共享詳見(jiàn) StatefulRedisConnection 接口。自動(dòng)重連機(jī)制StatefulRedisConnection內(nèi)部有一個(gè)ConnectionWatchdog監(jiān)控每條連接在close()被調(diào)用之前會(huì)自動(dòng)重連所有尚未完成的命令在重連成功后會(huì)重新發(fā)送。這正是 Lettuce 在故障場(chǎng)景下保持高可用的底層保障。異步 APIRedisFuture 與 LettuceFutures異步 API 通過(guò)connection.async()獲得每個(gè)命令立即返回一個(gè)RedisFutureT繼承自 JDK 的CompletionStage可以組合、編排而不會(huì)阻塞調(diào)用線程StatefulRedisConnectionString, String connection client.connect(); RedisStringAsyncCommandsString, String async connection.async(); RedisFutureString set async.set(key, value); RedisFutureString get async.get(key); // 等待多個(gè) future 全部完成 LettuceFutures.awaitAll(set, get) true set.get() OK get.get() valueLettuceFutures 工具類LettuceFutures是異步編程的配套工具源碼位于 LettuceFutures.java提供兩個(gè)關(guān)鍵方法awaitAll(Duration timeout, Future?... futures)/awaitAll(long timeout, TimeUnit unit, Future?... futures)等待所有 future 在超時(shí)前完成若全部按時(shí)完成返回true否則返回false。超時(shí)時(shí)不會(huì)取消命令。awaitOrCancel(RedisFutureT cmd, long timeout, TimeUnit unit)等待單個(gè)命令完成超時(shí)則取消命令。倉(cāng)庫(kù)測(cè)試代碼中也實(shí)際使用了該工具例如 RediSearchIntegrationTests.java 中的批量等待assertThat(LettuceFutures.awaitAll(Duration.ofSeconds(60), futures.toArray(new RedisFuture[0]))).isTrue();與Future.get()直接阻塞不同異步 API 的價(jià)值在于可以在等待 I/O 的同時(shí)做其他工作或?qū)⒍鄠€(gè)命令的結(jié)果通過(guò)thenApply、thenCombine等CompletionStage操作組合起來(lái)。詳細(xì)的異步編程指南見(jiàn) 異步 API 文檔。響應(yīng)式 APIMono 與 Flux響應(yīng)式 API 通過(guò)connection.reactive()獲得基于 Reactor 的MonoT單個(gè)結(jié)果與FluxT流式多個(gè)結(jié)果StatefulRedisConnectionString, String connection client.connect(); RedisStringReactiveCommandsString, String reactive connection.reactive(); MonoString set reactive.set(key, value); MonoString get reactive.get(key); set.subscribe(); get.block() value響應(yīng)式模型的核心特征是背壓backpressure與訂閱即執(zhí)行MonoString set的創(chuàng)建并不立即發(fā)送命令只有subscribe()后命令才會(huì)真正執(zhí)行。在真實(shí)應(yīng)用中更推薦使用map、flatMap、zip等操作符組合多個(gè)命令并將最終結(jié)果交給上層訂閱者消費(fèi)。需要留意的是從 StatefulRedisConnection 的源碼注釋可知reactive()訪問(wèn)器自 7.8 起已被標(biāo)記為Deprecated計(jì)劃在未來(lái)大版本中由commands(CommandsFactory)配合RedisReactiveCommands#factory()取代在 Lettuce 7.x 中它仍可正常使用。響應(yīng)式編程的完整講解見(jiàn) 響應(yīng)式 API 文檔。Pub/Sub 發(fā)布訂閱Lettuce 通過(guò)獨(dú)立的 Pub/Sub 連接提供發(fā)布訂閱能力。與普通連接不同Pub/Sub 連接需要先注冊(cè)監(jiān)聽(tīng)器Listener再訂閱頻道消息到達(dá)時(shí)由監(jiān)聽(tīng)器回調(diào)RedisPubSubCommandsString, String connection client.connectPubSub().sync(); connection.getStatefulConnection().addListener(new RedisPubSubListenerString, String() { // 實(shí)現(xiàn) message / subscribed / unsubscribed 等回調(diào) }); connection.subscribe(channel);監(jiān)聽(tīng)器回調(diào)接口RedisPubSubListener 定義了以下核心回調(diào)message(K channel, V message)收到普通頻道消息message(K pattern, K channel, V message)收到模式pattern匹配的消息subscribed(K channel, long count)/psubscribed(K pattern, long count)訂閱成功count 為當(dāng)前訂閱總數(shù)unsubscribed(K channel, long count)/punsubscribed(K pattern, long count)退訂成功ssubscribed/sunsubscribed自 6.4 起新增的 Shard Channel 訂閱/退訂回調(diào)默認(rèn)委托給subscribed/unsubscribed。訂閱命令RedisPubSubCommands 接口 提供的訂閱命令與 Redis 一一對(duì)應(yīng)方法對(duì)應(yīng) Redis 命令說(shuō)明subscribe(K... channels)SUBSCRIBE訂閱指定頻道unsubscribe(K... channels)UNSUBSCRIBE退訂指定頻道psubscribe(K... patterns)PSUBSCRIBE訂閱匹配模式的頻道punsubscribe(K... patterns)PUNSUBSCRIBE退訂匹配模式的頻道ssubscribe(K... shardChannels)SSUBSCRIBE訂閱 Shard 頻道6.4sunsubscribe(K... shardChannels)SUNSUBSCRIBE退訂 Shard 頻道6.4連接配置RedisURI 的創(chuàng)建與語(yǔ)法無(wú)論是 Standalone、Sentinel 還是 Cluster連接細(xì)節(jié)的統(tǒng)一載體都是RedisURI源碼見(jiàn) RedisURI.java它可以在其中攜帶數(shù)據(jù)庫(kù)編號(hào)、客戶端名、密碼和超時(shí)等配置。RedisURI有三種創(chuàng)建方式// 1. 使用 URI 字符串 RedisURI.create(redis://localhost/); // 2. 使用 Builder RedisURI.Builder.redis(localhost, 6379).withPassword(password).withDatabase(1).build(); // 3. 直接構(gòu)造實(shí)例 RedisURI uri new RedisURI(localhost, 6379, Duration.ofSeconds(60)); // 或 RedisURI uri new RedisURI(); uri.setHost(localhost);URI 語(yǔ)法RedisURI支持 Standalone、SSL、Unix Domain Socket、Sentinel 等多種連接形態(tài)其 URI 語(yǔ)法由源碼注釋明確定義Redis Standaloneredis://[[username:]password]host[:port][/database] [?[timeouttimeout[d|h|m|s|ms|us|ns]][databasedatabase] [clientNameclientName][libraryNamelibraryName][libraryVersionlibraryVersion] [verifyPeerNONE|CA|FULL]]Redis StandaloneSSL使用rediss://前綴語(yǔ)法同上。Redis StandaloneUnix Domain Socketredis-socket://[[username:]password]path [?[timeout...][databasedatabase][clientNameclientName]...]Redis Sentinelredis-sentinel://[[username:]password]host1[:port1][,host2[:port2]][,hostN[:portN]][/database] [?[timeout...][sentinelMasterIdsentinelMasterId][databasedatabase]...]支持的 Scheme 一覽Scheme用途redisRedis StandaloneredissRedis Standalone SSLredis-socketRedis Standalone Unix Domain Socketredis-sentinelRedis Sentinelrediss-sentinelRedis Sentinel SSL源碼中同時(shí)保留了redisssl、redistls等別名 Scheme 常量。超時(shí)單位URI 中的timeout參數(shù)支持多種時(shí)間單位后綴d天、h小時(shí)、m分鐘、s秒、ms毫秒、us微秒、ns納秒。使用要點(diǎn)database 優(yōu)先級(jí)查詢參數(shù)?后中的database優(yōu)先級(jí)高于路徑中的/databaseSentinel 認(rèn)證URI 中的密碼只作用于數(shù)據(jù)節(jié)點(diǎn)Sentinel 節(jié)點(diǎn)的認(rèn)證需要對(duì)每個(gè)哨兵節(jié)點(diǎn)單獨(dú)配置用戶名Redis 6 起才支持用戶名庫(kù)名與庫(kù)版本在 Redis 7.2 上會(huì)自動(dòng)設(shè)置libraryName/libraryVersion默認(rèn)取 LettuceVersion 中的版本信息。高級(jí)能力速覽Redis Cluster 與 Sentinel集群場(chǎng)景使用RedisClusterClient源碼同樣提供同步/異步/響應(yīng)式 API。集群客戶端按命令首個(gè) key 計(jì)算槽位并路由到對(duì)應(yīng)節(jié)點(diǎn)維護(hù)集群分區(qū)視圖。倉(cāng)庫(kù)官方示例 ConnectToRedisCluster.java 展示了基本連接方式。需要說(shuō)明的是集群連接上不建議使用MULTI/EXEC/DISCARD等無(wú) key 的事務(wù)命令——它們無(wú)法被分配到特定節(jié)點(diǎn)。Sentinel / 主從高可用場(chǎng)景參見(jiàn) ha-sharding.md。流式 APIStreaming API對(duì)于結(jié)果集巨大的命令如SCAN、HGETALL的大批量數(shù)據(jù)Lettuce 提供StreamingChannel回調(diào)接口使數(shù)據(jù)以流的方式逐條輸出避免一次性在內(nèi)存中堆積。詳見(jiàn) streaming-api.md。Codecs 編解碼器通過(guò)client.connect(RedisCodec)可傳入自定義編解碼器控制 key/value 在 UTF-8、二進(jìn)制、JSON 等表示形式之間的轉(zhuǎn)換。內(nèi)置StringCodec、ByteArrayCodec、CompressionCodec、CipherCodec等見(jiàn) codec 包。Codecs 的接入方式詳見(jiàn) integration-extension.md。動(dòng)態(tài)命令接口Command Interfaces除 190 條內(nèi)置命令外Lettuce 還允許你通過(guò)聲明接口來(lái)自定義類型安全的命令調(diào)用減少樣板代碼。核心是Commands標(biāo)記接口例如public interface KeyCommands extends Commands { String get(String key); String set(String key, String value); String set(String key, byte[] value); }接口中方法名即命令名、參數(shù)即命令參數(shù)、返回類型即結(jié)果形態(tài)。完整的聲明式調(diào)用機(jī)制見(jiàn) redis-command-interfaces.md。原生傳輸與 Redis 模塊Epoll / Kqueue 原生傳輸可在 Linux/macOS 上獲得更好的性能見(jiàn) native-transports.md模塊支持RediSearchredis-search.md、RedisJSONredis-json.md、Vector Setsvector-sets.md等相應(yīng)命令構(gòu)建器位于 search、json、vector 包下。從源碼構(gòu)建與測(cè)試Lettuce 使用 Apache Maven 構(gòu)建。其測(cè)試需要多個(gè)運(yùn)行中的 Redis 實(shí)例實(shí)例的啟停通過(guò)倉(cāng)庫(kù)根目錄的 Makefile 統(tǒng)一編排底層基于 Docker Compose測(cè)試環(huán)境定義見(jiàn)src/test/resources/docker-env/。當(dāng)前源碼默認(rèn)測(cè)試目標(biāo)是 Redis8.10同時(shí)支持8.12、8.8、8.6、8.4、8.2、8.0、7.4、7.2等版本見(jiàn) Makefile。構(gòu)建流程如下git clone https://gitcode.com/gh_mirrors/le/lettuce-core cd lettuce-core make start # 啟動(dòng)測(cè)試用 Redis 環(huán)境 make test # 運(yùn)行構(gòu)建與測(cè)試等價(jià)于 mvn -DskipITsfalse clean compile verify常用命令make test運(yùn)行完整構(gòu)建與測(cè)試make start手動(dòng)啟動(dòng) Redis 測(cè)試環(huán)境make stop手動(dòng)停止 Redis 測(cè)試環(huán)境make clean清理構(gòu)建產(chǎn)物。如果你已經(jīng)有本地 Redis也可以直接使用 Maven 運(yùn)行單元測(cè)試集成測(cè)試默認(rèn)通過(guò)skipITs跳過(guò)見(jiàn) pom.xml。結(jié)語(yǔ)Lettuce 以一個(gè)線程安全連接承載三種執(zhí)行模型為核心設(shè)計(jì)覆蓋了從單機(jī)、主從、哨兵到集群的完整 Redis 部署形態(tài)并提供 Codec、流式 API、動(dòng)態(tài)命令接口、模塊命令等豐富的擴(kuò)展機(jī)制。本文所述的入門路徑——引入依賴、創(chuàng)建連接、選擇sync()/async()/reactive()、按命令命名約定調(diào)用——即可支撐大部分日常開(kāi)發(fā)場(chǎng)景。深入閱讀可繼續(xù)參考倉(cāng)庫(kù)中的 connecting-redis.md、async-api.md、reactive-api.md 與 faq.md 等文檔。贊分享數(shù)據(jù)庫(kù)后端緩存【免費(fèi)下載鏈接】lettuce-coreRedis Java client項(xiàng)目地址https://gitcode.com/gh_mirrors/le/lettuce-core點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Python異步Redis客戶端終極指南快速上手與實(shí)戰(zhàn)應(yīng)用Python異步Redis客戶端終極指南快速上手與實(shí)戰(zhàn)應(yīng)用 在現(xiàn)代Web開(kāi)發(fā)中異步編程已經(jīng)成為提升應(yīng)用性能的關(guān)鍵技術(shù)。Python異步Redis客戶端通過(guò)結(jié)后端Lettuce-core 響應(yīng)式 API 終極指南構(gòu)建高性能異步 Redis 應(yīng)用 Lettuce core 響應(yīng)式 API 終極指南構(gòu)建高性能異步 Redis 應(yīng)用 Lettuce 是一個(gè)高級(jí)的 Java Redis 客戶端支持線程數(shù)據(jù)庫(kù)后端緩存python-binance 快速上手Binance REST API v3 同步 / 異步客戶端與 WebSocket 深度緩存實(shí)戰(zhàn)python binance 快速上手Binance REST API v3 同步 / 異步客戶端與 WebSocket 深度緩存實(shí)戰(zhàn) python bina金融科技上一篇Wand-Enhancer為WeMod用戶提供的高級(jí)本地化體驗(yàn)增強(qiáng)實(shí)踐下一篇3分鐘解鎖WeMod專業(yè)版Wand-Enhancer終極免費(fèi)方案指南創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考