chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Redis工具集的實(shí)現(xiàn)和使用

jf_ro2CN3Fa ? 來(lái)源:稀土掘金技術(shù)社區(qū) ? 2023-12-03 17:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1 前言

Redis 基本上是互聯(lián)網(wǎng)公司必備的工具了,Redis的應(yīng)用場(chǎng)景實(shí)在太多了,但是有很多相似的功能如果每個(gè)項(xiàng)目都要實(shí)現(xiàn)一遍就顯得太麻煩了,所以為了方便,我打算開(kāi)發(fā)一個(gè)基于 Redis 的工具集,盡量做到開(kāi)箱即用。

2 目前實(shí)現(xiàn)功能

這個(gè)工具集并沒(méi)有開(kāi)發(fā)完成,實(shí)現(xiàn)了部分功能,如下圖

8577182e-91bd-11ee-939d-92fbcf53809c.png

簡(jiǎn)單介紹下已經(jīng)實(shí)現(xiàn)的模塊:

common : 整個(gè)項(xiàng)目公共模塊,比如AOP工具等;

delay: Redis實(shí)現(xiàn)的延遲隊(duì)列;

lock: Redis實(shí)現(xiàn)的分布式鎖;

mq: Redis實(shí)現(xiàn)消息隊(duì)列;

query: Redis實(shí)現(xiàn)分頁(yè)模糊查詢(xún);

web: Redis實(shí)現(xiàn)web相關(guān)的功能;

duplicate :防止重復(fù)提交;

以上的這些模塊都是已經(jīng)實(shí)現(xiàn)的了,還有 社交、限流、冪等相關(guān)功能后面會(huì)陸續(xù)實(shí)現(xiàn)。

3 如何使用

1.引入 Maven 依賴(lài)

目前可以下載代碼上傳到自己的私服或者本地倉(cāng)庫(kù),后面會(huì)推到 Maven 中央倉(cāng)庫(kù)


cn.org.wangchangjiu
redis-util-spring-boot-starter
1.0.0-SNAPSHOT

2.配置文件(application.yaml)開(kāi)啟各模塊功能開(kāi)關(guān)

redis:
util:
mq:
enable:true
delay:
enable:true

3.實(shí)現(xiàn)消息發(fā)送者

MQ消息發(fā)送:

858caa4a-91bd-11ee-939d-92fbcf53809c.png

延遲消息發(fā)送:

85a23932-91bd-11ee-939d-92fbcf53809c.png

4.實(shí)現(xiàn)消息監(jiān)聽(tīng)器

MQ消息監(jiān)聽(tīng)器:

85c4f9fe-91bd-11ee-939d-92fbcf53809c.png

延遲消息監(jiān)聽(tīng)器:

85d4b9d4-91bd-11ee-939d-92fbcf53809c.png

4 MQ和delay實(shí)現(xiàn)細(xì)節(jié)

MQ實(shí)現(xiàn)細(xì)節(jié)

容器啟動(dòng)時(shí),簡(jiǎn)單來(lái)說(shuō)就是通過(guò)springboot自動(dòng)裝配,創(chuàng)建一些Bean,如下圖:

85f415c2-91bd-11ee-939d-92fbcf53809c.png

值得注意的是,springboot3.X 自動(dòng)裝配方式有點(diǎn)變化,需要?jiǎng)?chuàng)建文件 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,文件內(nèi)容就直接寫(xiě) 自動(dòng)配置類(lèi)

8611a2cc-91bd-11ee-939d-92fbcf53809c.png

RedisUtilAutoConfiguration 主自動(dòng)裝配類(lèi)會(huì) import 各個(gè)模塊的自動(dòng)裝配類(lèi):

8621012c-91bd-11ee-939d-92fbcf53809c.png

我們以 RedisStreamAutoConfiguration 為例:

864536d2-91bd-11ee-939d-92fbcf53809c.png

該裝配類(lèi)生效需要顯示打開(kāi),然后就是創(chuàng)建各種Bean。

最主要的Bean有:

RedisMessageConsumerManager:

865c99da-91bd-11ee-939d-92fbcf53809c.png

該Bean實(shí)現(xiàn)了 BeanPostProcessor 接口,主要作用是,獲取被注解 RedisMessageListener 修飾的方法,把信息封裝在 RedisMessageConsumerContainer 對(duì)象里,方便后面反射調(diào)用。

8668f98c-91bd-11ee-939d-92fbcf53809c.png

StreamMessageListenerContainer:

這個(gè)Bean主要是做 redis MQ 的配置,比如配置:一次最多獲取多少條消息、沒(méi)有消息時(shí)阻塞時(shí)間、執(zhí)行任務(wù)的executor、錯(cuò)誤處理器、以及消費(fèi)組、是否自動(dòng)ACK等配置,具體代碼如下:

@Bean(initMethod="start",destroyMethod="stop")
@DependsOn("redisMessageConsumerManager")
@ConditionalOnMissingBean
publicStreamMessageListenerContainer>streamMessageListenerContainer(@AutowiredRedisMessageConsumerManagerredisMessageConsumerManager,
@AutowiredRedisConnectionFactoryredisConnectionFactory,
@AutowiredErrorHandlererrorHandler){
MyRedisStreamProperties.Optionsoptions=myRedisStreamProperties.getOptions();
StreamMessageListenerContainer.StreamMessageListenerContainerOptions>containerOptions=
StreamMessageListenerContainer.StreamMessageListenerContainerOptions
.builder()
//一次最多獲取多少條消息
.batchSize(options.getBatchSize())
//運(yùn)行Stream的polltask
.executor(getStreamMessageListenerExecutor())
//Stream中沒(méi)有消息時(shí),阻塞多長(zhǎng)時(shí)間,需要比`spring.redis.timeout`的時(shí)間小
.pollTimeout(options.getPollTimeout())
//獲取消息的過(guò)程或獲取到消息給具體的消息者處理的過(guò)程中,發(fā)生了異常的處理
.errorHandler(errorHandler)
.build();

StreamMessageListenerContainer>streamMessageListenerContainer=
StreamMessageListenerContainer.create(redisConnectionFactory,containerOptions);

//獲取被RedisMessageListener注解修飾的bean
MapconsumerContainerGroups=
redisMessageConsumerManager.getConsumerContainerGroups();

//循環(huán)遍歷,創(chuàng)建消費(fèi)組
consumerContainerGroups.forEach((groupQueue,redisMessageConsumerContainer)->{
String[]groupQueues=groupQueue.split("#");

//創(chuàng)建消費(fèi)組
createGroups(groupQueues);

RedisMessageListenerredisMessageListener=redisMessageConsumerContainer.getRedisMessageListener();
if(!redisMessageListener.useGroup()){
//獨(dú)立消費(fèi)不使用組
streamMessageListenerContainer.receive(StreamOffset.fromStart(groupQueues[1]),newDefaultGroupStreamListener(redisMessageConsumerContainer));
}else{
//消費(fèi)組消費(fèi)
if(redisMessageListener.autoAck()){
//自動(dòng)ACK
streamMessageListenerContainer.receiveAutoAck(Consumer.from(groupQueues[0],"consumer:"+UUID.randomUUID()),
StreamOffset.create(groupQueues[1],ReadOffset.lastConsumed()),newDefaultGroupStreamListener(redisMessageConsumerContainer));
}else{
//手動(dòng)ACK
streamMessageListenerContainer.receive(Consumer.from(groupQueues[0],"consumer:"+UUID.randomUUID()),
StreamOffset.create(groupQueues[1],ReadOffset.lastConsumed()),newDefaultGroupStreamListener(redisMessageConsumerContainer));
}
}
});
returnstreamMessageListenerContainer;
}

/**
*創(chuàng)建消費(fèi)組
*@paramgroupQueues
*/
privatevoidcreateGroups(String[]groupQueues){
//判斷是否存在隊(duì)列Key
if(stringRedisTemplate.hasKey(groupQueues[1])){
//獲取消費(fèi)組沒(méi)有則創(chuàng)建
StreamInfo.XInfoGroupsgroups=stringRedisTemplate.opsForStream().groups(groupQueues[1]);
if(groups.isEmpty()){
stringRedisTemplate.opsForStream().createGroup(groupQueues[1],groupQueues[0]);
}else{
AtomicBooleanexists=newAtomicBoolean(false);
groups.forEach(xInfoGroup->{
if(xInfoGroup.groupName().equals(groupQueues[0])){
exists.set(true);
}
});
if(!exists.get()){
stringRedisTemplate.opsForStream().createGroup(groupQueues[1],groupQueues[0]);
}
}
}else{
stringRedisTemplate.opsForStream().createGroup(groupQueues[1],groupQueues[0]);
}
}

//todo后面這個(gè)線程池也可以交由用戶(hù)配置
privateExecutorgetStreamMessageListenerExecutor(){
AtomicIntegerindex=newAtomicInteger(1);
intprocessors=Runtime.getRuntime().availableProcessors();
ThreadPoolExecutorexecutor=newThreadPoolExecutor(processors,processors,0,TimeUnit.SECONDS,
newLinkedBlockingDeque<>(),r->{
Threadthread=newThread(r);
thread.setName("async-stream-consumer-"+index.getAndIncrement());
thread.setDaemon(true);
returnthread;
});
returnexecutor;
}

發(fā)送消息流程:

8680490c-91bd-11ee-939d-92fbcf53809c.png

redis 延遲隊(duì)列的實(shí)現(xiàn)原理和這個(gè)差不多,主要是 redission延遲隊(duì)列 + 自定義注解 + 反射,代碼都差不多。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4956

    瀏覽量

    73490
  • 隊(duì)列
    +關(guān)注

    關(guān)注

    1

    文章

    46

    瀏覽量

    11204
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    390

    瀏覽量

    12131

原文標(biāo)題:為了方便開(kāi)發(fā),我打算實(shí)現(xiàn)一個(gè)Redis 工具集

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Redis的LRU實(shí)現(xiàn)和應(yīng)用

    在編程中,計(jì)數(shù)器是一種基本但強(qiáng)大的工具,用于跟蹤和管理數(shù)據(jù)和資源。本文將深入探討不同類(lèi)型的計(jì)數(shù)器的應(yīng)用,從Redis的LRU(最近最少使用)緩存淘汰算法的實(shí)現(xiàn),到如何在內(nèi)存受限的環(huán)境中有效地使用計(jì)數(shù)器,再到普通計(jì)數(shù)器的巧妙應(yīng)用。
    的頭像 發(fā)表于 12-15 09:24 ?1258次閱讀

    Redis Stream應(yīng)用案例

    的基本使用介紹和設(shè)計(jì)理念可以看我之前的一篇文章(Redis Stream簡(jiǎn)介)。Redis Stream本質(zhì)上是在Redis內(nèi)核上(非Redis Module)
    發(fā)表于 06-26 17:15

    centos7 redis的安裝

    centos7 redis 使用,查看Redis工具(安裝、添加權(quán)限驗(yàn)證、添加開(kāi)機(jī)自啟)
    發(fā)表于 05-14 17:13

    Redis Cluster的基本原理及實(shí)現(xiàn)細(xì)節(jié)

    Redis Cluster的基本原理和架構(gòu) Redis Cluster是分布式Redis實(shí)現(xiàn)。隨著Redis版本的更替,以及各種已知bug
    發(fā)表于 09-28 19:09 ?0次下載
    <b class='flag-5'>Redis</b> Cluster的基本原理及<b class='flag-5'>實(shí)現(xiàn)</b>細(xì)節(jié)

    Java 使用Redis緩存工具的詳細(xì)解說(shuō)

    本文是關(guān)于Java 使用Redis緩存工具的詳細(xì)解說(shuō)。詳細(xì)步驟請(qǐng)看下文
    的頭像 發(fā)表于 02-09 14:10 ?8249次閱讀
    Java 使用<b class='flag-5'>Redis</b>緩存<b class='flag-5'>工具</b>的詳細(xì)解說(shuō)

    Windows環(huán)境下使用Redis緩存工具的圖文詳細(xì)方法

    Windows環(huán)境下使用Redis緩存工具的圖文詳細(xì)方法。Redis 是一個(gè)高性能的key-value數(shù)據(jù)庫(kù)。redis的出現(xiàn),很大程度補(bǔ)償了memcached這類(lèi)key/value存
    的頭像 發(fā)表于 02-09 14:25 ?5185次閱讀
    Windows環(huán)境下使用<b class='flag-5'>Redis</b>緩存<b class='flag-5'>工具</b>的圖文詳細(xì)方法

    redis設(shè)計(jì)與實(shí)現(xiàn)

    redis
    發(fā)表于 06-20 14:44 ?0次下載

    談?wù)?b class='flag-5'>Redis怎樣配置實(shí)現(xiàn)主從復(fù)制?

    之前總結(jié)過(guò)redis的持久化機(jī)制:深度剖析Redis持久化機(jī)制,持久化機(jī)制主要解決redis數(shù)據(jù)單機(jī)備份問(wèn)題;redis的高可用需要考慮數(shù)據(jù)的多機(jī)備份,多機(jī)備份通過(guò)主從復(fù)制來(lái)
    發(fā)表于 01-31 11:31 ?966次閱讀

    Redis實(shí)現(xiàn)限流的三種方式分享

    當(dāng)然,限流有許多種實(shí)現(xiàn)的方式,Redis具有很強(qiáng)大的功能,我用Redis實(shí)踐了三種的實(shí)現(xiàn)方式,可以較為簡(jiǎn)單的實(shí)現(xiàn)其方式。
    的頭像 發(fā)表于 02-22 09:52 ?1747次閱讀

    Redis官方可視化工具功能強(qiáng)大

    RedisInsight 是一個(gè)高顏值,直觀高效的 Redis GUI 管理工具,它可以對(duì) Redis 的內(nèi)存、連接數(shù)、命中率以及正常運(yùn)行時(shí)間進(jìn)行監(jiān)控
    的頭像 發(fā)表于 04-23 09:55 ?2034次閱讀
    <b class='flag-5'>Redis</b>官方可視化<b class='flag-5'>工具</b>功能強(qiáng)大

    Java redis鎖怎么實(shí)現(xiàn)

    在Java中實(shí)現(xiàn)Redis鎖涉及到以下幾個(gè)方面:Redis的安裝配置、Redis連接池的使用、Redis數(shù)據(jù)結(jié)構(gòu)的選擇、
    的頭像 發(fā)表于 12-04 10:47 ?1879次閱讀

    redis集群性能測(cè)試工具有哪些

    Redis是一種高性能的內(nèi)存鍵值存儲(chǔ)系統(tǒng),它被廣泛應(yīng)用于各種互聯(lián)網(wǎng)應(yīng)用和大規(guī)模的數(shù)據(jù)存儲(chǔ)中。為了評(píng)估Redis在不同場(chǎng)景下的性能,我們需要使用一些性能測(cè)試工具來(lái)對(duì)Redis集群進(jìn)行基準(zhǔn)
    的頭像 發(fā)表于 12-04 11:36 ?1538次閱讀

    redis hash底層實(shí)現(xiàn)原理

    數(shù)據(jù)結(jié)構(gòu)是如何實(shí)現(xiàn)的呢?本文將詳細(xì)介紹Redis哈希底層的實(shí)現(xiàn)原理。 在Redis中,每個(gè)哈希都是由一個(gè)類(lèi)似于字典(Dictionary)的結(jié)構(gòu)實(shí)現(xiàn)
    的頭像 發(fā)表于 12-04 16:27 ?1378次閱讀

    redis持久化機(jī)制和如何實(shí)現(xiàn)持久化

    File)。 RDB是Redis默認(rèn)采用的持久化方式,它通過(guò)在指定時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)快照寫(xiě)入到磁盤(pán)的二進(jìn)制文件中,實(shí)現(xiàn)數(shù)據(jù)的持久化。RDB方式具有高效和緊湊的特點(diǎn),可以周期性地將數(shù)據(jù)
    的頭像 發(fā)表于 12-05 10:02 ?957次閱讀

    redis數(shù)據(jù)結(jié)構(gòu)的底層實(shí)現(xiàn)

    Redis是一種內(nèi)存鍵值數(shù)據(jù)庫(kù),常用于緩存、消息隊(duì)列、實(shí)時(shí)數(shù)據(jù)分析等場(chǎng)景。它的高性能得益于其精心設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)和底層實(shí)現(xiàn)。本文將詳細(xì)介紹Redis常用的數(shù)據(jù)結(jié)構(gòu)和它們的底層實(shí)現(xiàn)。
    的頭像 發(fā)表于 12-05 10:14 ?1181次閱讀