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

Redis List 是否適合做消息隊列?Spring Boot 與 Redission 實現 Redis 消息隊列!

數據庫 Redis
我將結合消息隊列的特點,分析使用 Redis 的 List 作為消息隊列的實現原理,并分享如何把 SpringBoot 與 Redission 整合來操作 Redis 運用到項目中。

分布式系統中必備的一個中間件就是消息隊列,通過消息隊列你能對服務間進行異步解耦、流量消峰、實現最終一致性。

目前市面上已經有 RabbitMQ、RochetMQ、ActiveMQ、Kafka等,有人會問:“Redis 適合做消息隊列么?”

在回答這個問題之前,你先從本質思考。

  • 消息隊列提供了什么特性?
  • Redis 如何實現消息隊列?是否滿足存取需求?

我將結合消息隊列的特點,分析使用 Redis 的 List 作為消息隊列的實現原理,并分享如何把 SpringBoot 與 Redission 整合來操作 Redis 運用到項目中。

什么是消息隊列

消息隊列是一種異步的服務間通信方式,適用于分布式和微服務架構。消息在被處理和刪除之前一直存儲在隊列上。

每條消息僅可被一位用戶處理一次。消息隊列可被用于分離重量級處理、緩沖或批處理工作以及緩解高峰期工作負載。

  • Producer:消息生產者,負責產生和發送消息到 Broker;
  • Broker:消息處理中心。負責消息存儲、確認、重試等,一般其中會包含多個 queue;
  • Consumer:消息消費者,負責從 Broker 中獲取消息,并進行相應處理;

MySQL:“消息隊列的使用場景有哪些呢?“

消息隊列在實際應用中包括如下四個場景。

  • 應用耦合:發送方、接收方系統之間不需要了解雙方,只需要認識消息。多應用間通過消息隊列對同一消息進行處理,避免調用接口失敗導致整個過程失敗。
  • 異步處理:多應用對消息隊列中同一消息進行處理,應用間并發處理消息,相比串行處理,減少處理時間。
  • 限流削峰:廣泛應用于秒殺或搶購活動中,避免流量過大導致應用系統掛掉的情況。
  • 消息驅動的系統:系統分為消息隊列、消息生產者、消息消費者,生產者負責產生消息,消費者(可能有多個)負責對消息進行處理。

消息隊列滿足哪些特性

消息有序性

消息是異步處理的,但是消費者需要按照生產者發送消息的順序來消費,避免出現后發送的消息被先處理的情況。

重復消息處理

生產者可能因為網絡問題出現消息重傳導致消費者可能會收到多條重復消息。

同樣的消息重復多次的話可能會造成一業務邏輯多次執行,需要確保如何避免重復消費問題。

可靠性

一次保證消息的傳遞。如果發送消息時接收者不可用,消息隊列會保留消息,直到成功地傳遞它。

當消費者重啟后,可以繼續讀取消息進行處理,防止消息遺漏。

LPUSH

生產者使用 LPUSH key element[element...] 將消息插入到隊列的頭部,如果 key 不存在則會創建一個空的隊列再插入消息。

如下,生產者向隊列 queue 先后插入了 “Java”、“碼哥字節”、“Go”,返回值表示消息插入隊列后的個數。

> LPUSH queue Java 碼哥字節 Go
(integer) 3

MySQL:“如果生產者消息發送很快,消費者處理不過來,會導致消息積壓,占用過多的 Redis 內存。”

確實,List 并沒有提供類似于 Kafka 的 ConsumeGroup ,會使用多個消費者策劃給你續組成一個消費組來分擔處理隊列消息。不過在 Redis 5.0 之后,提供了 Streams 數據類型,后面我會介紹到。

RPOP

消費者使用 RPOP key 依次讀取隊列的消息,先進先出,所以 “Java”會先讀取消費:

> RPOP queue
"Java"
> RPOP queue
"碼哥字節"
> RPOP queue
"Go"

圖2-13

實時消費問題

謝霸戈:“這么簡單就實現了?”

別高興的太早,LPUSH、RPOP 存在一個性能風險,生產者向隊列插入數據的時候,List 并不會主動通知消費者及時消費。

謝霸戈:“那我寫一個 while(true) 不停地調用 RPOP 指令,當有新消息就消費“

程序需要不斷輪詢并判斷是否為空再執行消費邏輯,這就會導致即使沒有新消息寫入隊列,消費者也在不停地調用 RPOP 命令占用 CPU 資源。

謝霸戈:“如何避免循環調用導致的 CPU 性能損耗呢?”

請叫我貼心哥 Redis,我提供了 BLPOP、BRPOP 阻塞讀取的命令,消費者在讀取隊列沒有數據的時候自動阻塞,直到有新的消息寫入隊列,才會繼續讀取新消息執行業務邏輯。

BRPOP queue 0

參數 0 表示阻塞等待時間無止期,哪怕是煙花易冷人事易分,雨紛紛舊故里草木深,斑駁的城門盤踞著老樹根,石板上回蕩的是再等,一直等到“心上人”來。

重復消費解決方案

  • 消息隊列為自動每一條消息生成一個全局 ID;
  • 生產者為每一條消息創建一個全局 ID,消費者把處理過的消息 ID 記錄下來判斷是否重復。

其實這就是冪等,對于同一條消息,消費者收到后處理一次的結果和多次的結果是一致的。

消息可靠性解決方案

謝霸戈:“消費者讀取消息,處理過程中宕機了就會導致消息沒有處理完成,可是數據已經不在隊列中了咋辦?”

本質就是消費者在處理消息的時候崩潰了,無法再讀取消息,缺乏一個消息確認可靠機制。

我提供了 BRPOPLPUSH source destination timeout指令,含義是阻塞的方式從 source 隊列讀取消息的同時把這條消息復制到另一個 destination 隊列中(備份),并且是原子操作。

不過這個指令在 6.2 版本被 BLMOVE 取代。接下來,上才藝!生產者使用 LPUSH 把消息依次從存入 order:pay 隊列隊頭(左端)。

LPUSH order:pay "謝霸戈"
LPUSH order:pay "肖材吉"

消費者消費消息的時候在 while循環使用BLMOVE 以阻塞的方式從隊列 order:pay 隊尾(右端)彈出消息“謝霸戈”,同時把該消息復制到隊列 order:pay:back 隊頭(左端),該操作是原子性的,最后一個參數 timeout = 0 表示持續等待。

BLMOVE order:pay order:pay:back RIGHT LEFT 0

如果消費消息“謝霸戈”成功,那就使用 LREM 把隊列 order:pay:back 的“謝霸戈”消息刪除,從而實現 ACK 確認機制。

LREM order:pay:back 0 "謝霸戈"

倒數第二個參數 count 的含義如下。

  • count > 0,從表頭(左端)向表尾(右端),依次刪除 count 個 value。
  • count < 0,從表尾(右端)向表頭(左端),依次刪除 count 絕對值個 value。
  • count = 0,刪除所有的 value。

消費異常的話,應用程序使用 BRPOP order:pay:back 從備份隊列再次讀取消息處理即可。

Redisson 實戰

在 Java 中,你可以利用 Redission 封裝的 API 來快速實現隊列,接下來我將基于 SpringBoot 2.1.4 版本來教你如何整合 Redisson。

添加依賴

<dependency>
  <groupId>org.redisson</groupId>
  <artifactId>redisson-spring-boot-starter</artifactId>
  <version>3.23.3</version>
</dependency>

application.yaml引入 Redisson 配置文件。

spring:
  application:
    name: redission
  redis:
    redisson:
      file: classpath:redisson-config.yaml

創建 redisson-config.yaml 配置。

singleServerConfig:
  idleConnectionTimeout: 10000
  connectTimeout: 10000
  timeout: 3000
  retryAttempts: 3
  retryInterval: 1500
  password: magebyte
  subscriptionsPerConnection: 5
  clientName: redissonClient
  address: "redis://127.0.0.1:6379"
  subscriptionConnectionMinimumIdleSize: 1
  subscriptionConnectionPoolSize: 50
  connectionMinimumIdleSize: 24
  connectionPoolSize: 64
  database: 0
  dnsMonitoringInterval: 5000
threads: 16
nettyThreads: 32
codec: !<org.redisson.codec.Kryo5Codec> {}
transportMode: "NIO"

在代碼中,我使用的是阻塞雙端隊列,消費者開啟死循環,執行 BLMOVE 指令。

@Slf4j
@Service
public class QueueService {

    @Autowired
    private RedissonClient redissonClient;

    private static final String ORDER_PAY_QUEUE = "order:pay";
    private static final String ORDER_PAY_BACK_QUEUE = "order:pay:back";

    /**
     * 生產者發送消息到隊列頭部
     *
     * @param message
     */
    public void sendMessage(String message) {
        RBlockingDeque<String> orderPayQueue = redissonClient.getBlockingDeque(ORDER_PAY_QUEUE);

        try {
            orderPayQueue.putFirst(message);
            log.info("將消息: {} 插入到隊列 {}。", message, ORDER_PAY_QUEUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 消費者消費消息
     */
    public void onMessage() {

        RBlockingDeque<String> orderPayQueue = redissonClient.getBlockingDeque(ORDER_PAY_QUEUE);
        while (true) {
            // BLMOVE order:pay order:pay:back RIGHT LEFT 0
            String message = orderPayQueue.move(Duration.ofSeconds(0), DequeMoveArgs.pollLast()
                    .addFirstTo(ORDER_PAY_BACK_QUEUE));
            log.info("從隊列 {} 中讀取到消息:{},并把消息復制到 {} 隊列.", ORDER_PAY_QUEUE, message, ORDER_PAY_BACK_QUEUE);

            // 消費正常,從 ORDER_PAY_BACK_QUEUE 刪除這條消息,LREM order:pay:back 0 message
            removeBackQueueMessage(message, ORDER_PAY_BACK_QUEUE);
        }
    }

    /**
     * 從隊列中刪除消息
     * @param message
     * @param queueName
     */
    private void removeBackQueueMessage(String message, String queueName) {
        RBlockingDeque<String> orderPayBackDeque = redissonClient.getBlockingDeque(queueName);
        boolean remove = orderPayBackDeque.remove(message);
        log.info("消費正常,刪除隊列 {} 的消息 {}。", queueName, message);
    }
}

單元測試

RunWith(SpringRunner.class)
@SpringBootTest(classes = RedissionApplication.class)
public class RedissionApplicationTests {

    @Autowired
    private QueueService queueService;

    @Test
    public void testQueue() throws InterruptedException {
        new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                queueService.sendMessage("消息" + i);
            }
        }).start();

        new Thread(() -> queueService.onMessage()).start();

        Thread.currentThread().join();
    }

}

總結

可以使用 List 數據結構來實現消息隊列,滿足先進先出。

Redis 是一個非常輕量級的鍵值數據庫,部署一個 Redis 實例就是啟動一個進程,部署 Redis 集群,也就是部署多個 Redis 實例。

而 Kafka、RabbitMQ 部署時,涉及額外的組件,例如 Kafka 的運行就需要再部署 ZooKeeper。相比 Redis 來說,Kafka 和 RabbitMQ 一般被認為是重量級的消息隊列。

需要注意的是,我們要避免生產者過快,消費者過慢導致的消息堆積占用 Redis 的內存。

在消息量不大的情況下使用 Redis 作為消息隊列,他能給我們帶來高性能的消息讀寫,這似乎也是一個很好消息隊列解決方案。

責任編輯:姜華 來源: 碼哥跳動
相關推薦

2022-01-21 19:22:45

RedisList命令

2022-01-15 07:20:18

Redis List 消息隊列

2024-03-22 12:10:39

Redis消息隊列數據庫

2022-02-28 08:42:49

RedisStream消息隊列

2022-04-12 11:15:31

Redis消息隊列數據庫

2023-12-30 13:47:48

Redis消息隊列機制

2024-04-19 08:32:07

Redis緩存數據庫

2017-10-11 15:08:28

消息隊列常見

2023-09-12 14:58:00

Redis

2024-09-11 14:57:00

Redis消費線程模型

2021-01-12 08:43:29

Redis ListStreams

2025-06-27 10:41:04

Redis數據庫集群

2022-06-09 08:36:56

高性能Disruptor模式

2023-07-10 09:18:39

Redis訂閱模型

2020-01-14 15:08:44

Redis5Streams數據庫

2025-07-01 01:00:00

Spring消息系統Redis

2021-09-16 10:29:05

開發技能代碼

2018-03-29 08:38:10

2023-11-13 08:37:33

消息中間件分布式架構

2017-04-27 10:07:52

框架設計實現
點贊
收藏

51CTO技術棧公眾號

人妻少妇精品视频一区二区三区| 女女同性女同一区二区三区按摩| 国产99久久久| 欧美成人激情| 亚洲第一av网站| 日本黄网站免费| 黄色成年人视频在线观看| 国产成人av影院| 日韩av片电影专区| 中文字幕五月天| 外国成人在线视频| 91精品国产福利在线观看| 国产成人精品视频免费看| 欧美被日视频| 久久青草欧美一区二区三区| 国产日本欧美视频| 中国一级特黄毛片| 天天插综合网| 亚洲天天在线日亚洲洲精| 男生和女生一起差差差视频| 日本美女一区| 性做久久久久久久久| 在线视频一区观看| 国产香蕉视频在线看| 盗摄精品av一区二区三区| 国产日韩精品视频| 国产精品高清无码| 亚洲欧美春色| 欧美精品video| 992在线观看| 狠狠操综合网| 亚洲欧美精品在线| 中文字幕一区二区久久人妻网站| 亚洲一区有码| 欧美日韩精品综合在线| 国产91在线视频观看| 超碰中文在线| 玉米视频成人免费看| 亚洲欧洲日本国产| av在线电影院| 国产视频不卡一区| 日本亚洲欧洲精品| 噜噜噜噜噜在线视频| 99re这里都是精品| 国产欧美日韩亚洲| 免费激情视频网站| 粉嫩13p一区二区三区| 亚洲综合中文字幕68页| 国产欧美综合视频| 国产一区二区三区香蕉| 91牛牛免费视频| 国产又大又黄的视频| 久久爱另类一区二区小说| 国产精品入口福利| 在线观看免费黄色小视频| 毛片av一区二区| 成人春色激情网| 国产农村妇女毛片精品久久| 国产专区欧美精品| av成人综合网| 午夜国产在线观看| 久久久久九九视频| 日韩在线第一区| 日本中文在线| 夜色激情一区二区| 免费高清一区二区三区| 久草在线资源福利站| 日韩欧美一区视频| 日韩av在线中文| 国产精品视频首页| 亚洲第一免费网站| 久久久久久久久久久久久久久| 国产剧情在线观看一区| 色播久久人人爽人人爽人人片视av| 免费成人深夜蜜桃视频| 欧美1区免费| 91极品视频在线| 国产99免费视频| 精品一区二区三区在线播放 | 女人色极品影院| 老色鬼在线视频| 91久久久免费一区二区| www.夜夜爽| 国产无遮挡裸体免费久久| 亚洲欧美国产视频| 国产成人综合在线视频| 国产一级久久| 国产欧美日韩亚洲精品| 俄罗斯嫩小性bbwbbw| 91天堂素人约啪| 在线播放豆国产99亚洲| av手机在线观看| 欧美日韩精品一区二区三区四区| 日本在线视频播放| 日本精品影院| 久久亚洲一区二区三区四区五区高| 久草福利资源在线观看| 日日夜夜精品视频免费| 97国产超碰| 黄色小视频在线观看| 亚洲免费看黄网站| 成人精品视频一区二区| 日本免费一区二区视频| 一区二区亚洲精品国产| 豆国产97在线 | 亚洲| 日本aⅴ精品一区二区三区| wwwxx欧美| 无遮挡的视频在线观看| 性久久久久久久久| 国产无遮挡猛进猛出免费软件| 成人资源在线| 久久亚洲欧美日韩精品专区| 超碰超碰超碰超碰| 国产成人精品免费网站| 一本色道久久99精品综合| zzzwww在线看片免费| 在线不卡免费av| 国产黄色大片免费看| 影音先锋亚洲电影| 亚洲一区二区三区视频| 永久av在线| 日本高清不卡视频| 国产在线观看无码免费视频| 女人天堂亚洲aⅴ在线观看| 国产精品444| 四虎精品在永久在线观看| 一区二区三区av电影 | 丰满白嫩尤物一区二区| 四虎影院一区二区三区| 北岛玲heyzo一区二区| 亚洲第一精品福利| 青青操国产视频| 国产在线一区二区综合免费视频| 欧美日韩一区二| 涩涩av在线| 亚洲激情免费观看| 免费毛片一区二区三区| 高潮精品一区videoshd| 干日本少妇视频| 粉嫩一区二区三区在线观看| 色妞在线综合亚洲欧美| 中文字幕丰满人伦在线| 国产亚洲精久久久久久| 一本久道综合色婷婷五月| 亚洲人挤奶视频| 国产成人精品久久二区二区91 | 久久久99久久| 中文字幕乱码人妻综合二区三区| 欧美成人基地| 欧美一区深夜视频| 欧美xxx.com| 色视频欧美一区二区三区| 波多野结衣a v在线| 久久字幕精品一区| 视频二区一区| 91成人小视频| 欧美成人在线影院| 国精产品乱码一区一区三区四区| 一区二区三区四区在线免费观看| 色欲欲www成人网站| 尤物在线精品| 欧美极品视频一区二区三区| 欧美xx视频| 一区二区三区日韩在线| 国产一区二区小视频| 一区精品在线播放| 久久aaaa片一区二区| 亚洲激情自拍| 秋霞在线观看一区二区三区| 影音成人av| 久久av资源网站| 人妻中文字幕一区| 日本韩国精品在线| 天天鲁一鲁摸一摸爽一爽| 国产精品一二三| 精品国产一区三区| 欧美中文一区二区| 91嫩草国产在线观看| 日本在线高清| 久久精品国产久精国产思思| 丰满肉肉bbwwbbww| 在线看国产日韩| 欧美性猛交xxxxx少妇| 99精品国产热久久91蜜凸| 国产视频手机在线播放| 欧美色图首页| 日韩视频专区| 中文字幕一区二区三区中文字幕| 奇米成人av国产一区二区三区| 91成人高清| 亚洲第一在线视频| 亚洲无码精品在线播放| 亚洲国产婷婷综合在线精品| 久操视频在线观看免费| 国产成人在线视频免费播放| 黄色片久久久久| 欧美1区2区视频| 日本高清不卡一区二区三| 欧美日韩午夜电影网| 国产99视频在线观看| 手机在线免费av| 中文字幕亚洲欧美| 午夜小视频免费| 91精品国产综合久久久蜜臀图片| 欧美国产成人精品一区二区三区| 国产精品久久久久久久久久久免费看| 性高潮久久久久久| 看片的网站亚洲| 漂亮人妻被中出中文字幕| 中文字幕免费精品| 天堂av一区二区| 九九综合九九| 国产女人水真多18毛片18精品 | 91九色在线播放| xvideos亚洲| 黄色在线小视频| 日韩久久午夜影院| 日本黄色免费视频| 日韩一区二区三区免费看| 亚洲视屏在线观看| 欧美日韩在线第一页| 精品视频一区二区在线观看| 亚洲天堂av老司机| 懂色av粉嫩av蜜臀av一区二区三区| 久久综合久久综合久久综合| 一本色道久久hezyo无码| 激情综合色播五月| 久久黄色片网站| 日韩电影在线免费观看| 欧洲av无码放荡人妇网站| 国产一区观看| 国产夫妻自拍一区| 欧美久久影院| 欧美性猛交内射兽交老熟妇| 五月精品视频| 成年人黄色在线观看| 99久久国产综合精品成人影院| 污视频在线免费观看一区二区三区| 亚洲最好看的视频| 欧美一区二区三区四区五区六区 | 男人天堂网站在线| 亚洲色图欧美| 好吊色这里只有精品| 91精品亚洲| 国产精品无码电影在线观看| 中文字幕一区二区av| 妞干网在线播放| 国内成人在线| 波多野结衣乳巨码无在线| 欧美刺激性大交免费视频| 欧美与欧洲交xxxx免费观看| 亚洲一卡二卡在线| 欧美私人免费视频| 一级久久久久久| 欧美少妇xxx| 在线观看国产精品视频| 欧美精品 国产精品| 91av国产精品| 精品久久久久一区| 无码国产精品一区二区免费16| 亚洲第一色中文字幕| 五月婷婷久久久| 亚洲一区二区福利| 免费a级人成a大片在线观看| 久久天天躁狠狠躁老女人| 羞羞的视频在线观看| 国产69精品99久久久久久宅男| 三级在线看中文字幕完整版| 青草热久免费精品视频 | 欧美第一精品| 第九区2中文字幕| 妖精视频成人观看www| www.色就是色| 国产乱码一区二区三区| 亚洲中文字幕一区| 久久精品免费在线观看| 99久久久免费精品| 亚洲sss视频在线视频| 亚洲 日本 欧美 中文幕| 7777精品伊人久久久大香线蕉最新版| 不卡的日韩av| 亚洲香蕉伊综合在人在线视看| 男人天堂久久久| 97avcom| 久久人人视频| 国产一区再线| 国产精品麻豆久久| 国产中文字幕视频在线观看| 美女性感视频久久| 国产黑丝在线观看| 亚洲天堂精品视频| 欧美日韩一级黄色片| 制服丝袜日韩国产| 精品亚洲成a人片在线观看| 久久av.com| av成人在线播放| 国产九色91| 偷偷www综合久久久久久久| 缅甸午夜性猛交xxxx| 另类综合日韩欧美亚洲| 精品国产av色一区二区深夜久久 | 亚洲人成网7777777国产| caoporn免费在线| 国产97在线|亚洲| 超碰一区二区三区| 中文字幕乱码一区二区三区| 亚洲精品黄色| 日本少妇激三级做爰在线| 国产日韩三级在线| 97人人澡人人爽人人模亚洲| 666欧美在线视频| 成人精品一区二区三区免费 | 一本二本三本亚洲码| 美女久久一区| 成年人小视频在线观看| 1区2区3区欧美| 这里只有精品国产| 亚洲欧美精品中文字幕在线| free性欧美| 97视频资源在线观看| 天天操综合网| 久久国产激情视频| 中文字幕乱码亚洲精品一区| 国产精品999在线观看| 精品免费日韩av| 在线看三级电影| 成人精品福利视频| 四虎8848精品成人免费网站| 日韩欧美精品在线观看视频| 成人高清视频在线观看| 久久免费视频6| 日韩欧美国产一二三区| av网站在线免费看推荐| 国产日韩欧美在线视频观看| 精品久久久久久久| 爱情岛论坛vip永久入口| 久久人人爽爽爽人久久久| 一级成人黄色片| 亚洲欧美中文日韩在线| 裤袜国产欧美精品一区| 麻豆成人av| 丝袜美腿一区二区三区| 美女脱光内衣内裤| 在线免费av一区| 一区二区三区视频在线观看视频| 国产精品美女网站| 日韩一级毛片| 在线播放免费视频| 亚洲精品自拍动漫在线| 精品人妻少妇AV无码专区| 九九综合九九综合| 国产精品videossex| 欧美变态另类刺激| 国产亚洲精品aa午夜观看| 中文字幕一二三四| 久久天天躁狠狠躁夜夜躁| 久久丁香四色| 免费看毛片的网址| 91蝌蚪porny九色| 欧美特级黄色片| 日韩中文字幕不卡视频| 欧美第一在线视频| 99久久国产综合精品五月天喷水| 99久久精品国产网站| 婷婷激情五月综合| 久久国产精品久久国产精品| 伊人久久噜噜噜躁狠狠躁| 久色视频在线播放| 亚洲国产精华液网站w| 国产精品久久久久久免费播放| 欧美成人一二三| 亚洲激情播播| 亚洲涩涩在线观看| 亚洲一区二区成人在线观看| 日本大片在线观看| 国产日韩在线观看av| 国内一区二区三区| 91网站免费视频| 欧美一级在线视频| 小早川怜子影音先锋在线观看| 婷婷五月色综合| 成人午夜av电影| 中文字幕+乱码+中文| 久久99国产综合精品女同| 网友自拍区视频精品| 高潮一区二区三区| 精品久久久久久亚洲精品| 3d成人动漫在线| 国产传媒一区二区三区| 日韩和欧美一区二区| 久草视频免费播放| 伊人久久久久久久久久久| 88久久精品| 日本xxxx黄色| 午夜一区二区三区在线观看| 午夜不卡视频| 欧美久久电影| 国产福利电影一区二区三区| 日韩精品在线一区二区三区| 色综合久久悠悠|