国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringBoot集成Redis實現消息隊列的方法

SpringBoot集成Redis實現消息隊列的方法

2021-08-06 12:23新猿一馬 Java教程

這篇文章主要介紹了SpringBoot集成Redis實現消息隊列的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

list 原理說明

Redis 的 list 是按照插入順序排序的字符串鏈表。

SpringBoot集成Redis實現消息隊列的方法

如圖所示,可以通過 lpush 和 rpop 或者 rpush 和 lpop 實現消息隊列。

1 lpush 和 rpop

SpringBoot集成Redis實現消息隊列的方法

2 rpush 和 lpop

SpringBoot集成Redis實現消息隊列的方法

消息隊列功能實現

引入 Redis 依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

applicat.yml添加Redis配置

spring:
  redis:
    host: 127.0.0.1
    database: 0
    port: 6379
    jedis:
      pool:
        max-active: 256
        max-idle: 8
        min-idle: 1

Redis配置類

package com.sb.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }

}

MQ發送和接收接口

package com.sb.service;

public interface MQService {

    void produce(String string);

    void consume();
}

MQ發送和接收實現類

package com.sb.service.impl;

import com.sb.service.MQService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class MQServiceImpl implements MQService {

    private static Logger log = LoggerFactory.getLogger(MQServiceImpl.class);

    private static final String MESSAGE_KEY = "message:queue";

    @Resource
    private RedisTemplate redisTemplate;

    @Override
    public void produce(String string) {
        redisTemplate.opsForList().leftPush(MESSAGE_KEY, string);
    }

    @Override
    public void consume() {
        String string = (String) redisTemplate.opsForList().rightPop(MESSAGE_KEY);
        log.info("consume : {}", string);
    }

}

MQ發送和接收API接口

package com.sb.controller;

import com.sb.service.MQService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@RequestMapping(value="/api")
public class MQController {

    @Resource
    private MQService mQService;

    @RequestMapping(value = "/produce", method=RequestMethod.GET)
    public void produce(@RequestParam(name = "key") String key) {
        mQService.produce(key);
    }

    @RequestMapping(value="/consume", method=RequestMethod.GET)
    public void consume() {
        while (true) {
            mQService.consume();
        }
    }

}

消息隊列功能測試

調用 http://localhost:8080/api/produce 接口往隊列里面添加 a、b、c、d元素。

SpringBoot集成Redis實現消息隊列的方法

調用 http://localhost:8080/api/consume 消費隊列里面的元素。

SpringBoot集成Redis實現消息隊列的方法

從截圖我們可以看到,即使當隊列為空,消費者依然在不停的 pop 數據,這就是浪費生命的空輪詢。

那如何解決這個空輪詢的問題呢?

你也許會想使用 Thread.sleep() 讓消費者線程隔一段時間再消費。

使用 Thread.sleep() 會有什么問題么?

A 如果生產者速度大于消費者消費速度,消息隊列長度會一直增大,時間久了會占用大量內存空間。

B 如果睡眠時間過長,這樣不能處理一些時效性的消息,睡眠時間過短,也會在連接上造成比較大的開銷。

有沒有更優雅和更合適的方式呢?

brpop 和 blpop 實現阻塞讀取,下面以 blpop 為例來說明問題。

blpop 理論說明

blpop 命令

blpop key1...keyN timeout

blpop 說明

blpop 是阻塞式列表的彈出原語。當給定列表內沒有任何元素可供彈出的時候, 連接將被 blpop 命令阻塞。直到有另一個客戶端對給定的這些 key 的任意一個執行 lpush 或 rpush 命令為止。 

當給定多個 key 參數時,按參數 key 的先后順序依次檢查各個列表,彈出第一個非空列表的頭元素。

key1...keyN :表示不同的隊列名。

timeout :阻塞隊列超時時間。

SpringBoot集成Redis實現消息隊列的方法

blpop 代碼實現

public void blockingConsume() {
    List<Object> obj = redisTemplate.executePipelined(new RedisCallback<Object>() {
        @Nullable
        @Override
        public Object doInRedis(RedisConnection connection) throws DataAccessException {
            //隊列沒有元素會阻塞操作,直到隊列獲取新的元素或超時
            return connection.bLPop(TIME_OUT, MESSAGE_KEY.getBytes());
        }
    },new StringRedisSerializer());

    for (Object str: obj) {
        log.info("blockingConsume : {}", str);
    }
}

SpringBoot集成Redis實現消息隊列的方法

阻塞線程每隔10s超時執行一次。該方法解決了 CPU 空轉的問題。

到此這篇關于SpringBoot集成Redis實現消息隊列的方法的文章就介紹到這了,更多相關SpringBoot Redis消息隊列內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/jack1liu/article/details/113725818

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 久久久中文字幕 | 91午夜视频| 懂色av一区二区三区 | 毛片视频免费 | 国产色 | 天堂在线视频 | 欧美亚洲一区 | 黄色片视频在线播放 | 久久久高清 | 久久99精品久久久久久久青青日本 | 久久99精品久久久久久国产越南 | 国产美女自拍视频 | 成人免费xxxxx在线观看 | 成人福利视频网 | 国产九九精品 | 精品一区二区三区免费视频 | 久久综合久久久 | 日韩欧美精品在线 | 国产精品毛片无码 | 国产精品久久久久久 | 久草在线 | 精品久久ai | 久久伊人网视频 | 亚洲视频观看 | 日本激情网 | 亚洲a网 | 国产精品手机在线 | 国产在线资源 | 免费在线观看黄色 | 精品视频在线一区 | 久久99国产精品免费网站 | 夜夜春精品视频高清69式 | 91精品免费在线观看 | 久久精彩| 亚洲综合在线视频 | 国产成人av在线 | 国产精品久久久久久亚洲调教 | 羞羞羞羞 | 国产超碰人人爽人人做人人爱 | 中文字幕日韩欧美一区二区三区 | 日韩在线播放一区二区三区 |