精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

产国精品偷在线| 美日韩精品免费观看视频| 国产精品亚洲αv天堂无码| 西西人体44www大胆无码| 99热免费精品| 综合久久五月天| 亚洲老女人av| 不卡av免费观看| 久久精品一区二区三区不卡 | 亚洲欧美综合一区| 印度午夜性春猛xxx交| 九九热播视频在线精品6| 在线看一区二区| 91制片厂免费观看| 香蕉视频911| 国产综合色视频| 欧美尤物巨大精品爽| 亚洲波多野结衣| 久久亚洲道色| 在线综合视频播放| 白嫩少妇丰满一区二区| 污影院在线观看| 中文字幕的久久| 国产精品一区二区你懂得| 中文字幕在线观看第二页| 亚洲精品免费观看| 久久久999精品免费| 国产精品无码一区二区三区免费| 99视频这里有精品| 在线视频你懂得一区二区三区| 中文精品无码中文字幕无码专区| 超碰国产在线观看| 不卡av在线免费观看| 国产在线不卡精品| 天天操天天干天天摸| 亚洲精品1234| 国产乱国产乱老熟300| 伊人久久综合一区二区| 一区二区三区在线播| 日韩视频专区| 婷婷五月综合激情| 国产69精品久久久久777| 国产在线视频一区| 少妇又紧又色又爽又刺激视频 | 成人激情小说网站| 91色视频在线导航| 一本一道精品欧美中文字幕| 久久都是精品| 国外成人免费在线播放| 久久精品一级片| 欧美日本一区| 美女视频久久黄| 欧美视频www| 午夜精品毛片| xxxxx成人.com| 一区二区三区在线播放视频| 色综合咪咪久久网| 色偷偷噜噜噜亚洲男人的天堂| 成人小视频免费看| 欧美一级淫片| 中文字幕亚洲图片| 超碰人人人人人人人| av中字幕久久| 色婷婷成人综合| 黄色录像二级片| 1024精品久久久久久久久| 久久视频在线看| 日本中文字幕免费在线观看| 欧美日韩 国产精品| 欧美激情精品久久久久久蜜臀 | 国产一区二区影视| 久久久久国产精品免费免费搜索| 茄子视频成人在线观看| 国产九九在线| 亚洲丝袜另类动漫二区| 日韩不卡视频一区二区| 日韩伦理av| 欧美日韩加勒比精品一区| 国产麻花豆剧传媒精品mv在线| 香蕉久久免费电影| 欧美日韩一区 二区 三区 久久精品| 色戒在线免费观看| 国产区一区二| 精品国产伦一区二区三区观看方式 | 天堂av资源在线观看| 亚洲国产视频一区二区| 欧美精品99久久| 成人国产综合| 日韩精品中文字幕一区二区三区| 青青草成人免费视频| 精品美女久久久| 伦理中文字幕亚洲| 国产黄色片免费看| 青青草97国产精品免费观看| 2019国产精品视频| 日韩有码电影| 国产精品进线69影院| 国产精品www在线观看| 日本成人三级电影| 日韩限制级电影在线观看| 亚洲av成人无码一二三在线观看| 波多野结衣一区| 欧美久久久精品| 国产精品va无码一区二区三区| 麻豆国产精品777777在线| 福利视频一区二区三区| 成人精品福利| 一区二区三区欧美亚洲| av五月天在线| 福利片在线一区二区| 亚洲欧洲日本专区| 欧美精品入口蜜桃| 日韩成人精品在线观看| 操人视频欧美| 欧美成人三区| 欧美性极品少妇精品网站| а 天堂 在线| 精品国产精品| 91国语精品自产拍在线观看性色| 91亚洲国产成人精品一区| 91丝袜国产在线播放| 人人妻人人澡人人爽精品欧美一区| 日本午夜大片a在线观看| 制服丝袜亚洲色图| 性猛交娇小69hd| 日韩视频不卡| 超碰97在线资源| 米奇精品一区二区三区| 日本久久精品电影| 男人网站在线观看| 欧美精品福利| 成人国产精品免费视频| 精品资源在线看| 精品久久久久久久久中文字幕| 超碰人人cao| 亚欧美无遮挡hd高清在线视频| 国产精品99久久久久久久久| 亚洲欧美日韩动漫| 亚洲第一福利视频在线| 精品人妻一区二区三区免费| 久久国产小视频| 国产精品久久久久久久av大片| 亚洲欧美综合在线观看| 五月婷婷色综合| 亚洲精品久久一区二区三区777 | www.五月婷婷.com| 99re这里只有精品视频首页| 欧美亚洲色图视频| 欧美a级大片在线| 久久国产精品久久久久久| 一道本无吗一区| 综合久久一区二区三区| 亚洲综合20p| 国产精品久久久久蜜臀| 国产在线视频91| 国产区在线看| 日韩欧美国产小视频| a在线视频播放观看免费观看| 狠狠色丁香久久婷婷综合丁香| 中文字幕日韩一区二区三区| 亚洲毛片在线免费| 日韩一区二区三区国产| 国产孕妇孕交大片孕| 最好看的中文字幕久久| 欧美视频亚洲图片| 欧美国产先锋| 国产精品区二区三区日本| 999av小视频在线| 日韩电影在线观看中文字幕| 日本韩国欧美中文字幕| 国产色婷婷亚洲99精品小说| 久久这里只精品| 99视频精品全国免费| 亚洲最大av网站| 98色花堂精品视频在线观看| 日韩电影中文字幕| 国产偷人爽久久久久久老妇app | 国产精品77777| 亚洲 欧美 综合 另类 中字| 亚洲成a人片77777在线播放| 国产精品美女久久久久久免费| 色的视频在线免费看| 欧美一区二区视频网站| 国产精品16p| 久久毛片高清国产| 小明看看成人免费视频| 中文字幕日韩一区二区不卡| 国产中文一区二区| 亚洲综合电影| 久久久91精品国产一区不卡| 亚洲色图21p| 欧美日韩亚洲综合在线| 美女毛片在线观看| 26uuu色噜噜精品一区二区| 中文字幕在线观看第三页| 综合久久亚洲| 蜜桃成人在线| 精品三级国产| 国产成人一区三区| 老司机精品视频在线观看6| 亚洲国产精品va在线| 做爰无遮挡三级| 亚洲成人av电影在线| 日本在线观看网址| 97精品电影院| 国产乱叫456| 三级一区在线视频先锋| www.激情网| 手机亚洲手机国产手机日韩| 国产欧美日韩综合精品二区| 日韩欧美激情| 欧洲s码亚洲m码精品一区| 国产精品剧情| 影音先锋欧美精品| 高清乱码毛片入口| 欧美二区三区91| 亚洲成熟少妇视频在线观看| 亚洲综合一二三区| 中文字幕在线观看2018| 国产欧美视频在线观看| 看全色黄大色黄女片18| 激情图区综合网| 熟女人妇 成熟妇女系列视频| 韩国精品一区二区三区| 综合国产精品久久久| 久久99国产精品视频| 国产一区二区在线观看免费播放| 一区二区三区| 国产精品视频免费在线观看| 原纱央莉成人av片| 91av免费观看91av精品在线| 青青草原av在线| 另类美女黄大片| 欧洲不卡av| 中文字幕精品www乱入免费视频| 天堂中文在线8| 亚洲国产精品成人av| wwwav网站| 91精品国产日韩91久久久久久| 中文文字幕一区二区三三| 日韩欧美国产视频| 久久精品一二区| 香蕉久久一区二区不卡无毒影院| 亚洲色图综合区| 亚洲美女淫视频| 波多野结衣不卡视频| 亚洲色图在线播放| 国产精品国产精品88| 亚洲色图欧美偷拍| 破处女黄色一级片| 亚洲美女淫视频| 欧美日韩中文视频| 亚洲国产精品一区二区尤物区| 国产中文字幕免费| 亚洲国产aⅴ天堂久久| 国产亚洲精品成人| 亚洲一二三区视频在线观看| 国产精品2020| 欧美午夜片欧美片在线观看| 一级片免费在线播放| 色噜噜偷拍精品综合在线| 亚洲 日本 欧美 中文幕| 在线欧美日韩精品| 亚洲第一区av| 6080午夜不卡| 亚洲国产一二三区| 亚洲黄在线观看| 精品成人一区二区三区免费视频| 亚洲性视频网址| 九色porny丨首页在线| 欧美精品xxx| 在线观看特色大片免费视频| 国产极品精品在线观看| 国产精品伦一区二区| 亚洲va国产va天堂va久久| 136国产福利精品导航网址应用| 国产精品麻豆免费版| 欧美精美视频| 国产高清免费在线| 亚洲高清网站| 玩弄japan白嫩少妇hd| 久久国产精品99久久久久久老狼| 一本之道在线视频| eeuss影院一区二区三区| 国产免费一区二区三区网站免费| 中文字幕一区二区三区视频| 国产一二三四区| 精品久久久久久电影| 中文字幕av在线免费观看| 欧美成人aa大片| 欧洲视频在线免费观看| 久久精品国产亚洲| 18aaaa精品欧美大片h| 国产精品日韩在线播放| 亚洲精品在线a| 欧美一区亚洲二区| 欧美va天堂| 午夜免费一区二区| 岛国av在线一区| 精品人妻少妇嫩草av无码| 国产精品不卡一区| 亚洲天堂日韩av| 51精品国自产在线| 天堂在线中文| 久久91精品国产| 成人深夜福利| 久久综合婷婷综合| 亚洲先锋影音| 国产小视频精品| 99在线精品免费| 高h视频免费观看| 欧美色倩网站大全免费| 手机av在线免费观看| 久久精品国产2020观看福利| 超级碰碰久久| 国产精品一区二区三区在线| 久久人人88| 可以免费观看av毛片| 福利电影一区二区| 国产免费美女视频| 日本丶国产丶欧美色综合| 刘玥91精选国产在线观看| 久久韩国免费视频| 电影在线观看一区二区| 国产在线一区二区三区四区| 午夜久久久久| 四季av一区二区三区| 国产天堂亚洲国产碰碰| 亚洲 欧美 视频| 精品国产乱码久久久久久图片 | 久久久精品麻豆| 久久综合久久99| 国产无套内射又大又猛又粗又爽| 91精品国产手机| 黄色在线视频网站| 国产精品亚洲综合天堂夜夜| 最近国产精品视频| 日韩av在线第一页| 成人a免费在线看| 免费一级全黄少妇性色生活片| 3d动漫精品啪啪一区二区竹菊| jizz日韩| 国产精品麻豆va在线播放| 精品日产免费二区日产免费二区| 无码人妻h动漫| 91麻豆免费在线观看| www成人在线| 精品视频中文字幕| 亚洲免费福利| 蜜桃传媒视频麻豆一区| 国产精品一国产精品k频道56| 182在线视频| 欧美视频第一页| 欧美成人免费| 国产99视频在线观看| 国产成人黄色| 国产高潮免费视频| 国产日韩亚洲欧美综合| 最近中文字幕免费在线观看| 国产亚洲欧美视频| 精品久久福利| 糖心vlog在线免费观看| 国产成人av资源| 日韩欧美a级片| 亚洲欧美一区二区三区情侣bbw| 成人欧美一区二区三区的电影| 日本成人黄色| 麻豆高清免费国产一区| 国产这里有精品| 亚洲激情中文字幕| 日韩成人av电影| 亚洲三区视频| 国产v综合v亚洲欧| 日韩 欧美 综合| 国产亚洲精品日韩| 欧美天堂一区| 精品国偷自产一区二区三区| 99国产精品视频免费观看| 国产真人无遮挡作爱免费视频| 最近2019中文字幕大全第二页| 欧美高清hd| 激情五月宗合网| 日本一区二区成人在线| va婷婷在线免费观看| 欧美性视频网站| 999久久久91| 国产高清成人久久| 欧美伊人精品成人久久综合97 | 亚洲免费av在线| 天堂成人在线观看| 国产精品日日摸夜夜添夜夜av| 综合激情婷婷| 成人免费毛片糖心| 欧美一区二区三区小说| 中文在线资源| 看一级黄色录像| 久久久久久日产精品| 国产www免费观看| 日本精品在线视频| 夜间精品视频|