午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識(shí)庫 > Redis延遲隊(duì)列和分布式延遲隊(duì)列的簡(jiǎn)答實(shí)現(xiàn)

Redis延遲隊(duì)列和分布式延遲隊(duì)列的簡(jiǎn)答實(shí)現(xiàn)

熱門標(biāo)簽:魔獸2青云地圖標(biāo)注 日本中國(guó)地圖標(biāo)注 貴州電銷卡外呼系統(tǒng) 鄭州人工智能電銷機(jī)器人系統(tǒng) 十堰營(yíng)銷電銷機(jī)器人哪家便宜 山東外呼銷售系統(tǒng)招商 超呼電話機(jī)器人 北京400電話辦理收費(fèi)標(biāo)準(zhǔn) 宿遷便宜外呼系統(tǒng)平臺(tái)

        最近,又重新學(xué)習(xí)了下Redis,Redis不僅能快還能慢,簡(jiǎn)直利器,今天就為大家介紹一下Redis延遲隊(duì)列和分布式延遲隊(duì)列的簡(jiǎn)單實(shí)現(xiàn)。

  在我們的工作中,很多地方使用延遲隊(duì)列,比如訂單到期沒有付款取消訂單,制訂一個(gè)提醒的任務(wù)等都需要延遲隊(duì)列,那么我們需要實(shí)現(xiàn)延遲隊(duì)列。我們本文的梗概如下,同學(xué)們可以選擇性閱讀。

1. 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的延遲隊(duì)列。

  我們知道目前JAVA可以有DelayedQueue,我們首先開一個(gè)DelayQueue的結(jié)構(gòu)類圖。DelayQueue實(shí)現(xiàn)了Delay、BlockingQueue接口。也就是DelayQueue是一種阻塞隊(duì)列。

  我們?cè)诳匆幌翫elay的類圖。Delayed接口也實(shí)現(xiàn)了Comparable接口,也就是我們使用Delayed的時(shí)候需要實(shí)現(xiàn)CompareTo方法。因?yàn)殛?duì)列中的數(shù)據(jù)需要排一下先后,根據(jù)我們自己的實(shí)現(xiàn)。Delayed接口里邊有一個(gè)方法就是getDelay方法,用于獲取延遲時(shí)間,判斷是否時(shí)間已經(jīng)到了延遲的時(shí)間,如果到了延遲的時(shí)間就可以從隊(duì)列里邊獲取了。

  我們創(chuàng)建一個(gè)Message類,實(shí)現(xiàn)了Delayed接口,我們主要把getDelay和compareTo進(jìn)行實(shí)現(xiàn)。在Message的構(gòu)造方法的地方傳入延遲的時(shí)間,單位是毫秒,計(jì)算好觸發(fā)時(shí)間fireTime。同時(shí)按照延遲時(shí)間的升序進(jìn)行排序。我重寫了里邊的toString方法,用于將Message按照我寫的方法進(jìn)行輸出。

package com.hqs.delayQueue.bean;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

/**
 * @author huangqingshi
 * @Date 2020-04-18
 */
public class Message implements Delayed {

    private String body;
    private long fireTime;

    public String getBody() {
        return body;
    }

    public long getFireTime() {
        return fireTime;
    }

    public Message(String body, long delayTime) {
        this.body = body;
        this.fireTime = delayTime + System.currentTimeMillis();
    }

    public long getDelay(TimeUnit unit) {

        return unit.convert(this.fireTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }

    public int compareTo(Delayed o) {
        return (int) (this.getDelay(TimeUnit.MILLISECONDS) -o.getDelay(TimeUnit.MILLISECONDS));
    }

    @Override
    public String toString() {
        return System.currentTimeMillis() + ":" + body;
    }

    public static void main(String[] args) throws InterruptedException {
        System.out.println(System.currentTimeMillis() + ":start");
        BlockingQueueMessage> queue = new DelayQueue>();
        Message message1 = new Message("hello", 1000 * 5L);
        Message message2 = new Message("world", 1000 * 7L);

        queue.put(message1);
        queue.put(message2);

        while (queue.size() > 0) {
            System.out.println(queue.take());
        }
    }
}

  里邊的main方法里邊聲明了兩個(gè)Message,一個(gè)延遲5秒,一個(gè)延遲7秒,時(shí)間到了之后會(huì)將接取出并且打印。輸出的結(jié)果如下,正是我們所期望的。

1587218430786:start
1587218435789:hello
1587218437793:world

  這個(gè)方法實(shí)現(xiàn)起來真的非常簡(jiǎn)單。但是缺點(diǎn)也是很明顯的,就是數(shù)據(jù)在內(nèi)存里邊,數(shù)據(jù)比較容易丟失。那么我們需要采用Redis實(shí)現(xiàn)分布式的任務(wù)處理。

  2. 使用Redis的list實(shí)現(xiàn)分布式延遲隊(duì)列。

  本地需要安裝一個(gè)Redis,我自己是使用Docker構(gòu)建一個(gè)Redis,非常快速,命令也沒多少。我們直接啟動(dòng)Redis并且暴露6379端口。進(jìn)入之后直接使用客戶端命令即可查看和調(diào)試數(shù)據(jù)。

docker pull redis
docker run -itd --name redisLocal -p 6379:6379 redis
docker exec -it redisLocal /bin/bash
redis-cli

  我本地采用spring-boot的方式連接redis,pom文件列一下,供大家參考。

?xml version="1.0" encoding="UTF-8"?>
project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    modelVersion>4.0.0/modelVersion>
    parent>
        groupId>org.springframework.boot/groupId>
        artifactId>spring-boot-starter-parent/artifactId>
        version>2.2.6.RELEASE/version>
        relativePath/> !-- lookup parent from repository -->
    /parent>
    groupId>com.hqs/groupId>
    artifactId>delayQueue/artifactId>
    version>0.0.1-SNAPSHOT/version>
    name>delayQueue/name>
    description>Demo project for Spring Boot/description>

    properties>
        java.version>1.8/java.version>
    /properties>

    dependencies>
        dependency>
            groupId>org.springframework.boot/groupId>
            artifactId>spring-boot-starter/artifactId>
        /dependency>

        dependency>
            groupId>org.springframework.boot/groupId>
            artifactId>spring-boot-starter-test/artifactId>
            scope>test/scope>
            exclusions>
                exclusion>
                    groupId>org.junit.vintage/groupId>
                    artifactId>junit-vintage-engine/artifactId>
                /exclusion>
            /exclusions>
        /dependency>
        dependency>
            groupId>org.springframework.boot/groupId>
            artifactId>spring-boot-starter-data-redis/artifactId>
        /dependency>
        dependency>
            groupId>org.springframework.boot/groupId>
            artifactId>spring-boot-starter-web/artifactId>
        /dependency>
        dependency>
            groupId>redis.clients/groupId>
            artifactId>jedis/artifactId>
            version>2.9.0/version>
        /dependency>
        dependency>
            groupId>org.springframework.boot/groupId>
            artifactId>spring-boot-devtools/artifactId>
            scope>runtime/scope>
        /dependency>
        dependency>
            groupId>org.projectlombok/groupId>
            artifactId>lombok/artifactId>
            optional>true/optional>
        /dependency>
    /dependencies>

    build>
        plugins>
            plugin>
                groupId>org.springframework.boot/groupId>
                artifactId>spring-boot-maven-plugin/artifactId>
            /plugin>
        /plugins>
    /build>

/project>

  加上Redis的配置放到application.properties里邊即可實(shí)現(xiàn)Redis連接,非常的方便。

# redis
redis.host=127.0.0.1
redis.port=6379
redis.password=
redis.maxIdle=100
redis.maxTotal=300
redis.maxWait=10000
redis.testOnBorrow=true
redis.timeout=100000

  接下來實(shí)現(xiàn)一個(gè)基于Redis的list數(shù)據(jù)類型進(jìn)行實(shí)現(xiàn)的一個(gè)類。我們使用RedisTemplate操作Redis,這個(gè)里邊封裝好我們所需要的Redis的一些方法,用起來非常方便。這個(gè)類允許延遲任務(wù)做多有10W個(gè),也是避免數(shù)據(jù)量過大對(duì)Redis造成影響。如果在線上使用的時(shí)候也需要考慮延遲任務(wù)的多少。太多幾百萬幾千萬的時(shí)候可能數(shù)據(jù)量非常大,我們需要計(jì)算Redis的空間是否夠。這個(gè)代碼也是非常的簡(jiǎn)單,一個(gè)用于存放需要延遲的消息,采用offer的方法。另外一個(gè)是啟動(dòng)一個(gè)線程, 如果消息時(shí)間到了,那么就將數(shù)據(jù)lpush到Redis里邊。

package com.hqs.delayQueue.cache;

import com.hqs.delayQueue.bean.Message;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.concurrent.BlockingQueue;

/**
 * @author huangqingshi
 * @Date 2020-04-18
 */
@Slf4j
public class RedisListDelayedQueue{

    private static final int MAX_SIZE_OF_QUEUE = 100000;
    private RedisTemplateString, String> redisTemplate;
    private String queueName;
    private BlockingQueueMessage> delayedQueue;

    public RedisListDelayedQueue(RedisTemplateString, String> redisTemplate, String queueName, BlockingQueueMessage> delayedQueue) {
        this.redisTemplate = redisTemplate;
        this.queueName = queueName;
        this.delayedQueue = delayedQueue;
        init();
    }

    public void offerMessage(Message message) {
        if(delayedQueue.size() > MAX_SIZE_OF_QUEUE) {
            throw new IllegalStateException("超過隊(duì)列要求最大值,請(qǐng)檢查");
        }
        try {
            log.info("offerMessage:" + message);
            delayedQueue.offer(message);
        } catch (Exception e) {
            log.error("offMessage異常", e);
        }
    }

    public void init() {
        new Thread(() -> {
            while(true) {
                try {
                    Message message = delayedQueue.take();
                    redisTemplate.opsForList().leftPush(queueName, message.toString());
                } catch (InterruptedException e) {
                    log.error("取消息錯(cuò)誤", e);
                }
            }
        }).start();
    }
}

  接下來我們看一下,我們寫一個(gè)測(cè)試的controller。大家看一下這個(gè)請(qǐng)求/redis/listDelayedQueue的代碼位置。我們也是生成了兩個(gè)消息,然后把消息放到隊(duì)列里邊,另外我們?cè)趩?dòng)一個(gè)線程任務(wù),用于將數(shù)據(jù)從Redis的list中獲取。方法也非常簡(jiǎn)單。

package com.hqs.delayQueue.controller;

import com.hqs.delayQueue.bean.Message;
import com.hqs.delayQueue.cache.RedisListDelayedQueue;
import com.hqs.delayQueue.cache.RedisZSetDelayedQueue;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Set;
import java.util.concurrent.*;

/**
 * @author huangqingshi
 * @Date 2020-04-18
 */
@Slf4j
@Controller
public class DelayQueueController {

    private static final int CORE_SIZE = Runtime.getRuntime().availableProcessors();

    //注意RedisTemplate用的String,String,后續(xù)所有用到的key和value都是String的
    @Autowired
    RedisTemplateString, String> redisTemplate;

    private static ThreadPoolExecutor taskExecPool = new ThreadPoolExecutor(CORE_SIZE, CORE_SIZE, 0, TimeUnit.SECONDS,
            new LinkedBlockingDeque>());

    @GetMapping("/redisTest")
    @ResponseBody
    public String redisTest() {
        redisTemplate.opsForValue().set("a","b",60L, TimeUnit.SECONDS);
        System.out.println(redisTemplate.opsForValue().get("a"));
        return "s";
    }

    @GetMapping("/redis/listDelayedQueue")
    @ResponseBody
    public String listDelayedQueue() {

        Message message1 = new Message("hello", 1000 * 5L);
        Message message2 = new Message("world", 1000 * 7L);

        String queueName = "list_queue";

        BlockingQueueMessage> delayedQueue = new DelayQueue>();

        RedisListDelayedQueue redisListDelayedQueue = new RedisListDelayedQueue(redisTemplate, queueName, delayedQueue);

        redisListDelayedQueue.offerMessage(message1);
        redisListDelayedQueue.offerMessage(message2);
        asyncListTask(queueName);

        return "success";
    }

    @GetMapping("/redis/zSetDelayedQueue")
    @ResponseBody
    public String zSetDelayedQueue() {

        Message message1 = new Message("hello", 1000 * 5L);
        Message message2 = new Message("world", 1000 * 7L);

        String queueName = "zset_queue";

        BlockingQueueMessage> delayedQueue = new DelayQueue>();

        RedisZSetDelayedQueue redisZSetDelayedQueue = new RedisZSetDelayedQueue(redisTemplate, queueName, delayedQueue);

        redisZSetDelayedQueue.offerMessage(message1);
        redisZSetDelayedQueue.offerMessage(message2);
        asyncZSetTask(queueName);

        return "success";
    }

    public void asyncListTask(String queueName) {
        taskExecPool.execute(() -> {
            for(;;) {
                String message = redisTemplate.opsForList().rightPop(queueName);
                if(message != null) {
                    log.info(message);
                }
            }
        });
    }

    public void asyncZSetTask(String queueName) {
        taskExecPool.execute(() -> {
            for(;;) {
                Long nowTimeInMs = System.currentTimeMillis();
                System.out.println("nowTimeInMs:" + nowTimeInMs);
                SetString> messages = redisTemplate.opsForZSet().rangeByScore(queueName, 0, nowTimeInMs);
                if(messages != null  messages.size() != 0) {
                    redisTemplate.opsForZSet().removeRangeByScore(queueName, 0, nowTimeInMs);
                    for (String message : messages) {
                        log.info("asyncZSetTask:" + message + " " + nowTimeInMs);
                    }
                    log.info(redisTemplate.opsForZSet().zCard(queueName).toString());
                }
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }

}

  我就不把運(yùn)行結(jié)果寫出來了,感興趣的同學(xué)自己自行試驗(yàn)。當(dāng)然這個(gè)方法也是從內(nèi)存中拿出數(shù)據(jù),到時(shí)間之后放到Redis里邊,還是會(huì)存在程序啟動(dòng)的時(shí)候,任務(wù)進(jìn)行丟失。我們繼續(xù)看另外一種方法更好的進(jìn)行這個(gè)問題的處理。

3.使用Redis的zSet實(shí)現(xiàn)分布式延遲隊(duì)列。

  我們需要再寫一個(gè)ZSet的隊(duì)列處理。下邊的offerMessage主要是把消息直接放入緩存中。采用Redis的ZSET的zadd方法。zadd(key, value, score) 即將key=value的數(shù)據(jù)賦予一個(gè)score, 放入緩存中。score就是計(jì)算出來延遲的毫秒數(shù)。

package com.hqs.delayQueue.cache;

import com.hqs.delayQueue.bean.Message;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.concurrent.BlockingQueue;

/**
 * @author huangqingshi
 * @Date 2020-04-18
 */
@Slf4j
public class RedisZSetDelayedQueue {

    private static final int MAX_SIZE_OF_QUEUE = 100000;
    private RedisTemplateString, String> redisTemplate;
    private String queueName;
    private BlockingQueueMessage> delayedQueue;

    public RedisZSetDelayedQueue(RedisTemplateString, String> redisTemplate, String queueName, BlockingQueueMessage> delayedQueue) {
        this.redisTemplate = redisTemplate;
        this.queueName = queueName;
        this.delayedQueue = delayedQueue;
    }

    public void offerMessage(Message message) {
        if(delayedQueue.size() > MAX_SIZE_OF_QUEUE) {
            throw new IllegalStateException("超過隊(duì)列要求最大值,請(qǐng)檢查");
        }
        long delayTime = message.getFireTime() - System.currentTimeMillis();
        log.info("zset offerMessage" + message + delayTime);
        redisTemplate.opsForZSet().add(queueName, message.toString(), message.getFireTime());
    }

}

  上邊的Controller方法已經(jīng)寫好了測(cè)試的方法。/redis/zSetDelayedQueue,里邊主要使用ZSet的zRangeByScore(key, min, max)。主要是從score從0,當(dāng)前時(shí)間的毫秒數(shù)獲取。取出數(shù)據(jù)后再采用removeRangeByScore,將數(shù)據(jù)刪除。這樣數(shù)據(jù)可以直接寫到Redis里邊,然后取出數(shù)據(jù)后直接處理。這種方法比前邊的方法稍微好一些,但是實(shí)際上還存在一些問題,因?yàn)橐蕾嘡edis,如果Redis內(nèi)存不足或者連不上的時(shí)候,系統(tǒng)將變得不可用。

4. 總結(jié)一下,另外還有哪些可以延遲隊(duì)列。

  上面的方法其實(shí)還是存在問題的,比如系統(tǒng)重啟的時(shí)候還是會(huì)造成任務(wù)的丟失。所以我們?cè)谏a(chǎn)上使用的時(shí)候,我們還需要將任務(wù)保存起來,比如放到數(shù)據(jù)庫和文件存儲(chǔ)系統(tǒng)將數(shù)據(jù)存儲(chǔ)起來,這樣做到double-check,雙重檢查,最終達(dá)到任務(wù)的99.999%能夠處理。

  其實(shí)還有很多東西可以實(shí)現(xiàn)延遲隊(duì)列。

  1) RabbitMQ就可以實(shí)現(xiàn)此功能。這個(gè)消息隊(duì)列可以把數(shù)據(jù)保存起來并且進(jìn)行處理。

  2)Kafka也可以實(shí)現(xiàn)這個(gè)功能。

  3)Netty的HashedWheelTimer也可以實(shí)現(xiàn)這個(gè)功能。

最后放上我的代碼: https://github.com/stonehqs/delayQueue

到此這篇關(guān)于Redis延遲隊(duì)列和分布式延遲隊(duì)列的簡(jiǎn)答實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Redis延遲隊(duì)列和分布式延遲隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 基于Redis延遲隊(duì)列的實(shí)現(xiàn)代碼
  • SpringBoot集成Redisson實(shí)現(xiàn)延遲隊(duì)列的場(chǎng)景分析
  • php使用redis的有序集合zset實(shí)現(xiàn)延遲隊(duì)列應(yīng)用示例

標(biāo)簽:北京 朝陽 吉安 大慶 臺(tái)州 果洛 江蘇 楊凌

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis延遲隊(duì)列和分布式延遲隊(duì)列的簡(jiǎn)答實(shí)現(xiàn)》,本文關(guān)鍵詞  Redis,延遲,隊(duì)列,和,分布式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Redis延遲隊(duì)列和分布式延遲隊(duì)列的簡(jiǎn)答實(shí)現(xiàn)》相關(guān)的同類信息!
  • 本頁收集關(guān)于Redis延遲隊(duì)列和分布式延遲隊(duì)列的簡(jiǎn)答實(shí)現(xiàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产黄色片av| 欧美乱妇40p| 日韩在线播放一区二区| 日韩精品视频免费看| 欧美精品自拍视频| 欧美激情a∨在线视频播放| 日韩经典中文字幕在线观看| 三级黄色片网站| 17婷婷久久www| 久久亚洲一级片| 天堂久久久久久| 国产一区二区精品在线| 精品国产精品网麻豆系列| 久久久久久麻豆| 在线观看日批视频| 欧美日韩电影一区二区三区| 亚洲欧美aaa| 少妇特黄一区二区三区| 亚洲aa在线观看| 欧美中文一区二区三区| 欧美在线视频全部完| 日韩欧美aⅴ综合网站发布| 久久尤物电影视频在线观看| 三叶草欧洲码在线| 国产精品久久久久免费| 亚洲 欧美综合在线网络| 大白屁股一区二区视频| www.久久视频| 综合视频免费看| 97人人做人人爱| 国产欧美一区二区精品性| 韩国三级hd中文字幕| 精品中文字幕一区| 亚洲欧美日韩网| 色综合久久久久久久久久久| 无套白嫩进入乌克兰美女| 精品国产乱码久久久久久闺蜜| 国产在线成人精品午夜| 久久黄色免费网站| 国产亚洲激情视频在线| 在线欧美日韩精品| 奇米影视在线99精品| 69av视频在线观看| 亚洲中文字幕久久精品无码喷水| 国产九九精品视频| 亚洲国产综合视频在线观看| 国产91精品露脸国语对白| 激情伊人五月天久久综合| 欧美高清在线精品一区| 欧美人动与zoxxxx乱| 日韩精品中午字幕| 久久偷看各类女兵18女厕嘘嘘| 欧美丰满嫩嫩电影| 久久蜜桃av一区二区天堂| 91精品中文字幕| 91嫩草丨国产丨精品| 亚洲国产无码精品| 国a精品视频大全| www成人在线观看| 亚洲毛片亚洲毛片亚洲毛片| aa成人免费视频| 国产精品一区二区欧美| 亚洲人成网站免费播放| 在线视频国内自拍亚洲视频| 午夜久久久久久电影| 亚洲欧洲日本专区| 国产精品91久久久| av影院在线播放| 一级黄色电影片| www.555国产精品免费| 日本www高清视频| 亚洲春色综合另类校园电影| 国产精品扒开腿做爽爽爽男男| 欧美日韩电影在线观看| 精品sm捆绑视频| 丝袜亚洲另类欧美| 久久人妻少妇嫩草av无码专区| 国产日韩欧美视频在线| 国产一区二区三区直播精品电影| 一区二区三区动漫| 欧美少妇一区二区| 亚洲精品成人av| 亚洲午夜国产成人av电影男同| 国产精品女主播视频| 九一精品在线观看| 一二三四区在线| 久久九九99视频| 亚洲免费在线播放| 国产精品久久久久四虎| av动漫一区二区| 免费不卡在线视频| 国产精品综合av一区二区国产馆| 国产成人亚洲综合a∨猫咪| 亚洲精品视频网址| 亚洲综合欧美日韩| 色综合久综合久久综合久鬼88| 亚洲色图视频免费播放| 欧美美女喷水视频| 亚洲精品www久久久| 欧美年轻男男videosbes| 欧美日韩国产乱码电影| 91高潮在线观看| 亚洲 激情 在线| 亚洲欧美高清视频| 一区二区三区中文字幕精品精品| 一本色道久久88亚洲综合88 | 中文字幕综合在线观看| 亚洲黄色一区二区三区| 免费视频爱爱太爽了| 69久久精品无码一区二区| 97av视频在线观看| 国产精品久久久久久av下载红粉 | 亚洲成人生活片| 国产一区二区三区视频免费观看| 国产又大又长又粗| 国产免费一区二区三区免费视频| 激情偷乱视频一区二区三区| 亚洲va在线va天堂| 国产日本欧美一区二区三区在线| 日本中文字幕精品—区二区| 国产77777| 亚洲一区二区在线免费看| 亚洲日本成人网| 欧美激情高清视频| 91沈先生作品| 亚洲不卡1区| 999这里有精品| 亚洲女优在线观看| 日韩欧美国产综合在线| 视频一区二区精品| 91在线视频精品| 国产精品白嫩初高中害羞小美女| 日韩在线国产| 亚洲911精品成人18网站| 久久aaaa片一区二区| 亚洲一区二区视频在线播放| 亚洲欧美日韩一区二区| 国产欧美日韩免费| 91狠狠综合久久久久久| 亚洲一区在线观看网站| 91九色视频导航| 亚洲欧美另类动漫| 欧美黄色一级网站| www.日韩高清| 国产欧美中文在线| 制服丝袜日韩国产| 欧美激情亚洲综合一区| 91亚洲va在线va天堂va国| 欧美激情va永久在线播放| 久久久久久久国产精品| 欧美激情图片区| 日韩av电影手机在线观看| 男人天堂成人在线| 国产香蕉视频在线| 日本激情一区二区三区| 亚洲国产三级在线| 国产精品久久久| www.超碰在线观看| 色婷婷精品久久二区二区蜜臂av| 警花观音坐莲激情销魂小说| 久久久久久无码午夜精品直播| 在线免费不卡视频| av一区二区三区在线观看| 蜜臀av.com| 九九九视频在线观看| 丝瓜av网站精品一区二区 | 欧美三级电影在线看| 亚洲欧美日韩天堂| 亚洲国产精品视频一区| 久久婷婷国产麻豆91| 久久精品一区二区三区av| 国产一区二区三区久久精品| 夜夜爽www精品| 欧美成人在线免费观看| 欧美专区第二页| 国产xxxx在线观看| 日韩欧美精品网址| 亚洲a在线播放| 无码人妻丰满熟妇区毛片蜜桃精品| 免费麻豆国产一区二区三区四区| 天天干在线观看| 日本高清不卡aⅴ免费网站| 亚洲综合精品伊人久久| 一区二区三区在线观看www| 日本熟妇人妻xxxxx| 欧美a视频在线观看| 亚洲国产99精品国自产| 男人添女人下面高潮视频| 五月婷婷开心网| 亚洲一区二三区| 欧美黑人xxx| 国产69精品久久久久久| 久久精品老司机| 成人午夜免费电影| 日韩在线小视频| 黄色一级二级三级| 一区二区三区免费在线| 国产经典欧美精品| 亚洲欧美综合v| 精品欧美一区二区精品久久| 亚洲人人夜夜澡人人爽| 欧美 亚洲 另类 激情 另类| 久久网站热最新地址| 国产精品色午夜在线观看| 97久久久久久久| 国产精品萝li| 国产成人综合亚洲| 亚洲乱码一区二区三区三上悠亚| 黄色录像二级片| 91中文字幕在线播放| 日韩免费视频一区| 久久国产精品网| 一区二区欧美国产| 亚洲色图 在线视频| 精品久久久久久久久国产字幕| 97人人做人人爱| 中文字幕乱码人妻二区三区| 久久激情视频免费观看| 黄色网址在线视频| 国产精品久久久一区麻豆最新章节| 国产日韩欧美在线视频观看| 天天爽夜夜爽夜夜爽精品| 欧美日韩精品一区二区三区 | 亚洲黄色性网站| 色妞欧美日韩在线| 精品熟妇无码av免费久久| 日韩欧美一区二区免费| 超碰成人免费在线| 国产成人一区在线| 国产精品美女久久久久av超清| 国产第一页精品| 一区二区三区黄| 欧美成人自拍视频| 无码人妻丰满熟妇啪啪欧美| 欧美日韩在线三区| 亚洲制服丝袜在线播放| 岛国av一区二区三区| 99视频精品全部免费看| 日本最新不卡在线| 欧美精品一区三区| 五月天色婷婷丁香| 日韩情涩欧美日韩视频| 四虎影院一区二区三区 | 久久福利视频一区二区| 91沈先生作品| 国产在线精品一区二区三区》| 99久久精品国产成人一区二区| 国产一区二区美女视频| 日韩在线不卡一区| 日韩电影免费在线观看网站| 国产精品偷伦免费视频观看的| 无码人妻丰满熟妇奶水区码| 国产精品黄色av| 国产 日韩 欧美大片| 草b视频在线观看| 欧美性69xxxx肥| eeuss中文字幕| 欧美精品第1页| 三级黄色片免费观看| 成人一区二区三区在线观看| 久久伊人一区| 另类欧美日韩国产在线| 欧美一级成年大片在线观看| 国产又黄又嫩又滑又白| 国产精品久久久久久久裸模| 亚洲AV无码成人精品一区| 午夜视频久久久久久| 久久久视频6r| 亚洲精品日产精品乱码不卡| 97在线免费视频观看| 一区二区三区成人| 在线免费黄色网| 蜜芽一区二区三区| 俄罗斯精品一区二区三区| www.中文字幕| 日韩免费一区二区三区| 欧美午夜电影在线| 国产真实乱人偷精品视频| av资源一区二区| 欧美专区日韩专区| 亚洲人久久久| 日韩大片在线观看视频| 黄色免费一级视频| 国产一区二区三区在线免费观看| 国产又粗又黄又猛| 欧美精品少妇一区二区三区 | 亚洲成人综合视频| 中文字幕第24页| 日韩成人在线视频| 99sesese| 亚洲欧美视频在线观看视频| 400部精品国偷自产在线观看| 国产酒店精品激情| 国产在线资源一区| 91偷拍与自偷拍精品| 精人妻一区二区三区| 中文字幕亚洲欧美在线| 日韩一区二区三区四区视频| 一区二区三区动漫| a天堂视频在线| 永久久久久久| 亚洲剧情一区二区| 久久久精品黄色| 国产精品情侣呻吟对白视频| 性欧美.com| 国产丝袜精品视频| 丰满放荡岳乱妇91ww| 欧美少妇性生活视频| 欧美这里有精品| 性猛交娇小69hd| 久久久久久久久久久成人| www.麻豆av| 4444在线观看| 91精品国产欧美一区二区18 | 精品视频免费在线播放| 一区二区三区在线观看网站| 亚洲天堂av线| 制服.丝袜.亚洲.中文.综合 | 欧美精品少妇videofree| 日韩不卡在线观看日韩不卡视频| 成年人视频观看| 欧美一区二区视频在线观看2020 | 国产精品一区二区三区在线| 日韩av在线免费看| 国产精品丝袜久久久久久app| 久久精品女人毛片国产| 777av视频| 国产精品v片在线观看不卡| 高跟丝袜欧美一区| 午夜精品福利在线视频| 97久草视频| 成人免费一区二区三区在线观看| 国产老熟女伦老熟妇露脸| 国产日本欧美一区| 五月天一区二区| 午夜久久久久久久久久影院| 久久久久久久久久码影片| 国产亚洲精久久久久久| 污视频在线观看免费网站| 日韩精品福利在线| 午夜免费福利视频| 欧美日韩午夜爽爽| 欧美日韩国产123区| 青青艹在线观看| 蜜臀av性久久久久蜜臀av| 日韩精品免费在线视频| 久久久久中文| 999精品视频在线| 成人激情视频在线| 色哟哟在线观看一区二区三区| 日韩黄色免费网站| 在线观看日本网站| 日韩精品123区| 国产色视频在线播放| 蜜桃免费一区二区三区| 久久综合伊人77777蜜臀| 欧美日韩亚洲国产综合| 成人性生交大片免费看中文网站| 国产女主播在线播放| 亚洲影视中文字幕| 亚洲成人资源网| 国产精品一级视频| 男人天堂网视频| 欧亚精品中文字幕| 欧美午夜影院一区| 国产成人综合视频| 玖玖爱这里只有精品| 日韩av电影中文字幕| 国产三级精品视频| 欧美日韩高清丝袜| 91成人免费观看| 色综合久久中文字幕综合网| 国产裸体无遮挡| 国产黑丝在线视频| 视频一区在线免费观看| xxx成人少妇69| 欧美日韩一区二区三区不卡| 国产成人麻豆免费观看| 亚洲无在线观看| 国产精品久久久久久久久久久新郎 | 成人中文字幕在线| 欧美激情 一区| 国产欧美日韩一区二区三区| 欧美午夜电影网| 九一久久久久久| 成人无码av片在线观看| 777久久精品一区二区三区无码 | 久久久久久91| 久久精品99久久香蕉国产色戒| 蜜臀av性久久久久蜜臀av麻豆| 丰满岳乱妇一区二区| 亚洲国产另类久久久精品极度| 色婷婷**av毛片一区| 香蕉加勒比综合久久| 国产精品19乱码一区二区三区| 男人的天堂avav| 91在线精品观看| 奇米成人av国产一区二区三区| 欧美日韩免费一区二区三区视频| 午夜天堂影视香蕉久久| 国产精品成人免费| 久久精品亚洲国产奇米99| 久久av资源站| 一级特黄aaa| 国产午夜手机精彩视频| 无码人妻丰满熟妇区毛片| 久久久av水蜜桃| 中文字幕不卡av| 91精品国产综合久久香蕉麻豆| 国产午夜久久久久|