自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Jedis那么低性能,還在用?趕緊換上 lettuce 吧!

開(kāi)發(fā) 前端
Redisson 的宗旨是促進(jìn)使用者對(duì)Redis的關(guān)注分離(Separation of Concern),從而讓使用者能夠?qū)⒕Ω械胤旁谔幚順I(yè)務(wù)邏輯上。

在與 知識(shí)星球 的球友交流中,最近有很多小伙伴在面大廠, 經(jīng)常遇到下面的問(wèn)題:3大redis客戶端:Jedis、Redisson、Lettuce ,如何選型?

今天就來(lái)深入聊聊這個(gè)問(wèn)題

Redis 的3大 Java 客戶端組件

Redis 官方推薦的 Java 客戶端有Jedis、lettuce 和 Redisson。

客戶端組件1:Jedis

Jedis 是老牌的 Redis 的 Java 實(shí)現(xiàn)客戶端,提供了比較全面的 Redis 命令的支持、

Jedis 在線網(wǎng)址:http://tool.oschina.net/uploads/apidocs/redis/clients/jedis/Jedis.html

優(yōu)點(diǎn):

  • 支持全面的 Redis 操作特性(可以理解為API比較全面)。

缺點(diǎn):

  • 使用阻塞的 I/O,且其方法調(diào)用都是同步的,程序流需要等到 sockets 處理完 I/O 才能執(zhí)行,不支持異步;
  • Jedis 客戶端實(shí)例不是線程安全的,所以需要通過(guò)連接池來(lái)使用 Jedis。

客戶端組件2:Redisson

Redisson 是一個(gè)在 Redis 的基礎(chǔ)上實(shí)現(xiàn)的 Java 駐內(nèi)存數(shù)據(jù)網(wǎng)格(In-Memory Data Grid)。

Redisson 提供了使用Redis 的最簡(jiǎn)單和最便捷的方法。

它不僅提供了一系列的分布式的 Java 常用對(duì)象,還提供了許多分布式服務(wù)。

其中包括:

BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service)

Redisson 的宗旨是促進(jìn)使用者對(duì)Redis的關(guān)注分離(Separation of Concern),從而讓使用者能夠?qū)⒕Ω械胤旁谔幚順I(yè)務(wù)邏輯上。

redisson 官網(wǎng)地址:https://redisson.org/

redisson git項(xiàng)目地址:https://github.com/redisson/redisson

優(yōu)點(diǎn):

  • 使用者對(duì) Redis 的關(guān)注分離,可以類比 Spring 框架,這些框架搭建了應(yīng)用程序的基礎(chǔ)框架和功能,提升開(kāi)發(fā)效率,讓開(kāi)發(fā)者有更多的時(shí)間來(lái)關(guān)注業(yè)務(wù)邏輯;
  • 提供很多分布式相關(guān)操作服務(wù),例如,分布式鎖,分布式集合,可通過(guò)Redis支持延遲隊(duì)列等。
  • Redisson基于Netty框架的事件驅(qū)動(dòng)的通信層,其方法調(diào)用是異步的。
  • Redisson的API是線程安全的,所以可以操作單個(gè)Redisson連接來(lái)完成各種操作

缺點(diǎn):

  • Redisson 對(duì)字符串的操作支持比較差。

客戶端組件3:lettuce

lettuce ([?let?s]),是一種可擴(kuò)展的線程安全的 Redis 客戶端,支持異步模式。

如果避免阻塞和事務(wù)操作,如BLPOP和MULTI/EXEC,多個(gè)線程就可以共享一個(gè)連接。

lettuce 底層基于 Netty,支持高級(jí)的 Redis 特性,比如哨兵,集群,管道,自動(dòng)重新連接和Redis數(shù)據(jù)模型。

lettuce能夠支持redis4,需要java8及以上。

lettuce是基于netty實(shí)現(xiàn)的與redis進(jìn)行同步和異步的通信。

lettuce 官網(wǎng)地址:https://lettuce.io/

lettuce git項(xiàng)目地址:https://github.com/lettuce-io/lettuce-core

優(yōu)點(diǎn):

  • 支持同步異步通信模式;
  • Lettuce 的 API 是線程安全的,如果不是執(zhí)行阻塞和事務(wù)操作,如BLPOP和MULTI/EXEC,多個(gè)線程就可以共享一個(gè)連接。

lettuce、jedis、Redisson 三者比較

jedis使直接連接redis server,如果在多線程環(huán)境下是非線程安全的,這個(gè)時(shí)候只有使用連接池,為每個(gè)jedis實(shí)例增加物理連接;

lettuce的連接是基于Netty的,連接實(shí)例(StatefulRedisConnection)可以在多個(gè)線程間并發(fā)訪問(wèn),StatefulRedisConnection是線程安全的,所以一個(gè)連接實(shí)例可以滿足多線程環(huán)境下的并發(fā)訪問(wèn),當(dāng)然這也是可伸縮的設(shè)計(jì),一個(gè)連接實(shí)例不夠的情況也可以按需增加連接實(shí)例。

Jedis 和 lettuce 是比較純粹的 Redis 客戶端,幾乎沒(méi)提供什么高級(jí)功能。

Jedis 的性能比較差,所以如果你不需要使用 Redis 的高級(jí)功能的話,優(yōu)先推薦使用 lettuce。

Redisson實(shí)現(xiàn)了分布式和可擴(kuò)展的Java數(shù)據(jù)結(jié)構(gòu),和Jedis相比,功能較為簡(jiǎn)單,不支持字符串操作,不支持排序、事務(wù)、管道、分區(qū)等Redis特性。

Redisson的宗旨是促進(jìn)使用者對(duì)Redis的關(guān)注分離,從而讓使用者能夠?qū)⒕Ω械胤旁谔幚順I(yè)務(wù)邏輯上。

如果需要分布式鎖,分布式集合等分布式的高級(jí)特性,添加Redisson結(jié)合使用,因?yàn)镽edisson本身對(duì)字符串的操作支持很差。

Redisson 的優(yōu)勢(shì)是提供了很多開(kāi)箱即用的 Redis 高級(jí)功能,如果你的應(yīng)用中需要使用到 Redis 的高級(jí)功能,建議使用 Redisson。

具體 Redisson 的高級(jí)功能可以參考:https://redisson.org/

使用建議

建議:lettuce + Redisson

在spring boot2之后,redis連接默認(rèn)就采用了lettuce。

就想 spring  的本地緩存,默認(rèn)使用Caffeine一樣,

這就一定程度說(shuō)明了,lettuce 比 Jedis在性能的更加優(yōu)秀。

生產(chǎn)問(wèn)題

問(wèn)題1 鏈接斷裂怎么辦?

小伙伴問(wèn)題1 鏈接斷裂怎么辦?

具體問(wèn)題:Jedis有心跳 能保持長(zhǎng)連接,lettuce好像沒(méi)有心跳。阿里ecs 搭的redis tcp長(zhǎng)時(shí)間沒(méi)有傳輸 就會(huì)斷開(kāi) ,但是lettuce感知不到, 再執(zhí)行redis請(qǐng)求就會(huì)提示鏈接不可用

具體來(lái)說(shuō),可以通過(guò)用netty的空閑檢測(cè)機(jī)制來(lái)維持連接。

注意:是空閑檢測(cè) 不是心跳機(jī)制。

什么是心跳機(jī)制

心跳是在TCP長(zhǎng)連接中,客戶端和服務(wù)端定時(shí)向?qū)Ψ桨l(fā)送數(shù)據(jù)包通知對(duì)方自己還在線,保證連接的有效性的一種機(jī)制。在服務(wù)器和客戶端之間一定時(shí)間內(nèi)沒(méi)有數(shù)據(jù)交互時(shí), 即處于 idle 狀態(tài)時(shí), 客戶端或服務(wù)器會(huì)發(fā)送一個(gè)特殊的數(shù)據(jù)包給對(duì)方, 當(dāng)接收方收到這個(gè)數(shù)據(jù)報(bào)文后, 也立即發(fā)送一個(gè)特殊的數(shù)據(jù)報(bào)文, 回應(yīng)發(fā)送方, 此即一個(gè) PING-PONG 交互.

自然地, 當(dāng)某一端收到心跳消息后, 就知道了對(duì)方仍然在線, 這就確保 TCP 連接的有效性.

空閑檢測(cè) 是心跳的基礎(chǔ)機(jī)制。

什么是空閑檢測(cè)

就是檢測(cè)通道中的讀寫數(shù)據(jù)包,如果一段時(shí)間內(nèi),沒(méi)有收到讀寫數(shù)據(jù)包,就會(huì)出發(fā)  IdleStateEvent 空閑狀態(tài)事件。

所以,可以借助這個(gè)機(jī)制,主動(dòng)關(guān)閉 空閑的、被異常斷開(kāi)的連接。

這就需要大家,熟悉Netty的開(kāi)發(fā)和源碼,關(guān)于Netty源碼和開(kāi)發(fā)的內(nèi)容,請(qǐng)參見(jiàn)《java高并發(fā)核心編程卷1加強(qiáng)版》 ,很多小伙伴,就是通過(guò)此書掌握的。

最后,奉上問(wèn)題解決的參考代碼:

import io.lettuce.core.resource.ClientResources;
import io.lettuce.core.resource.NettyCustomizer;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.timeout.IdleStateEvent;
import io.netty.handler.timeout.IdleStateHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ClientConfig {

@Bean
public ClientResources clientResources(){

NettyCustomizer nettyCustomizer = new NettyCustomizer() {

@Override
public void afterChannelInitialized(Channel channel) {
channel.pipeline().addLast(
//此處事件必須小于超時(shí)時(shí)間
new IdleStateHandler(40, 0, 0));
channel.pipeline().addLast(new ChannelDuplexHandler() {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
ctx.disconnect();
}
}
});
}

@Override
public void afterBootstrapInitialized(Bootstrap bootstrap) {

}

};
//替換掉 NettyCustomizer 通道初始化處理器
return ClientResources.builder().nettyCustomizer(nettyCustomizer ).build();
}
}

寫在最后

這個(gè)組件,是一個(gè)新的組件,性能比 jedis 高太多,很多小伙伴一樣用起來(lái)了。

趕緊用起來(lái),要不然,技術(shù)水平又落到上個(gè)時(shí)代去了。

責(zé)任編輯:武曉燕 來(lái)源: 碼猿技術(shù)專欄
相關(guān)推薦

2024-10-28 10:55:50

Jedis組件客戶端

2021-12-06 17:44:56

MHAMySQL高可用

2020-12-07 05:50:54

print()Python代碼

2019-09-21 21:32:34

數(shù)據(jù)庫(kù)SQL分布式

2025-04-02 08:47:23

DOM文檔結(jié)構(gòu)API

2023-01-05 09:33:38

低代碼高性能引擎

2013-04-18 09:43:34

碼農(nóng)網(wǎng)站網(wǎng)站設(shè)計(jì)

2024-06-19 10:01:50

2012-07-19 10:03:32

2023-11-20 16:19:02

Redis數(shù)據(jù)庫(kù)

2021-06-10 10:33:22

Jenkins持續(xù)集成工具自動(dòng)化

2024-03-11 08:21:49

2024-11-12 16:28:34

2021-04-21 10:36:47

StringBuildJava8StringJoine

2021-08-16 10:05:57

GitHub代碼開(kāi)發(fā)者

2021-09-17 13:34:57

大數(shù)據(jù)Redis 應(yīng)用

2009-12-03 08:57:18

Windows 7圣誕主題

2012-03-27 09:20:57

Java

2020-11-18 09:37:07

程序員技術(shù)996

2021-10-14 18:15:38

BeanUtils對(duì)象生成器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)