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

Redis 分頁 + 多條件模糊查詢太頭疼?這套方案幫你輕松搞定!

數據庫 Redis
根據不同的業務場景選擇合適的數據結構,比如有序集合適合需要排序和范圍查詢的場景,集合適合需要去重和交集、并集操作的場景,字符串適合存儲單個對象的詳細信息。

我猜不少搞 Java 開發的兄弟,在項目里碰到 Redis 分頁和多條件模糊查詢的時候,都跟我一樣,心里直犯嘀咕:"這玩意兒咋整啊?咋就這么難搞呢?" 別慌,今兒個咱就來好好嘮嘮,怎么把這倆難題輕松搞定,讓你在同事面前狠狠露一手!

一、先搞明白為啥 Redis 分頁和多條件模糊查詢讓人頭大

咱先說說 Redis 分頁。用過 Redis 的都知道,它和咱們熟悉的 MySQL 這些關系型數據庫不一樣。MySQL 里有個 LIMIT 關鍵字,分頁查詢那叫一個方便,直接就能指定查第幾頁、每頁多少條。可 Redis 呢,它主要是基于內存的鍵值對存儲,數據結構雖然豐富,但原生就沒有像數據庫那樣專門的分頁功能。

你要是存的數據是放在列表(List)里,想分頁的話,可能得用 LRANGE 命令。比如說列表鍵是 users,想查第 1 頁,每頁 10 條,就用 LRANGE users 0 9。乍一看好像還行,可要是列表里的數據是動態變化的,比如經常有新增、刪除操作,列表里元素的位置就會變,這時候用 LRANGE 分頁,結果可能就不準確了。而且要是列表特別大,每次用 LRANGE 都得遍歷一堆元素,性能也會受影響。

再看看多條件模糊查詢。Redis 本身的查詢能力比較有限,不像數據庫能支持復雜的 SQL 語句,什么 LIKE 啊、多個條件組合啊都能輕松搞定。Redis 里的鍵匹配,一般就靠 KEYS 命令或者 SCAN 命令。KEYS 命令能根據通配符匹配鍵,比如 KEYS user:* 能查出所有以 user: 開頭的鍵,可這玩意兒有個大問題,它是全量掃描,在生產環境用的話,要是鍵的數量特別多,會把 Redis 搞得很慢,甚至卡住。

SCAN 命令雖然能增量掃描,避免全量掃描的問題,但它返回的只是鍵,要是你想根據鍵對應的值里的多個條件進行模糊查詢,比如用戶表里要根據用戶名包含 "張三",年齡在 20 到 30 之間來查詢,SCAN 就沒辦法直接做到了,你得把鍵對應的所有值都取出來,在應用層進行過濾,這就會增加應用服務器的負擔,而且效率也不高。

舉個簡單的例子,假設咱們有個電商項目,要在 Redis 里存儲商品信息,每個商品的鍵是 product:1、product:2 這樣的形式,值是 JSON 格式,包含商品名稱、價格、類別等信息。現在要查詢名稱里包含 "手機",價格在 2000 到 4000 之間的商品,并且要分頁顯示。這時候問題就來了,怎么根據商品名稱和價格這兩個條件來查詢呢?直接用 Redis 原生的功能很難實現,這就需要咱們想辦法來解決。

二、搞定 Redis 分頁的實用方案

(一)基于有序集合(Sorted Set)的分頁方案

有序集合是 Redis 里一個很強大的數據結構,它每個元素都有一個分數(score),可以根據分數對元素進行排序。咱們可以利用這個特性來實現分頁。

比如說,咱們還是以用戶數據為例,每個用戶有一個唯一的 ID,咱們可以把用戶 ID 作為有序集合的成員,把用戶的創建時間作為分數。這樣有序集合里的元素就是按照創建時間排序的。

要實現分頁查詢,假設每頁顯示 n 條數據,第 m 頁的起始索引就是 (m - 1) * n,結束索引就是 m * n - 1。然后用 ZRANGE 命令來獲取指定范圍內的成員。比如有序集合鍵是 users_sorted,查第 1 頁,每頁 10 條,就是 ZRANGE users_sorted 0 9。

但是這里有個問題,如果用戶數據是不斷更新的,比如有用戶刪除了,有序集合里的元素數量會減少,這時候原來的索引就會發生變化。不過對于大部分分頁場景來說,只要不是頻繁刪除中間的元素,這種方案還是比較可行的。

(二)記錄上一頁最后一個元素的分頁方案

這種方案適合數據是按照一定順序排列的情況,比如時間順序。咱們在查詢上一頁數據的時候,記錄下最后一個元素的相關信息,比如時間戳或者 ID,然后在下一頁查詢時,根據這個信息來獲取下一頁的數據。

比如,咱們還是以按創建時間排序的用戶數據為例,假設上一頁最后一個用戶的創建時間是 last_score,那么下一頁查詢的時候,就可以用 ZRANGEBYSCORE 命令,從 last_score 之后開始獲取數據。命令大概是這樣的:ZRANGEBYSCORE users_sorted (last_score 0 9,這里的 (last_score 表示不包含 last_score 這個分數的元素,然后獲取 10 條數據。

這種方案的好處是可以避免因為中間元素刪除導致索引變化的問題,而且每次查詢的時間復雜度比較低,適合大數據量的分頁場景。

三、解決 Redis 多條件模糊查詢的巧妙辦法

(一)預處理數據,建立多個索引

既然 Redis 原生不支持多條件模糊查詢,那咱們可以在數據寫入 Redis 的時候,對數據進行預處理,根據不同的查詢條件建立索引。

還是以電商商品為例,商品有名稱、價格、類別等屬性。咱們可以建立三個有序集合:

  • 以商品名稱為索引的有序集合 product_name_index,成員是商品 ID,分數可以是商品名稱的某種哈希值或者直接是名稱的拼音首字母(方便模糊查詢)。
  • 以價格為索引的有序集合 product_price_index,成員是商品 ID,分數就是商品的價格。
  • 以類別為索引的有序集合 product_category_index,成員是商品 ID,分數可以是類別 ID。

當要進行多條件模糊查詢時,比如查詢名稱包含 "手機",價格在 2000 到 4000 之間的商品,咱們可以先根據名稱條件,從 product_name_index 中獲取所有名稱包含 "手機" 的商品 ID 集合,再從 product_price_index 中獲取價格在 2000 到 4000 之間的商品 ID 集合,然后對這兩個集合取交集,得到同時滿足這兩個條件的商品 ID,最后根據這些商品 ID 去獲取具體的商品信息。

對于模糊查詢名稱包含 "手機",咱們可以在建立索引的時候,把商品名稱的所有可能的子串都作為索引的一部分,或者使用一些模糊匹配的算法,比如編輯距離算法,不過這可能會增加索引的存儲量。更簡單的辦法是,在應用層對輸入的模糊查詢關鍵詞進行處理,生成對應的通配符模式,然后在 Redis 中使用 SCAN 命令結合鍵的模式來獲取相關的索引鍵,再獲取對應的商品 ID 集合。

(二)使用 Redis 的位圖(Bitmap)

位圖可以用來表示某個元素是否存在,或者某個條件是否滿足。比如對于每個商品,我們可以用不同的位圖來表示不同的條件,比如價格是否在某個區間,類別是否屬于某一類等。

不過位圖在多條件查詢中的應用相對比較復雜,需要結合其他數據結構一起使用,這里咱們先重點介紹前面的索引方案。

四、綜合方案:讓分頁和多條件模糊查詢無縫結合

現在咱們把分頁和多條件模糊查詢結合起來,看看怎么在實際場景中應用。

假設咱們還是那個電商項目,要實現根據商品名稱模糊查詢、價格范圍查詢,并且進行分頁顯示的功能。具體步驟如下:

(一)數據寫入階段

  1. 當新增一個商品時,首先生成一個唯一的商品 ID,比如 product:1001。
  2. 將商品的詳細信息以 JSON 格式存儲在 Redis 的字符串鍵中,鍵為 product:1001,值為 {"name":"華為手機", "price":3000, "category":"電子產品", "other_info":"..."}。
  3. 建立名稱索引:將商品名稱進行處理,比如提取所有可能包含的關鍵詞,這里假設我們簡單地將整個名稱作為索引的一部分,在有序集合 product_name_index 中,以商品 ID 為成員,以名稱的拼音或者某種可以用于模糊查詢的標識為分數(這里為了方便,暫時以名稱本身作為分數,實際項目中可能需要更復雜的處理)。比如 ZADD product_name_index "華為手機" "product:1001"。
  4. 建立價格索引:在有序集合 product_price_index 中,以商品 ID 為成員,價格為分數,執行 ZADD product_price_index 3000 "product:1001"。
  5. 建立類別索引:在有序集合 product_category_index 中,以商品 ID 為成員,類別 ID 或者類別名稱為分數,假設類別是 "電子產品",執行 ZADD product_category_index "電子產品" "product:1001"。

(二)查詢階段

當用戶輸入查詢條件,比如名稱包含 "手機",價格在 2000 到 4000 之間,要查詢第 2 頁,每頁 10 條數據時:

  1. 處理名稱模糊查詢:生成名稱的通配符模式,比如 "手機",然后使用 SCAN 命令在 product_name_index 中查找所有分數包含 "手機" 的成員(這里需要注意,SCAN 命令本身不能直接根據分數的內容進行模糊查詢,所以前面的索引建立方式可能需要調整,更合理的做法是將商品名稱的關鍵詞提取出來,作為有序集合的成員,分數作為商品 ID,或者使用其他數據結構來存儲關鍵詞和商品 ID 的映射關系。這里為了方便演示,假設我們有一個鍵為 name:手機 的集合,里面存儲了所有名稱包含 "手機" 的商品 ID)。
  2. 獲取價格在 2000 到 4000 之間的商品 ID 集合,使用 ZRANGEBYSCORE product_price_index 2000 4000。
  3. 對這兩個集合取交集,得到同時滿足名稱和價格條件的商品 ID 集合,可以使用 Redis 的 ZINTERSTORE 命令,將兩個有序集合的交集存儲到一個臨時有序集合中。
  4. 對臨時有序集合進行分頁查詢,假設我們要按價格排序(也可以按其他條件排序),使用 ZRANGE 命令,根據頁碼和每頁數量計算出起始和結束索引,比如第 2 頁,每頁 10 條,起始索引是 10,結束索引是 19,執行 ZRANGE temp_index 10 19,得到該頁的商品 ID。
  5. 根據商品 ID 從對應的字符串鍵中獲取商品的詳細信息,返回給用戶。

(三)代碼示例(Java 版本)

這里使用 Jedis 客戶端來演示部分代碼:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;
import java.util.*;
public class RedisQueryDemo {
    private Jedis jedis;
    public RedisQueryDemo() {
        jedis = new Jedis("localhost", 6379);
    }
    // 寫入商品數據并建立索引
    public void addProduct(String productId, String name, double price, String category) {
        // 存儲商品詳情
        String productKey = "product:" + productId;
        String productInfo = String.format("{\"name\":\"%s\", \"price\":%f, \"category\":\"%s\"}", name, price, category);
        jedis.set(productKey, productInfo);
        // 建立名稱索引(這里簡化處理,實際可能需要更復雜的關鍵詞提取)
        jedis.zadd("product_name_index", 0, name + ":" + productId); // 這里分數設為 0,僅作為存儲成員的方式,實際可根據需求設置
        // 建立價格索引
        jedis.zadd("product_price_index", price, productId);
        // 建立類別索引
        jedis.zadd("product_category_index", 0, category + ":" + productId); // 同理,分數設為 0
    }
    // 多條件模糊查詢并分頁
    public List<String> searchProducts(String nameKeyword, double minPrice, double maxPrice, int page, int pageSize) {
        List<String> resultProductIds = new ArrayList<>();
        // 獲取名稱包含關鍵詞的商品 ID 集合(簡化處理,實際需根據關鍵詞生成通配符并掃描)
        Set<String> nameMatchedProducts = new HashSet<>();
        // 這里模擬通過關鍵詞獲取相關成員,實際可能需要使用 SCAN 命令遍歷 product_name_index 并檢查成員是否包含關鍵詞
        Set<Tuple> nameIndexTuples = jedis.zrangeWithScores("product_name_index", 0, -1);
        for (Tuple tuple : nameIndexTuples) {
            String member = tuple.getElement();
            if (member.contains(nameKeyword)) {
                String productId = member.split(":")[1];
                nameMatchedProducts.add(productId);
            }
        }
        // 獲取價格范圍內的商品 ID 集合
        Set<String> priceMatchedProducts = jedis.zrangeByScore("product_price_index", minPrice, maxPrice);
        // 取交集
        priceMatchedProducts.retainAll(nameMatchedProducts);
        // 將交集轉換為有序集合(假設按價格排序)
        String tempIndexKey = "temp_index:" + UUID.randomUUID().toString();
        int score = 0;
        for (String productId : priceMatchedProducts) {
            jedis.zadd(tempIndexKey, jedis.zscore("product_price_index", productId), productId);
        }
        // 分頁查詢
        long start = (page - 1) * pageSize;
        long end = start + pageSize - 1;
        resultProductIds = jedis.zrange(tempIndexKey, start, end);
        // 刪除臨時索引
        jedis.del(tempIndexKey);
        return resultProductIds;
    }
    public static void main(String[] args) {
        RedisQueryDemo demo = new RedisQueryDemo();
        // 模擬寫入數據
        demo.addProduct("1001", "華為手機", 3000, "電子產品");
        demo.addProduct("1002", "小米手機", 2500, "電子產品");
        demo.addProduct("1003", "蘋果手機", 4000, "電子產品");
        demo.addProduct("1004", "華為平板", 2000, "電子產品");
        demo.addProduct("1005", "海爾冰箱", 3500, "家電");
        // 模擬查詢:名稱包含"手機",價格在 2000 - 4000 之間,第 1 頁,每頁 2 條
        List<String> productIds = demo.searchProducts("手機", 2000, 4000, 1, 2);
        for (String productId : productIds) {
            System.out.println("查詢到的商品 ID:" + productId);
            // 這里可以根據 productId 獲取具體的商品信息
        }
    }
}

五、注意事項和優化技巧

(一)索引維護

建立的索引會增加 Redis 的內存占用,所以要根據實際的查詢需求,合理選擇需要建立索引的條件,不要建立過多無用的索引。同時,在數據更新(比如刪除、修改)時,要及時更新對應的索引,保證索引的一致性。

(二)性能優化

  1. 對于大規模數據,使用 SCAN 命令代替 KEYS 命令進行鍵的掃描,避免全量掃描影響 Redis 性能。
  2. 在進行集合交集、并集等操作時,注意集合的大小,如果集合過大,操作可能會比較耗時,可以考慮在應用層進行部分過濾,減少 Redis 層的操作壓力。
  3. 可以對常用的查詢結果進行緩存,比如熱門的查詢條件和分頁結果,減少重復查詢的開銷。

(三)數據結構選擇

根據不同的業務場景選擇合適的數據結構,比如有序集合適合需要排序和范圍查詢的場景,集合適合需要去重和交集、并集操作的場景,字符串適合存儲單個對象的詳細信息。

六、總結

通過上面的方案,咱們基本上解決了 Redis 分頁和多條件模糊查詢的難題。利用有序集合、集合等數據結構建立索引,對數據進行預處理,結合分頁算法,能夠在 Redis 中實現高效的分頁和多條件查詢。當然,具體的實現還需要根據項目的實際需求進行調整和優化,比如索引的建立方式、數據結構的選擇、查詢條件的處理等。

責任編輯:武曉燕 來源: 石杉的架構筆記
相關推薦

2023-11-17 15:34:03

Redis數據庫

2025-02-06 10:00:52

RedisSpring高性能

2025-07-02 07:35:29

JSON字段SpringBoot

2010-05-06 14:11:55

Oracle多條件查詢

2022-06-20 15:19:51

前端監控方案

2010-04-30 09:34:24

Oracle多條件查詢

2021-04-17 07:40:01

N卡驅動應用NVCleanstal

2010-04-28 16:45:27

Oracle Inst

2009-09-15 09:33:46

linq多條件查詢

2018-06-11 17:27:56

APP流量華為

2023-07-12 08:01:28

FOADMROADMOXC

2009-09-15 11:34:47

Linq多條件查詢

2009-06-29 09:03:31

Hibernate多條

2010-11-09 15:18:37

SQL Server多

2021-03-25 15:32:21

深度學習編程人工智能

2010-09-25 16:42:45

sql語句

2024-12-16 07:10:00

DockerDrone開發

2021-12-23 17:04:26

戴爾

2022-09-14 08:11:06

分頁模糊查詢

2025-04-11 09:30:42

點贊
收藏

51CTO技術棧公眾號

国产欧美日韩网站| 国产成人自拍视频在线观看| 3d动漫啪啪精品一区二区免费| 91麻豆精品久久毛片一级| 国产精品一区二区三区www| 亚洲激情欧美激情| 欧美人与物videos另类| 一级特黄aaa| 在线看片一区| 色爱精品视频一区| 国产a√精品区二区三区四区| 97人人在线视频| 中文字幕精品一区二区精品绿巨人 | 中文乱码免费一区二区三区下载| 亚洲精品福利在线| 亚洲天堂网2018| 色综合亚洲图丝熟| 亚洲精品自拍动漫在线| 日本韩国欧美精品大片卡二| 波多野结衣久久久久| 免费成人三级| 欧美一区二区视频观看视频| 国产精品97在线| 日本动漫同人动漫在线观看| 国产精品嫩草影院com| 国产综合精品一区二区三区| 国产精品一品二区三区的使用体验| 亚洲视频播放| 欧美激情第99页| 精品亚洲乱码一区二区| 国产在视频线精品视频www666| 精品少妇一区二区三区在线视频| 五月婷婷丁香综合网| 亚洲精品日产| 亚洲成人一区二区在线观看| 麻豆映画在线观看| 中文字幕在线播| 国产在线观看一区| 欧美日韩一二| 日本二区三区视频| 国产又大又长又粗| 亚洲欧美日本视频在线观看| 精品久久久999| 亚洲av无码一区二区三区人| 欧美jizz19性欧美| 日韩精品一区二区三区中文精品| 在线观看的毛片| 欧美人与性动交xxⅹxx| 欧美色videos| 亚洲熟妇无码另类久久久| 亚洲wwwww| 亚洲欧洲日产国产综合网| 亚洲春色在线视频| 国产视频第一页在线观看| 91视频www| 免费看成人午夜电影| 色综合久久网女同蕾丝边| yourporn久久国产精品| 国产精品亚洲一区| 99久久久无码国产精品不卡| 免费成人网www| 亚洲热线99精品视频| 毛片网站免费观看| 视频精品在线观看| 亚洲视频在线观看免费| 国产高清一区二区三区四区| 国产欧美一区二区精品久久久| 亚洲欧美国内爽妇网| 亚洲一区二区乱码| 欧美欧美黄在线二区| 亚洲日本中文字幕| 色欲AV无码精品一区二区久久| 精品免费av| www.亚洲男人天堂| 欧美极品视频在线观看| 亚洲日韩视频| 国产激情视频一区| 国产精品久久久久久69| 国产成人精品aa毛片| 国产日韩久久| 国产中文在线观看| 国产精品的网站| 日本一区二区三区免费乱视频| 欧美成人sm免费视频| 欧美国产日韩在线观看成人| 激情综合久久| 日韩美女中文字幕| 97超碰资源站| 成人丝袜高跟foot| 欧美一区免费视频| 国产淫片在线观看| 天天操天天色综合| 一区二区三区韩国| 亚洲精品在线国产| 亚洲视频在线免费看| 亚洲色图27p| 亚洲日韩视频| 成人午夜在线影院| 日韩一级免费视频| 国产精品久久久久7777按摩| 97超碰国产精品| 欧美gay囗交囗交| 91精品久久久久久久久99蜜臂| 漂亮人妻被黑人久久精品| 大片网站久久| 午夜精品久久久久久久久久久久| 亚洲天堂视频在线播放| 国产精品996| 色综合久久av| 超碰在线网站| 欧美女孩性生活视频| 双性尿奴穿贞c带憋尿| 91tv精品福利国产在线观看| 欧美壮男野外gaytube| jlzzjlzzjlzz亚洲人| 久久久精品免费免费| 黄色一级片黄色| 九九热这里有精品| 日韩你懂的在线播放| 国产无遮挡在线观看| 亚洲一区自拍| 91嫩草免费看| 免费人成在线观看播放视频| 欧美天堂在线观看| 成人欧美精品一区二区| 日韩欧美精品| 国产精品igao视频| 神马午夜精品95| 亚洲女同女同女同女同女同69| 91猫先生在线| 久久黄色免费视频| 欧美日韩老妇| 国产成人高潮免费观看精品| 人妻少妇精品无码专区久久| 亚洲三级电影全部在线观看高清| 色婷婷综合久久久久中文字幕 | 国产精品一区二区久久| 亚洲 国产 欧美 日韩| 亚洲一区在线视频| 无套白嫩进入乌克兰美女| 99re6这里只有精品| 国产脚交av在线一区二区| 色猫av在线| 精品成人av一区| 国产精品无码永久免费不卡| 日韩午夜精品| 国产98在线|日韩| 欧美人与性动交α欧美精品济南到 | 亚洲欧美黄色片| 一二三四社区欧美黄| 无套白嫩进入乌克兰美女| 青青草成人影院| 国产欧美一区二区三区视频| 91精品国产91久久久久游泳池 | 亚洲成av人综合在线观看| 中文字幕无码毛片免费看| 亚洲激情五月| 91免费版黄色| 福利在线免费视频| 亚洲精品在线看| 91porny九色| 中文字幕精品综合| 午夜一区二区视频| 午夜久久福利| 国模精品娜娜一二三区| 亚洲最新无码中文字幕久久| 亚洲欧美日韩第一区| 黄色一区二区视频| 最近中文字幕一区二区三区| 18深夜在线观看免费视频| 亚洲国产一区二区精品专区| 激情欧美一区二区三区中文字幕| 粉嫩虎白女毛片人体| 24小时成人在线视频| 美女扒开尿口让男人操亚洲视频网站| 99热这里只有精品3| 亚洲图片欧美一区| 免费在线观看你懂的| 日韩av不卡在线观看| 亚洲伊人婷婷| aiai久久| 国产精品jvid在线观看蜜臀| 成人国产免费电影| 亚洲国产毛片完整版| 中文字幕手机在线视频| 亚洲色图在线播放| 中文在线永久免费观看| 日韩成人dvd| 男人添女人下部视频免费| 午夜先锋成人动漫在线| 国产美女被下药99| 久久免费电影| 中文字幕日韩有码| 俄罗斯嫩小性bbwbbw| 欧美亚洲国产一区二区三区va | 91精品中文在线| xxx在线免费观看| 尤物tv国产一区| 性猛交xxxx乱大交孕妇印度| 欧美午夜电影在线| 亚洲欧美小视频| 久久久国产午夜精品| av在线网站免费观看| 久久久999| 日本五级黄色片| 97偷自拍亚洲综合二区| 久久99精品久久久久久水蜜桃| 国产成人亚洲一区二区三区| 91国产精品91| 亚洲性图自拍| 伊人青青综合网站| 天天干免费视频| 这里只有精品电影| 中文字幕 国产精品| 香蕉乱码成人久久天堂爱免费| 四虎国产成人精品免费一女五男| 不卡的看片网站| 97人人模人人爽人人澡| 日韩成人av影视| 欧美视频第一区| 黄色亚洲在线| 中文字幕在线中文| 97精品国产| 亚洲精品视频一区二区三区| 性人久久久久| 国产在线资源一区| av日韩精品| 亚洲综合大片69999| 国产福利亚洲| 国产精品极品美女在线观看免费| 免费高潮视频95在线观看网站| 欧美黄色片免费观看| 黄视频在线观看网站| 俺去亚洲欧洲欧美日韩| 99视频在线播放| 久草免费在线视频| 欧美激情在线视频二区| 国产原创在线观看| 久久视频国产精品免费视频在线 | 久久久久久久精| 丰满少妇一区二区三区| 99视频一区二区| zjzjzjzjzj亚洲女人| 粉嫩高潮美女一区二区三区| 天天操精品视频| 国产一区二区三区精品欧美日韩一区二区三区 | 成人精品国产亚洲| 国产精品免费久久久| 成人黄色免费观看| 国产在线观看不卡| 高清一区二区| 91免费在线观看网站| 一级毛片精品毛片| 国产精品自拍首页| 米奇精品关键词| 欧美乱偷一区二区三区在线| 在线观看欧美理论a影院| 国语自产精品视频在线看| 午夜av在线免费观看| 久久久久久高潮国产精品视| 黄色在线网站噜噜噜| 欧美综合在线观看| 日韩制服一区| 91色在线视频| 爱高潮www亚洲精品| 精品视频导航| 精品成av人一区二区三区| 亚洲蜜桃av| 中文字幕一区二区av| 又大又硬又爽免费视频| 先锋亚洲精品| 色片在线免费观看| 国产精品99久久久久久似苏梦涵| 亚洲激情 欧美| 国产日产欧美一区二区视频| 亚洲一级二级片| 一卡二卡三卡日韩欧美| av黄色在线看| 欧美挠脚心视频网站| 亚洲奶汁xxxx哺乳期| 国产亚洲精品美女久久久| 日本网站在线免费观看视频| 欧美第一淫aaasss性| 中文字幕在线免费观看视频| 国产欧美最新羞羞视频在线观看| 亚洲午夜免费| 欧美下载看逼逼| 亚洲二区三区不卡| 欧美日韩在线一| 久久99精品一区二区三区三区| 69xxx免费视频| 国产日韩亚洲欧美综合| 国产盗摄x88av| 日本乱人伦一区| 精品人妻伦一二三区久久| 亚洲欧美色婷婷| h视频在线免费观看| 国产精品∨欧美精品v日韩精品| 成人久久精品| 欧美一级二级三级九九九| 欧美人与禽猛交乱配视频| 日韩中文字幕免费在线| 国产成人日日夜夜| 欧美 日韩 成人| 亚洲午夜激情av| 一二三区中文字幕| 亚洲精品之草原avav久久| 9191在线播放| 麻豆国产精品va在线观看不卡| 91av久久| 91香蕉视频在线下载| 久久福利综合| 日本精品免费在线观看| 懂色一区二区三区免费观看| 激情高潮到大叫狂喷水| 欧美日韩国产专区| 亚洲第一天堂影院| 久久手机精品视频| 日日av拍夜夜添久久免费| 国精产品99永久一区一区| 欧美aⅴ99久久黑人专区| 黄色手机在线视频| 久久久亚洲精品一区二区三区| 国产第100页| 日韩视频中午一区| 超碰免费公开在线| 国产精品久久久久免费a∨| 天堂av一区二区三区在线播放| h无码动漫在线观看| 国产一区二区调教| 久久久久人妻一区精品色| 欧美怡红院视频| 欧美欧美欧美| 欧美在线亚洲一区| 亚洲精品3区| 久久久久狠狠高潮亚洲精品| 99精品国产99久久久久久白柏| 久草免费新视频| 日韩午夜电影在线观看| 影院在线观看全集免费观看| 91免费视频国产| 亚洲欧美网站在线观看| 想看黄色一级片| 亚洲色图都市小说| 国产一区二区三区视频免费观看 | 久久精品国产第一区二区三区最新章节 | 东方aⅴ免费观看久久av| 免费一级片视频| 欧美成人官网二区| free性欧美| 久久av一区二区三区漫画| 亚洲少妇在线| av女人的天堂| 精品视频一区二区不卡| 免费看美女视频在线网站| 亚洲专区在线视频| 欧美日韩视频| 这里只有精品在线观看视频| 精品国产乱码久久久久久虫虫漫画 | 成人免费视频app| 日本熟妇毛茸茸丰满| 日韩极品精品视频免费观看| 成人私拍视频| 亚洲欧美久久234| 国产综合色视频| 天堂资源在线播放| 亚洲男人的天堂在线| 91亚洲视频| 波多野结衣与黑人| 97久久超碰国产精品| 免费看污视频的网站| 日韩亚洲成人av在线| 日本精品一区二区三区在线观看视频| 欧美一级爱爱视频| av中文字幕亚洲| 中日韩av在线| 欧美疯狂做受xxxx高潮| 日韩精品导航| 天堂中文视频在线| 亚洲欧美日本在线| 亚洲欧美丝袜中文综合| 国产精品丝袜高跟| 欧美天天在线| 一区二区三区伦理片| 91麻豆精品国产91久久久 | 午夜久久99| 亚洲码无人客一区二区三区| 91麻豆精品91久久久久同性| 51漫画成人app入口| 亚洲精品国产精品久久| 成人亚洲精品久久久久软件| 成人毛片一区二区三区| 欧美精品在线网站| 亚洲黄色录像| 99国产精品免费视频| 91福利资源站| xxx性欧美| 国产卡一卡二在线| 久久美女艺术照精彩视频福利播放 | 老色鬼在线视频|