精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring Boot + Redis Streams :構(gòu)建高效消息系統(tǒng)

數(shù)據(jù)庫 Redis
Redis Streams是一種日志數(shù)據(jù)結(jié)構(gòu),類似于Apache Kafka中的分區(qū)日志,提供了持久化、可回溯、消息分組等特性。它支持生產(chǎn)者消費(fèi)者模型,允許生產(chǎn)者將消息追加到流的末尾,消費(fèi)者從流中讀取消息進(jìn)行處理。

前言

在現(xiàn)代微服務(wù)架構(gòu)中,可靠的消息處理系統(tǒng)是保證系統(tǒng)高可用性和擴(kuò)展性的關(guān)鍵。Redis Streams作為Redis 5.0引入的強(qiáng)大功能,提供了一種日志數(shù)據(jù)結(jié)構(gòu),能夠高效地處理消息隊(duì)列和流數(shù)據(jù)。

簡介

圖片圖片

Redis Streams是一種日志數(shù)據(jù)結(jié)構(gòu),類似于Apache Kafka中的分區(qū)日志,提供了持久化、可回溯、消息分組等特性。它支持生產(chǎn)者消費(fèi)者模型,允許生產(chǎn)者將消息追加到流的末尾,消費(fèi)者從流中讀取消息進(jìn)行處理。

Redis Streams的主要特性包括:

  • 消息持久化:消息存儲(chǔ)在Redis內(nèi)存中,并可通過持久化策略(如 RDB、AOF)保證數(shù)據(jù)不丟失。
  • 消息分組:支持將消費(fèi)者劃分為不同的分組,每個(gè)分組可以獨(dú)立消費(fèi)消息,實(shí)現(xiàn)消息的并行處理。
  • 消息確認(rèn)機(jī)制:消費(fèi)者處理完消息后,可以向流發(fā)送確認(rèn)消息,確保消息不會(huì)被重復(fù)處理。
  • 消息回溯:可以從任意位置讀取消息,支持歷史消息的查詢和重放。

效果圖

圖片圖片

消息生產(chǎn)與消費(fèi)實(shí)踐

創(chuàng)建消息實(shí)體類

@Data
public class Message implements Serializable {
    private String id;
    private String content;
}

生產(chǎn)者服務(wù)

@Service
public class MessageProducer {
    private static final String STREAM_KEY = "message-stream";
    private final RedisTemplate<String, Object> redisTemplate;

    public MessageProducer(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public RecordId sendMessage(Message message) {
        StreamOperations<String, Object, Object> streamOps = redisTemplate.opsForStream();
        Map<String, Object> messageMap = new HashMap<>();
        messageMap.put("id", message.getId());
        messageMap.put("content", message.getContent());

        return streamOps.add(MapRecord.create(STREAM_KEY, messageMap));
    }
}

配置消費(fèi)者(組)

@Slf4j
@Service
public class MessageConsumer implements StreamListener<String, MapRecord<String, String, String>> {
    private static final String STREAM_KEY = "message-stream";
    private static final String GROUP_NAME = "message-group";
    private static final String CONSUMER_NAME = "consumer-1";
    private final RedisTemplate<String, Object> redisTemplate;
    private StreamMessageListenerContainer<String, MapRecord<String, String, String>> container;

    public MessageConsumer(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @PostConstruct
    public void init() {
        String script = "if redis.call('EXISTS', KEYS[1]) == 0 then " +
                "  return 1 " +
                "else " +
                "  return 0 " +
                "end";
        RedisScript<Long> redisScript = RedisScript.of(script, Long.class);
        Long result = redisTemplate.execute(redisScript, Collections.singletonList(streamKey));

        if (result != null && result == 1) {
            redisTemplate.opsForStream().createGroup(streamKey, ReadOffset.latest(), groupName);
            log.info("消費(fèi)者組 {} 創(chuàng)建成功", groupName);
        } else {
            log.info("消費(fèi)者組 {} 已存在", groupName);
        }

        // 配置消息監(jiān)聽容器
        StreamMessageListenerContainer.StreamMessageListenerContainerOptions<String,
                MapRecord<String, String, String>> options =
                StreamMessageListenerContainer.StreamMessageListenerContainerOptions.builder()
                        .batchSize(10)
                        .pollTimeout(Duration.ofMillis(100))
                        .build();

        container = StreamMessageListenerContainer.create(redisTemplate.getConnectionFactory(), options);

        /**
         *  ReadOffset.latest():指定組的起始位置為 “當(dāng)前最新消息”
         *  ReadOffset.lastConsumed():從消費(fèi)者組的最后確認(rèn)位置開始讀取。如果是新組,默認(rèn)從$(最新位置)開始,確保消息至少被消費(fèi)一次(At Least Once)
         *  ReadOffset.from(String id):從指定的消息 ID 開始讀取
         *   id="0-0":從流的起始位置(第一條消息)開始讀取所有歷史消息
         *   id="$":等價(jià)于ReadOffset.latest(),從尾部開始讀取新消息
         *   id="具體消息ID":從指定 ID 的下一條消息開始讀取
        **/
        container.receive(
                Consumer.from(GROUP_NAME, CONSUMER_NAME),
                StreamOffset.create(STREAM_KEY, ReadOffset.lastConsumed()),this);

        container.start();
        // 驗(yàn)證容器是否啟動(dòng)成功
        if (container.isRunning()) {
            log.info("消息監(jiān)聽容器已啟動(dòng)");
        } else {
            log.warn("消息監(jiān)聽容器啟動(dòng)失敗");
        }
    }

    @Override
    public void onMessage(MapRecord<String, String, String> message) {
        try {
            Map<String, String> value = message.getValue();
            String id = value.get("id");
            String content = value.get("content");

            // 處理消息
            System.out.println("收到消息: ID=" + id + ", 內(nèi)容=" + content);

            // 業(yè)務(wù)處理邏輯...

            // 確認(rèn)消息處理完成
            redisTemplate.opsForStream().acknowledge(STREAM_KEY, GROUP_NAME, message.getId());
        } catch (Exception e) {
            // 處理異常,可以記錄日志或?qū)崿F(xiàn)重試邏輯
            System.err.println("消息處理失敗: " + e.getMessage());
        }
    }

    @PreDestroy
    public void destroy() {
        if (container != null) {
            container.stop();
        }
    }

    public void consumeMessages() {
        StreamOperations<String, String, String> streamOps = redisTemplate.opsForStream();
        List<MapRecord<String, String, String>> messages = streamOps.read(
                Consumer.from(GROUP_NAME, CONSUMER_NAME),
                StreamReadOptions.empty().count(10).block(Duration.ofSeconds(10)),
                StreamOffset.create(STREAM_KEY, ReadOffset.lastConsumed())
        );

        messages.forEach(message -> {
            Map<String, String> value = message.getValue();
            String id = value.get("id");
            String content = value.get("content");
            System.out.println("Received message: id=" + id + ", cnotallow=" + content);
            // 確認(rèn)消息已處理
            streamOps.acknowledge(STREAM_KEY, GROUP_NAME, message.getId());
        });
    }
}

檢查流和消費(fèi)者組狀態(tài)

# 查看流信息
XLEN message-stream

# 查看消費(fèi)者組信息
XINFO GROUPS message-stream

# 查看組消費(fèi)情況
XINFO CONSUMERS message-stream message-group

注意

  • 在創(chuàng)建Redis Streams消費(fèi)者組時(shí),不能使用ReadOffset.lastConsumed(),當(dāng)你創(chuàng)建一個(gè)新的消費(fèi)者組時(shí),Redis要求你明確指定組的初始讀取位置(即從哪個(gè)消息ID開始消費(fèi))

組的狀態(tài)尚未初始化:新組沒有任何消費(fèi)記錄,lastConsumed()無法確定起始位置

Redis API設(shè)計(jì):創(chuàng)建組的命令(XGROUP CREATE)必須包含一個(gè)固定的偏移量參數(shù)(如0-0$

Redis Streams 和 Redis Pub-Sub 之間的主要區(qū)別

特性

Redis Streams

Redis Pub-Sub

消息持久性

支持

不支持

投遞保證

即使消費(fèi)者離線也能投遞

無(未被消費(fèi)的消息會(huì)丟失)

重放能力

支持(可通過 ID 讀取歷史消息)

不支持(僅支持實(shí)時(shí)消息)

消息有序性

有保證(基于消息 ID)

無保證

消費(fèi)者協(xié)調(diào)

支持(通過消費(fèi)者組實(shí)現(xiàn))

不支持

多消費(fèi)者支持

支持(通過消費(fèi)者組實(shí)現(xiàn)并發(fā)消費(fèi))

支持(消息廣播至所有訂閱者)


責(zé)任編輯:武曉燕 來源: 一安未來
相關(guān)推薦

2025-06-05 08:00:00

Go事件驅(qū)動(dòng)系統(tǒng)編程

2025-05-16 07:24:41

Springkafka腳手架

2023-11-07 10:01:34

2020-01-14 15:08:44

Redis5Streams數(shù)據(jù)庫

2024-10-25 08:41:18

消息隊(duì)列RedisList

2023-10-11 14:37:21

工具開發(fā)

2018-12-05 09:00:00

RedisRedis Strea數(shù)據(jù)庫

2021-09-03 06:46:34

Spring 6pring Boot 項(xiàng)目

2021-09-15 09:02:20

Spring 6Spring BootJava

2023-09-01 08:46:44

2025-03-31 08:39:55

2021-01-12 08:43:29

Redis ListStreams

2023-07-10 08:26:19

2025-05-29 01:33:00

微服務(wù)架構(gòu)系統(tǒng)

2025-05-13 07:13:25

2019-01-15 11:40:14

開發(fā)技能代碼

2022-10-10 08:00:00

微服務(wù)Spring Boo容器

2020-11-12 07:51:05

DockerSpring Boot應(yīng)用

2018-11-02 15:45:41

Spring BootRedis數(shù)據(jù)庫

2020-07-14 11:00:12

Spring BootRedisJava
點(diǎn)贊
收藏

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

日本免费一二三区| 欧美精品一区二区三区蜜桃视频| 欧美一区二区福利| 国产一区二区三区黄片| 欧美精品激情| 亚洲欧美一区二区激情| 色婷婷一区二区三区在线观看| 免费av不卡在线观看| 久久精品一区二区三区不卡| 91最新国产视频| 五月婷婷视频在线| 综合视频在线| 亚洲欧美激情精品一区二区| 天美一区二区三区| 另类图片综合电影| 亚洲一区二区在线观看视频| 天天久久人人| 日韩中文字幕观看| 狠狠色丁香婷综合久久| 国产aaa精品| 国产一级视频在线播放| 久久在线电影| 亚洲欧洲视频在线| 国产视频精品视频| 精品国产亚洲日本| 欧美自拍偷拍午夜视频| 国产免费观看高清视频| 日本不卡影院| 综合色天天鬼久久鬼色| 欧美中日韩一区二区三区| 成人av免费播放| 麻豆成人免费电影| 国产成人精品在线视频| 日本中文字幕网| 欧美特黄a级高清免费大片a级| 色偷偷亚洲男人天堂| 色婷婷在线影院| 欧美中文一区| 精品999久久久| 女人扒开腿免费视频app| 欧美天堂一区| 欧美日韩极品在线观看一区| 国产天堂在线播放| 黑人巨大精品| 天天av天天翘天天综合网色鬼国产| 国产a级黄色大片| 91精品久久| 亚洲色图欧美偷拍| 小说区视频区图片区| 在线播放毛片| 成人免费在线视频观看| 一区二区在线观看网站| 99re热久久这里只有精品34| 亚洲国产精品精华液ab| 日韩国产欧美精品| 国产一级在线观看| 国产精品无码永久免费888| 日韩欧美亚洲v片| a天堂中文在线88| 欧美激情一区二区三区不卡| 日韩欧美手机在线| 免费a级人成a大片在线观看| 成人免费视频在线观看| 无码毛片aaa在线| 性国产高清在线观看| 亚洲一区成人在线| 日本a在线免费观看| 欧美日韩国产观看视频| 色婷婷狠狠综合| 一区二区三区韩国| 日韩成人免费av| 日韩一二三区视频| 中文在线永久免费观看| 亚洲精华一区二区三区| 国产亚洲精品久久久久动| 久久久久久成人网| 中文av一区| 久久久这里只有精品视频| 97久久久久久久| 日本美女一区二区三区| 91美女福利视频高清| 亚洲精品久久久久久久久久久久久久 | 婷婷激情一区| 欧美久久免费观看| 稀缺呦国内精品呦| 欧美日韩中文字幕一区二区三区| 久久黄色av网站| 久久精品国产亚洲AV无码男同| 国产亚洲网站| 成人精品视频99在线观看免费| 亚洲毛片在线播放| 中文字幕二三区不卡| 高清无码视频直接看| 在线能看的av网址| 欧美精品xxxxbbbb| 一级做a爰片毛片| 99九九热只有国产精品| 97久久精品人人澡人人爽缅北| 中文区中文字幕免费看| 成人高清在线视频| 中文字幕中文字幕99| 高清精品在线| 在线播放中文一区| 男女做爰猛烈刺激| 亚洲国产激情| 成人做爰www免费看视频网站| 无码精品视频一区二区三区| 亚洲欧美成人一区二区三区| 日本精品久久久久中文字幕| 综合伊人久久| 精品国产视频在线| 久久久久99精品成人片我成大片 | 欧美熟妇精品一区二区蜜桃视频| 日韩av片子| 日韩av日韩在线观看| 国产成人无码www免费视频播放| 欧美极品美女视频| 无罩大乳的熟妇正在播放| 国产区一区二| 这里只有精品视频在线| 久久亚洲天堂网| 成人福利视频在线| 人妻无码一区二区三区四区| 91精品在线免费视频| 国产亚洲精品久久久| 九一国产在线观看| eeuss鲁片一区二区三区在线观看| 一区二区av| 日本黄色一区| 亚洲视频自拍偷拍| 天码人妻一区二区三区在线看| 成人免费视频国产在线观看| 四虎精品欧美一区二区免费| 日韩三区四区| 神马国产精品影院av| 羞羞色院91蜜桃| 国产三级一区二区三区| 精品久久久噜噜噜噜久久图片 | 韩日成人影院| 亚洲毛片在线免费观看| 国产精品视频免费播放| av电影在线观看一区| 婷婷无套内射影院| 欧美美女在线直播| 992tv成人免费影院| 日韩一卡二卡在线| 岛国av一区二区三区| chinese麻豆新拍video| 99精品国产在热久久婷婷| 国产一区二区在线网站| 成人免费图片免费观看| 精品无人区太爽高潮在线播放| 六月丁香激情综合| 2021中文字幕一区亚洲| 国产极品美女高潮无套久久久| 亚洲图区在线| 国产精品久久二区| 毛片在线播放a| 日韩一区二区三区三四区视频在线观看| 免费在线观看a级片| 粉嫩久久99精品久久久久久夜 | 少妇视频一区| 亚洲偷熟乱区亚洲香蕉av| 中文字幕日韩第一页| 亚洲色图视频网| www.啪啪.com| 石原莉奈在线亚洲三区| 一区二区三区四区国产| 日韩亚洲精品在线观看| 97视频com| 337p日本欧洲亚洲大胆鲁鲁| 这里只有精品免费| 久久久久性色av无码一区二区| thepron国产精品| 中文字幕欧美人妻精品一区| 天堂网在线观看国产精品| 99久久精品无码一区二区毛片| 九色porny自拍视频在线观看 | 这里只有精品视频在线观看| 精品一区免费观看| 久久精品视频在线免费观看 | 波多野结衣中文一区| 国产精品亚洲a| 91免费精品| 精品日本一区二区三区| 国产人妖一区| 国产做受69高潮| 91官网在线| 精品精品国产高清a毛片牛牛| 久久久久久无码精品大片| 亚洲精品高清在线| 97在线观看免费视频| 国产精品77777竹菊影视小说| 日本一区二区黄色| 亚洲九九在线| 欧美大陆一区二区| 国产在线一区不卡| 日韩免费视频在线观看| 182tv在线播放| 亚洲欧美中文日韩在线| 亚洲爱情岛论坛永久| 欧美婷婷六月丁香综合色| 五月天婷婷网站| 亚洲欧洲制服丝袜| 国产在线观看h| 99视频在线观看一区三区| 99国产精品久久久久久| 视频一区二区国产| 国产精品后入内射日本在线观看| 欧美淫片网站| 一区二区三区我不卡| 国产成人短视频在线观看| 国产91aaa| 精品国产一区二区三区2021| 国产精品久久久久久亚洲影视| 九色porny丨首页入口在线| 久久福利视频导航| 暖暖日本在线观看| 国产亚洲视频中文字幕视频| 香蕉视频国产在线| 精品少妇一区二区三区日产乱码| 一起草av在线| 欧美优质美女网站| 欧美超碰在线观看| 色综合激情五月| 国产成人无码精品| 亚洲香蕉伊在人在线观| 男女羞羞免费视频| 亚洲日穴在线视频| 五月婷婷综合激情网| 亚洲国产精品av| 日韩女同一区二区三区| 久久精品视频一区二区三区| 素人fc2av清纯18岁| 99精品视频中文字幕| 在线看黄色的网站| 成人av电影在线播放| 性囗交免费视频观看| 99久久久精品免费观看国产蜜| 韩国av中国字幕| 成人免费视频网站在线观看| 污网站免费观看| 国产91丝袜在线观看| 久久久久亚洲av无码网站| 国产乱码精品1区2区3区| 爱情岛论坛亚洲自拍| 国产精品中文欧美| 久久久久亚洲AV成人网人人小说| 国产成人丝袜美腿| 国产白袜脚足j棉袜在线观看 | 制服丝袜av成人在线看| 国产精品无码AV| 欧美一区二区三区视频| 国产高清第一页| 亚洲大胆人体av| 日韩国产福利| 国产一区二区三区在线| 生活片a∨在线观看| 久久av.com| 国产色播av在线| 日韩免费av片在线观看| 国产一区二区三区四区五区3d| 国产欧美日韩中文字幕| 久久丁香四色| 国产免费一区| 国产亚洲电影| 97超碰人人爱| 国产农村妇女精品一二区| 老司机午夜av| 国产一区二区三区观看| 无码国产精品一区二区免费式直播| 91丝袜美腿高跟国产极品老师| 国产精品久久免费观看| 亚洲乱码中文字幕综合| 日韩欧美国产亚洲| 在线一区二区三区四区五区| 国产精品一区二区人人爽| 精品久久人人做人人爽| 精品无吗乱吗av国产爱色| 久久亚洲国产成人| 在线黄色的网站 | 欧洲vs亚洲vs国产| 亚洲一区二区三区欧美| 伊人久久综合| 超碰超碰在线观看| www.亚洲免费av| 很污很黄的网站| 丰满岳妇乱一区二区三区| 91高潮大合集爽到抽搐| 日韩av在线一区二区| 日韩成人影视| 欧美一级视频免费在线观看| 综合久久伊人| 欧美日产一区二区三区在线观看| 久久久久久久久久久妇女| 黄在线观看网站| 国产不卡免费视频| 欧美精品日韩在线| 精品国产电影一区| 国产www免费观看| 亚洲欧洲日产国码av系列天堂| 色呦呦视频在线观看| 国产精品www| 久久视频在线观看| 欧美少妇在线观看| 麻豆一区二区三| 熟女俱乐部一区二区| 亚洲最大成人综合| 一区二区美女视频| 国产小视频国产精品| 超碰在线资源| 91精品久久久久久蜜桃| 久久精品高清| www日韩在线观看| 99久久国产免费看| 中文字幕第28页| 欧美一级理论片| 欧美jizzhd69巨大| 国产精品久久91| 精品国产一区探花在线观看| 日本一区二区黄色| 成人免费高清在线| 精品欧美一区二区久久久久| 欧美日韩免费观看一区二区三区 | 久久久999成人| 成人自拍视频网| 日本免费高清一区| 麻豆久久婷婷| 免费在线观看成年人视频| 午夜久久久久久久久| 成人乱码一区二区三区| 久久久久国产视频| 日韩国产在线不卡视频| 中文字幕在线中文| 国产成人精品免费看| 欧美日韩精品亚洲精品| 欧美大肚乱孕交hd孕妇| 午夜小视频在线观看| 91在线免费看片| 欧美精品18| 乱码一区二区三区| 五月激情综合色| 天堂av在线播放| 欧美自拍视频在线| 色棕色天天综合网| 三级在线视频观看| 亚洲欧洲韩国日本视频| 国产乱淫av片免费| 欧美大秀在线观看| 高清精品视频| 免费无码不卡视频在线观看| 久久影音资源网| 中文在线免费看视频| 精品国产一区二区三区久久狼黑人 | 精品国产乱码久久久久久婷婷| 日本精品久久久久| 欧美在线激情网| 欧美午夜精品一区二区三区电影| 青青青国产在线视频| 中文字幕一区三区| 精品黑人一区二区三区国语馆| 久久久久久久久综合| 女人丝袜激情亚洲| 伊人国产在线视频| 亚洲狠狠爱一区二区三区| 久久手机免费观看| 国产美女久久久| 狠狠色丁香久久综合频道| 日韩成人av一区二区| 欧美午夜不卡视频| 麻豆蜜桃在线| 日韩av电影免费在线| 国产一区二区三区av电影| 日韩手机在线观看| 一本色道久久综合亚洲精品小说| 99久久999| 337p粉嫩大胆噜噜噜鲁| 国产精品国产自产拍高清av| 精品人妻一区二区三区麻豆91| 91av在线国产| 亚洲不卡av不卡一区二区| 艳妇乳肉豪妇荡乳xxx| 欧美性色综合网| 懂色av一区| 亚洲日本无吗高清不卡| 成人动漫一区二区| 亚洲天堂中文字幕在线| 午夜精品免费视频| 97视频热人人精品免费| 亚洲av永久无码精品| 欧美美女bb生活片| 秋霞伦理一区| 91看片淫黄大片91| 国产片一区二区三区| 亚洲精品一区二区三区四区| 国产精品你懂得| 亚洲欧美日韩国产一区二区| 校园春色 亚洲| 中文字幕亚洲欧美日韩2019| 欧美尿孔扩张虐视频|