日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

妈妈再也不担心我面试被 Redis 问得脸都绿了

發布時間:2025/3/20 数据库 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 妈妈再也不担心我面试被 Redis 问得脸都绿了 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??點擊上方?好好學java?,選擇?星標?公眾號

重磅資訊、干貨,第一時間送達 今日推薦:牛人 20000 字的 Spring Cloud 總結,太硬核了~

Redis 作為一個開源的,高級的鍵值存儲和一個適用的解決方案,已經越來越在構建 「高性能」「可擴展」 的 Web 應用上發揮著舉足輕重的作用。

當今互聯網技術架構中 Redis 已然成為了應用得最廣泛的中間件之一,它也是中高級后端工程 技術面試 中面試官最喜歡問的工程技能之一,不僅僅要求著我們對 基本的使用 進行掌握,更要深層次地理解 Redis 內部實現 的細節原理。

熟練掌握 Redis,甚至可以毫不夸張地說已經半只腳踏入心儀的公司了。下面我們一起來盤點回顧一下 Redis 的面試經典問題,就不要再被面試官問得 臉都綠了 呀!

  • Ps:我把 重要的知識點 都做成了 圖片,希望各位 "用餐愉快"。(不錯記得付餐費.. 點個贊留個言..)

一、基礎篇

■什么是 Redis ?

先解釋 Redis 基本概念

Redis (Remote Dictionary Server) 是一個使用 C 語言 編寫的,開源的 (BSD許可) 高性能 非關系型 (NoSQL) 的 鍵值對數據庫。

簡單提一下 Redis 數據結構

Redis 可以存儲 不同類型數據結構值 之間的映射關系。鍵的類型只能是字符串,而值除了支持最 基礎的五種數據類型 外,還支持一些 高級數據類型

一定要說出一些高級數據結構 (當然你自己也要了解.. 下面會說到的別擔心),這樣面試官的眼睛才會亮。

Redis 小總結

與傳統數據庫不同的是 Redis 的數據是 存在內存 中的,所以 讀寫速度 非常 ,因此 Redis 被廣泛應用于 緩存 方向,每秒可以處理超過 10 萬次讀寫操作,是已知性能最快的 Key-Value 數據庫。另外,Redis 也經常用來做 分布式鎖

除此之外,Redis 支持事務 、持久化、LUA腳本、LRU驅動事件、多種集群方案。

■Redis 優缺點

優點

  • 讀寫性能優異, Redis能讀的速度是 110000 次/s,寫的速度是 81000 次/s。

  • 支持數據持久化,支持 AOF 和 RDB 兩種持久化方式。

  • 支持事務,Redis 的所有操作都是原子性的,同時 Redis 還支持對幾個操作合并后的原子性執行。

  • 數據結構豐富,除了支持 string 類型的 value 外還支持 hash、set、zset、list 等數據結構。

  • 支持主從復制,主機會自動將數據同步到從機,可以進行讀寫分離。

缺點

  • 數據庫 容量受到物理內存的限制,不能用作海量數據的高性能讀寫,因此 Redis 適合的場景主要局限在較小數據量的高性能操作和運算上。

  • Redis 不具備自動容錯和恢復功能,主機從機的宕機都會導致前端部分讀寫請求失敗,需要等待機器重啟或者手動切換前端的 IP 才能恢復。

  • 主機宕機,宕機前有部分數據未能及時同步到從機,切換 IP 后還會引入數據不一致的問題,降低了 系統的可用性。

  • Redis 較難支持在線擴容,在集群容量達到上限時在線擴容會變得很復雜。為避免這一問題,運維人員在系統上線時必須確保有足夠的空間,這對資源造成了很大的浪費。

■為什么要用緩存?為什么使用 Redis?

提一下現在 Web 應用的現狀

在日常的 Web 應用對數據庫的訪問中,讀操作的次數遠超寫操作,比例大概在 1:93:7,所以需要讀的可能性是比寫的可能大得多的。當我們使用 SQL 語句去數據庫進行讀寫操作時,數據庫就會 去磁盤把對應的數據索引取回來,這是一個相對較慢的過程。

使用 Redis or 使用緩存帶來的優勢

如果我們把數據放在 Redis 中,也就是直接放在內存之中,讓服務端直接去讀取內存中的數據,那么這樣 速度 明顯就會快上不少 (高性能),并且會 極大減小數據庫的壓力 (特別是在高并發情況下)。

記得是 兩個角度 啊.. 高性能高并發..

也要提一下使用緩存的考慮

但是使用內存進行數據存儲開銷也是比較大的,限于成本 的原因,一般我們只是使用 Redis 存儲一些 常用和主要的數據,比如用戶登錄的信息等。

一般而言在使用 Redis 進行存儲的時候,我們需要從以下幾個方面來考慮:

  • 業務數據常用嗎?命中率如何? 如果命中率很低,就沒有必要寫入緩存;

  • 該業務數據是讀操作多,還是寫操作多? 如果寫操作多,頻繁需要寫入數據庫,也沒有必要使用緩存;

  • 業務數據大小如何? 如果要存儲幾百兆字節的文件,會給緩存帶來很大的壓力,這樣也沒有必要;

在考慮了這些問題之后,如果覺得有必要使用緩存,那么就使用它!

■使用緩存會出現什么問題?

一般來說有如下幾個問題,回答思路遵照 是什么為什么怎么解決

  • 緩存雪崩問題;

  • 緩存穿透問題;

  • 緩存和數據庫雙寫一致性問題;

  • 緩存雪崩問題

    另外對于 "Redis 掛掉了,請求全部走數據庫" 這樣的情況,我們還可以有如下的思路:

    • 事發前:實現 Redis 的高可用(主從架構 + Sentinel 或者 Redis Cluster),盡量避免 Redis 掛掉這種情況發生。

    • 事發中:萬一 Redis 真的掛了,我們可以設置本地緩存(ehcache) + 限流(hystrix),盡量避免我們的數據庫被干掉(起碼能保證我們的服務還是能正常工作的)

    • 事發后:Redis 持久化,重啟后自動從磁盤上加載數據,快速恢復緩存數據。

    緩存穿透問題

    緩存與數據庫雙寫一致問題

    雙寫一致性上圖還是稍微粗糙了些,你還需要知道兩種方案 (先操作數據庫和先操作緩存) 分別都有什么優勢和對應的問題,這里不作贅述,可以參考一下下方的文章,寫得非常詳細。

    • 面試前必須要知道的Redis面試題 | Java3y - https://mp.weixin.qq.com/s/3Fmv7h5p2QDtLxc9n1dp5A

    ■Redis 為什么早期版本選擇單線程?

    官方解釋

    因為 Redis 是基于內存的操作,CPU 不是 Redis 的瓶頸,Redis 的瓶頸最有可能是 機器內存的大小 或者 網絡帶寬。既然單線程容易實現,而且 CPU 不會成為瓶頸,那就順理成章地采用單線程的方案了。

    簡單總結一下

  • 使用單線程模型能帶來更好的 可維護性,方便開發和調試;

  • 使用單線程模型也能 并發 的處理客戶端的請求;(I/O 多路復用機制)

  • Redis 服務中運行的絕大多數操作的 性能瓶頸都不是 CPU

  • 強烈推薦 各位親看一下這篇文章:

    • 為什么 Redis 選擇單線程模型 · Why's THE Design? - https://draveness.me/whys-the-design-redis-single-thread

    ■Redis 為什么這么快?

    簡單總結:

  • 純內存操作:讀取不需要進行磁盤 I/O,所以比傳統數據庫要快上不少;(但不要有誤區說磁盤就一定慢,例如 Kafka 就是使用磁盤順序讀取但仍然較快)

  • 單線程,無鎖競爭:這保證了沒有線程的上下文切換,不會因為多線程的一些操作而降低性能;

  • 多路 I/O 復用模型,非阻塞 I/O:采用多路 I/O 復用技術可以讓單個線程高效的處理多個網絡連接請求(盡量減少網絡 IO 的時間消耗);

  • 高效的數據結構,加上底層做了大量優化:Redis 對于底層的數據結構和內存占用做了大量的優化,例如不同長度的字符串使用不同的結構體表示,HyperLogLog 的密集型存儲結構等等..

  • 二、數據結構篇

    ■簡述一下 Redis 常用數據結構及實現?

    首先在 Redis 內部會使用一個 RedisObject 對象來表示所有的 key 和 value:

    其次 Redis 為了 平衡空間和時間效率,針對 value 的具體類型在底層會采用不同的數據結構來實現,下圖展示了他們之間的映射關系:(好像亂糟糟的,但至少能看清楚..)

    ■Redis 的 SDS 和 C 中字符串相比有什么優勢?

    先簡單總結一下

    C 語言使用了一個長度為 N+1 的字符數組來表示長度為 N 的字符串,并且字符數組最后一個元素總是 \0,這種簡單的字符串表示方式 不符合 Redis 對字符串在安全性、效率以及功能方面的要求

    再來說 C 語言字符串的問題

    這樣簡單的數據結構可能會造成以下一些問題:

    • 獲取字符串長度為 O(N) 級別的操作 → 因為 C 不保存數組的長度,每次都需要遍歷一遍整個數組;

    • 不能很好的杜絕 緩沖區溢出/內存泄漏 的問題 → 跟上述問題原因一樣,如果執行拼接 or 縮短字符串的操作,如果操作不當就很容易造成上述問題;

    • C 字符串 只能保存文本數據 → 因為 C 語言中的字符串必須符合某種編碼(比如 ASCII),例如中間出現的 '\0' 可能會被判定為提前結束的字符串而識別不了;

    Redis 如何解決的 | SDS 的優勢

    如果去看 Redis 的源碼 sds.h/sdshdr 文件,你會看到 SDS 完整的實現細節,這里簡單來說一下 Redis 如何解決的:

  • 多增加 len 表示當前字符串的長度:這樣就可以直接獲取長度了,復雜度 O(1);

  • 自動擴展空間:當 SDS 需要對字符串進行修改時,首先借助于 len 和 alloc 檢查空間是否滿足修改所需的要求,如果空間不夠的話,SDS 會自動擴展空間,避免了像 C 字符串操作中的覆蓋情況;

  • 有效降低內存分配次數:C 字符串在涉及增加或者清除操作時會改變底層數組的大小造成重新分配,SDS 使用了 空間預分配惰性空間釋放 機制,簡單理解就是每次在擴展時是成倍的多分配的,在縮容是也是先留著并不正式歸還給 OS;

  • 二進制安全:C 語言字符串只能保存 ascii 碼,對于圖片、音頻等信息無法保存,SDS 是二進制安全的,寫入什么讀取就是什么,不做任何過濾和限制;

  • ■字典是如何實現的?Rehash 了解嗎?

    先總體聊一下 Redis 中的字典

    字典是 Redis 服務器中出現最為頻繁的復合型數據結構。除了 hash 結構的數據會用到字典外,整個 Redis 數據庫的所有 key 和 value 也組成了一個 全局字典,還有帶過期時間的 key 也是一個字典。(存儲在 RedisDb 數據結構中)

    說明字典內部結構和 rehash

    Redis 中的字典相當于 Java 中的 HashMap,內部實現也差不多類似,都是通過 "數組 + 鏈表"鏈地址法 來解決部分 哈希沖突,同時這樣的結構也吸收了兩種不同數據結構的優點。

    字典結構內部包含 兩個 hashtable,通常情況下只有一個 hashtable 有值,但是在字典擴容縮容時,需要分配新的 hashtable,然后進行 漸進式搬遷 (rehash),這時候兩個 hashtable 分別存儲舊的和新的 hashtable,待搬遷結束后,舊的將被刪除,新的 hashtable 取而代之。

    擴縮容的條件

    正常情況下,當 hash 表中 元素的個數等于第一維數組的長度時,就會開始擴容,擴容的新數組是 原數組大小的 2 倍。不過如果 Redis 正在做 bgsave(持久化命令),為了減少內存也得過多分離,Redis 盡量不去擴容,但是如果 hash 表非常滿了,達到了第一維數組長度的 5 倍了,這個時候就會 強制擴容。

    當 hash 表因為元素逐漸被刪除變得越來越稀疏時,Redis 會對 hash 表進行縮容來減少 hash 表的第一維數組空間占用。所用的條件是 元素個數低于數組長度的 10%,縮容不會考慮 Redis 是否在做 bgsave。

    ■跳躍表是如何實現的?原理?

    這是 Redis 中比較重要的一個數據結構,建議閱讀 之前寫過的文章,里面詳細介紹了原理和一些細節:

    • Redis(2)——跳躍表

    ■HyperLogLog 有了解嗎?

    建議閱讀 之前的系列文章:

    • Redis(4)——神奇的HyperLoglog解決統計問題

    ■布隆過濾器有了解嗎?

    建議閱讀 之前的系列文章:

    • Redis(5)——億級數據過濾和布隆過濾器

    ■GeoHash 了解嗎?

    建議閱讀 之前的系列文章:

    • Redis(6)——GeoHash查找附近的人

    ■壓縮列表了解嗎?

    這是 Redis 為了節約內存 而使用的一種數據結構,zsethash 容器對象會在元素個數較少的時候,采用壓縮列表(ziplist)進行存儲。壓縮列表是 一塊連續的內存空間,元素之間緊挨著存儲,沒有任何冗余空隙。

    因為之前自己也沒有學習過,所以找了一篇比較好比較容易理解的文章:

    • 圖解Redis之數據結構篇——壓縮列表 - https://mp.weixin.qq.com/s/nba0FUEAVRs0vi24KUoyQg

    • 這一篇稍微底層稍微硬核一點:http://www.web-lovers.com/redis-source-ziplist.html

    ■快速列表 quicklist 了解嗎?

    Redis 早期版本存儲 list 列表數據結構使用的是壓縮列表 ziplist 和普通的雙向鏈表 linkedlist,也就是說當元素少時使用 ziplist,當元素多時用 linkedlist。但考慮到鏈表的附加空間相對較高,prev 和 next 指針就要占去 16 個字節(64 位操作系統占用 8 個字節),另外每個節點的內存都是單獨分配,會家具內存的碎片化,影響內存管理效率。

    后來 Redis 新版本(3.2)對列表數據結構進行了改造,使用 quicklist 代替了 ziplist 和 linkedlist。

    同上..建議閱讀一下以下的文章:

    • Redis列表list 底層原理 - https://zhuanlan.zhihu.com/p/102422311

    ■Stream 結構有了解嗎?

    Redis Stream 從概念上來說,就像是一個 僅追加內容消息鏈表,把所有加入的消息都一個一個串起來,每個消息都有一個唯一的 ID 和內容,這很簡單,讓它復雜的是從 Kafka 借鑒的另一種概念:消費者組(Consumer Group) (思路一致,實現不同):

    上圖就展示了一個典型的 Stream 結構。每個 Stream 都有唯一的名稱,它就是 Redis 的 key,在我們首次使用 xadd 指令追加消息時自動創建。我們對圖中的一些概念做一下解釋:

    • Consumer Group:消費者組,可以簡單看成記錄流狀態的一種數據結構。消費者既可以選擇使用 XREAD 命令進行 獨立消費,也可以多個消費者同時加入一個消費者組進行 組內消費。同一個消費者組內的消費者共享所有的 Stream 信息,同一條消息只會有一個消費者消費到,這樣就可以應用在分布式的應用場景中來保證消息的唯一性。

    • last_delivered_id:用來表示消費者組消費在 Stream 上 消費位置 的游標信息。每個消費者組都有一個 Stream 內 唯一的名稱,消費者組不會自動創建,需要使用 XGROUP CREATE 指令來顯式創建,并且需要指定從哪一個消息 ID 開始消費,用來初始化 last_delivered_id 這個變量。

    • pending_ids:每個消費者內部都有的一個狀態變量,用來表示 已經 被客戶端 獲取,但是 還沒有 ack 的消息。記錄的目的是為了 保證客戶端至少消費了消息一次,而不會在網絡傳輸的中途丟失而沒有對消息進行處理。如果客戶端沒有 ack,那么這個變量里面的消息 ID 就會越來越多,一旦某個消息被 ack,它就會對應開始減少。這個變量也被 Redis 官方稱為 PEL (Pending Entries List)。

    Stream 消息太多怎么辦?

    很容易想到,要是消息積累太多,Stream 的鏈表豈不是很長,內容會不會爆掉就是個問題了。xdel 指令又不會刪除消息,它只是給消息做了個標志位。

    Redis 自然考慮到了這一點,所以它提供了一個定長 Stream 功能。在 xadd 的指令提供一個定長長度 maxlen,就可以將老的消息干掉,確保最多不超過指定長度,使用起來也很簡單:

    > XADD mystream MAXLEN 2 * value 1 1526654998691-0 > XADD mystream MAXLEN 2 * value 2 1526654999635-0 > XADD mystream MAXLEN 2 * value 3 1526655000369-0 > XLEN mystream (integer) 2 > XRANGE mystream - + 1) 1) 1526654999635-02) 1) "value"2) "2" 2) 1) 1526655000369-02) 1) "value"2) "3"

    如果使用 MAXLEN 選項,當 Stream 的達到指定長度后,老的消息會自動被淘汰掉,因此 Stream 的大小是恒定的。目前還沒有選項讓 Stream 只保留給定數量的條目,因為為了一致地運行,這樣的命令必須在很長一段時間內阻塞以淘汰消息。(例如在添加數據的高峰期間,你不得不長暫停來淘汰舊消息和添加新的消息)

    另外使用 MAXLEN 選項的花銷是很大的,Stream 為了節省內存空間,采用了一種特殊的結構表示,而這種結構的調整是需要額外的花銷的。所以我們可以使用一種帶有 ~ 的特殊命令:

    XADD mystream MAXLEN ~ 1000 * ... entry fields here ...

    它會基于當前的結構合理地對節點執行裁剪,來保證至少會有 1000 條數據,可能是 1010 也可能是 1030。

    PEL 是如何避免消息丟失的?

    在客戶端消費者讀取 Stream 消息時,Redis 服務器將消息回復給客戶端的過程中,客戶端突然斷開了連接,消息就丟失了。但是 PEL 里已經保存了發出去的消息 ID,待客戶端重新連上之后,可以再次收到 PEL 中的消息 ID 列表。不過此時 xreadgroup 的起始消息 ID 不能為參數 > ,而必須是任意有效的消息 ID,一般將參數設為 0-0,表示讀取所有的 PEL 消息以及自 last_delivered_id 之后的新消息。

    和 Kafka 對比起來呢?

    Redis 基于內存存儲,這意味著它會比基于磁盤的 Kafka 快上一些,也意味著使用 Redis 我們 不能長時間存儲大量數據。不過如果您想以 最小延遲 實時處理消息的話,您可以考慮 Redis,但是如果 消息很大并且應該重用數據 的話,則應該首先考慮使用 Kafka。

    另外從某些角度來說,Redis Stream 也更適用于小型、廉價的應用程序,因為 Kafka 相對來說更難配置一些。

    推薦閱讀 之前的系列文章,里面 也對 Pub/ Sub 做了詳細的描述

    • Redis(8)——發布/訂閱與Stream

    三、持久化篇

    ■什么是持久化?

    先簡單談一談是什么

    Redis 的數據 全部存儲內存 中,如果 突然宕機,數據就會全部丟失,因此必須有一套機制來保證 Redis 的數據不會因為故障而丟失,這種機制就是 Redis 的 持久化機制,它會將內存中的數據庫狀態 保存到磁盤 中。

    解釋一下持久化發生了什么

    我們來稍微考慮一下 Redis 作為一個 "內存數據庫" 要做的關于持久化的事情。通常來說,從客戶端發起請求開始,到服務器真實地寫入磁盤,需要發生如下幾件事情:

    詳細版 的文字描述大概就是下面這樣:

  • 客戶端向數據庫 發送寫命令 (數據在客戶端的內存中)

  • 數據庫 接收 到客戶端的 寫請求 (數據在服務器的內存中)

  • 數據庫 調用系統 API 將數據寫入磁盤 (數據在內核緩沖區中)

  • 操作系統將 寫緩沖區 傳輸到 磁盤控控制器 (數據在磁盤緩存中)

  • 操作系統的磁盤控制器將數據 寫入實際的物理媒介 中 (數據在磁盤中)

  • 分析如何保證持久化安全

    如果我們故障僅僅涉及到 軟件層面 (該進程被管理員終止或程序崩潰) 并且沒有接觸到內核,那么在 上述步驟 3 成功返回之后,我們就認為成功了。即使進程崩潰,操作系統仍然會幫助我們把數據正確地寫入磁盤。

    如果我們考慮 停電/ 火災更具災難性 的事情,那么只有在完成了第 5 步之后,才是安全的。

    機房”火了“

    所以我們可以總結得出數據安全最重要的階段是:步驟三、四、五,即:

    • 數據庫軟件調用寫操作將用戶空間的緩沖區轉移到內核緩沖區的頻率是多少?

    • 內核多久從緩沖區取數據刷新到磁盤控制器?

    • 磁盤控制器多久把數據寫入物理媒介一次?

    • 注意: 如果真的發生災難性的事件,我們可以從上圖的過程中看到,任何一步都可能被意外打斷丟失,所以只能 盡可能地保證 數據的安全,這對于所有數據庫來說都是一樣的。

    我們從 第三步 開始。Linux 系統提供了清晰、易用的用于操作文件的 POSIX file API,20 多年過去,仍然還有很多人對于這一套 API 的設計津津樂道,我想其中一個原因就是因為你光從 API 的命名就能夠很清晰地知道這一套 API 的用途:

    int open(const char *path, int oflag, .../*,mode_t mode */); int close (int filedes);int remove( const char *fname ); ssize_t write(int fildes, const void *buf, size_t nbyte); ssize_t read(int fildes, void *buf, size_t nbyte);
    • 參考自:API 設計最佳實踐的思考 - https://www.cnblogs.com/yuanjiangw/p/10846560.html

    所以,我們有很好的可用的 API 來完成 第三步,但是對于成功返回之前,我們對系統調用花費的時間沒有太多的控制權。

    然后我們來說說 第四步。我們知道,除了早期對電腦特別了解那幫人 (操作系統就這幫人搞的),實際的物理硬件都不是我們能夠 直接操作 的,都是通過 操作系統調用 來達到目的的。為了防止過慢的 I/O 操作拖慢整個系統的運行,操作系統層面做了很多的努力,譬如說 上述第四步 提到的 寫緩沖區,并不是所有的寫操作都會被立即寫入磁盤,而是要先經過一個緩沖區,默認情況下,Linux 將在 30 秒 后實際提交寫入。

    但是很明顯,30 秒 并不是 Redis 能夠承受的,這意味著,如果發生故障,那么最近 30 秒內寫入的所有數據都可能會丟失。幸好 PROSIX API 提供了另一個解決方案:fsync,該命令會 強制 內核將 緩沖區 寫入 磁盤,但這是一個非常消耗性能的操作,每次調用都會 阻塞等待 直到設備報告 IO 完成,所以一般在生產環境的服務器中,Redis 通常是每隔 1s 左右執行一次 fsync 操作。

    到目前為止,我們了解到了如何控制 第三步 和 第四步,但是對于 第五步,我們 完全無法控制。也許一些內核實現將試圖告訴驅動實際提交物理介質上的數據,或者控制器可能會為了提高速度而重新排序寫操作,不會盡快將數據真正寫到磁盤上,而是會等待幾個多毫秒。這完全是我們無法控制的。

    普通人簡單說一下第一條就過了,如果你詳細地對后面兩方面 侃侃而談,那面試官就會對你另眼相看了。

    ■Redis 中的兩種持久化方式?

    方式一:快照

    Redis 快照 是最簡單的 Redis 持久性模式。當滿足特定條件時,它將生成數據集的時間點快照,例如,如果先前的快照是在 2 分鐘前創建的,并且現在已經至少有 100 次新寫入,則將創建一個新的快照。此條件可以由用戶配置 Redis 實例來控制,也可以在運行時修改而無需重新啟動服務器??煺兆鳛榘麄€數據集的單個 .rdb 文件生成。

    方式二:AOF

    快照不是很持久。如果運行 Redis 的計算機停止運行,電源線出現故障或者您 kill -9 的實例意外發生,則寫入 Redis 的最新數據將丟失。盡管這對于某些應用程序可能不是什么大問題,但有些使用案例具有充分的耐用性,在這些情況下,快照并不是可行的選擇。

    AOF(Append Only File - 僅追加文件) 它的工作方式非常簡單:每次執行 修改內存 中數據集的寫操作時,都會 記錄 該操作。假設 AOF 日志記錄了自 Redis 實例創建以來 所有的修改性指令序列,那么就可以通過對一個空的 Redis 實例 順序執行所有的指令,也就是 「重放」,來恢復 Redis 當前實例的內存數據結構的狀態。

    Redis 4.0 的混合持久化

    重啟 Redis 時,我們很少使用 rdb 來恢復內存狀態,因為會丟失大量數據。我們通常使用 AOF 日志重放,但是重放 AOF 日志性能相對 rdb 來說要慢很多,這樣在 Redis 實例很大的情況下,啟動需要花費很長的時間。

    Redis 4.0 為了解決這個問題,帶來了一個新的持久化選項——混合持久化。將 rdb 文件的內容和增量的 AOF 日志文件存在一起。這里的 AOF 日志不再是全量的日志,而是 自持久化開始到持久化結束 的這段時間發生的增量 AOF 日志,通常這部分 AOF 日志很小:

    于是在 Redis 重啟的時候,可以先加載 rdb 的內容,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放,重啟效率因此大幅得到提升。

    關于兩種持久化方式的更多細節 (原理) 可以參考:

    • Redis(7)——持久化【一文了解】

    ■RDB 和 AOF 各自有什么優缺點?

    RDB | 優點

  • 只有一個文件 dump.rdb,方便持久化。

  • 容災性好,一個文件可以保存到安全的磁盤。

  • 性能最大化,fork 子進程來完成寫操作,讓主進程繼續處理命令,所以使 IO 最大化。使用單獨子進程來進行持久化,主進程不會進行任何 IO 操作,保證了 Redis 的高性能

  • 相對于數據集大時,比 AOF 的 啟動效率 更高。

  • RDB | 缺點

  • 數據安全性低。RDB 是間隔一段時間進行持久化,如果持久化之間 Redis 發生故障,會發生數據丟失。所以這種方式更適合數據要求不嚴謹的時候;

  • AOF | 優點

  • 數據安全,aof 持久化可以配置 appendfsync 屬性,有 always,每進行一次命令操作就記錄到 aof 文件中一次。

  • 通過 append 模式寫文件,即使中途服務器宕機,可以通過 redis-check-aof 工具解決數據一致性問題。

  • AOF 機制的 rewrite 模式。AOF 文件沒被 rewrite 之前(文件過大時會對命令 進行合并重寫),可以刪除其中的某些命令(比如誤操作的 flushall)

  • AOF | 缺點

  • AOF 文件比 RDB 文件大,且 恢復速度慢

  • 數據集大 的時候,比 rdb 啟動效率低。

  • ■兩種方式如何選擇?

    • 一般來說, 如果想達到足以媲美 PostgreSQL 的 數據安全性,你應該 同時使用兩種持久化功能。在這種情況下,當 Redis 重啟的時候會優先載入 AOF 文件來恢復原始的數據,因為在通常情況下 AOF 文件保存的數據集要比 RDB 文件保存的數據集要完整。

    • 如果你非常關心你的數據, 但仍然 可以承受數分鐘以內的數據丟失,那么你可以 只使用 RDB 持久化

    • 有很多用戶都只使用 AOF 持久化,但并不推薦這種方式,因為定時生成 RDB 快照(snapshot)非常便于進行數據庫備份, 并且 RDB 恢復數據集的速度也要比 AOF 恢復的速度要快,除此之外,使用 RDB 還可以避免 AOF 程序的 bug。

    • 如果你只希望你的數據在服務器運行的時候存在,你也可以不使用任何持久化方式。

    ■Redis 的數據恢復

    Redis 的數據恢復有著如下的優先級:

  • 如果只配置 AOF ,重啟時加載 AOF 文件恢復數據;

  • 如果同時配置了 RDB 和 AOF ,啟動只加載 AOF 文件恢復數據;

  • 如果只配置 RDB,啟動將加載 dump 文件恢復數據。

  • 拷貝 AOF 文件到 Redis 的數據目錄,啟動 redis-server AOF 的數據恢復過程:Redis 虛擬一個客戶端,讀取 AOF 文件恢復 Redis 命令和參數,然后執行命令從而恢復數據,這些過程主要在 loadAppendOnlyFile() 中實現。

    拷貝 RDB 文件到 Redis 的數據目錄,啟動 redis-server 即可,因為 RDB 文件和重啟前保存的是真實數據而不是命令狀態和參數。

    四、集群篇

    ■主從同步了解嗎?

    主從復制,是指將一臺 Redis 服務器的數據,復制到其他的 Redis 服務器。前者稱為 主節點(master),后者稱為 從節點(slave)。且數據的復制是 單向 的,只能由主節點到從節點。Redis 主從復制支持 主從同步從從同步 兩種,后者是 Redis 后續版本新增的功能,以減輕主節點的同步負擔。

    主從復制主要的作用

    • 數據冗余: 主從復制實現了數據的熱備份,是持久化之外的一種數據冗余方式。

    • 故障恢復: 當主節點出現問題時,可以由從節點提供服務,實現快速的故障恢復 (實際上是一種服務的冗余)。

    • 負載均衡: 在主從復制的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務 (即寫 Redis 數據時應用連接主節點,讀 Redis 數據時應用連接從節點),分擔服務器負載。尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高 Redis 服務器的并發量。

    • 高可用基石: 除了上述作用以外,主從復制還是哨兵和集群能夠實施的 基礎,因此說主從復制是 Redis 高可用的基礎。

    實現原理

    為了節省篇幅,我把主要的步驟都 濃縮 在了上圖中,其實也可以 簡化成三個階段:準備階段-數據同步階段-命令傳播階段。

    更多細節 推薦閱讀 之前的系列文章,不僅有原理講解,還有實戰環節:

    • Redis(9)——史上最強【集群】入門實踐教程

    ■哨兵模式了解嗎?

    上圖 展示了一個典型的哨兵架構圖,它由兩部分組成,哨兵節點和數據節點:

    • 哨兵節點: 哨兵系統由一個或多個哨兵節點組成,哨兵節點是特殊的 Redis 節點,不存儲數據;

    • 數據節點: 主節點和從節點都是數據節點;

    在復制的基礎上,哨兵實現了 自動化的故障恢復 功能,下方是官方對于哨兵功能的描述:

    • 監控(Monitoring): 哨兵會不斷地檢查主節點和從節點是否運作正常。

    • 自動故障轉移(Automatic failover):主節點 不能正常工作時,哨兵會開始 自動故障轉移操作,它會將失效主節點的其中一個 從節點升級為新的主節點,并讓其他從節點改為復制新的主節點。

    • 配置提供者(Configuration provider): 客戶端在初始化時,通過連接哨兵來獲得當前 Redis 服務的主節點地址。

    • 通知(Notification): 哨兵可以將故障轉移的結果發送給客戶端。

    其中,監控和自動故障轉移功能,使得哨兵可以及時發現主節點故障并完成轉移。而配置提供者和通知功能,則需要在與客戶端的交互中才能體現。

    新的主服務器是怎樣被挑選出來的?

    故障轉移操作的第一步 要做的就是在已下線主服務器屬下的所有從服務器中,挑選出一個狀態良好、數據完整的從服務器,然后向這個從服務器發送 slaveof no one 命令,將這個從服務器轉換為主服務器。但是這個從服務器是怎么樣被挑選出來的呢?

    簡單來說 Sentinel 使用以下規則來選擇新的主服務器:

  • 在失效主服務器屬下的從服務器當中, 那些被標記為主觀下線、已斷線、或者最后一次回復 PING 命令的時間大于五秒鐘的從服務器都會被 淘汰。

  • 在失效主服務器屬下的從服務器當中, 那些與失效主服務器連接斷開的時長超過 down-after 選項指定的時長十倍的從服務器都會被 淘汰

  • 經歷了以上兩輪淘汰之后 剩下來的從服務器中, 我們選出 復制偏移量(replication offset)最大 的那個 從服務器 作為新的主服務器;如果復制偏移量不可用,或者從服務器的復制偏移量相同,那么 帶有最小運行 ID 的那個從服務器成為新的主服務器。

  • 更多細節 推薦閱讀 之前的系列文章,不僅有原理講解,還有實戰環節:

    • Redis(9)——史上最強【集群】入門實踐教程

    ■Redis 集群使用過嗎?原理?

    上圖 展示了 Redis Cluster 典型的架構圖,集群中的每一個 Redis 節點都 互相兩兩相連,客戶端任意 直連 到集群中的 任意一臺,就可以對其他 Redis 節點進行 讀寫 的操作。

    基本原理

    Redis 集群中內置了 16384 個哈希槽。當客戶端連接到 Redis 集群之后,會同時得到一份關于這個 集群的配置信息,當客戶端具體對某一個 key 值進行操作時,會計算出它的一個 Hash 值,然后把結果對 16384 ?求余數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,Redis 會根據節點數量 大致均等 的將哈希槽映射到不同的節點。

    再結合集群的配置信息就能夠知道這個 key 值應該存儲在哪一個具體的 Redis 節點中,如果不屬于自己管,那么就會使用一個特殊的 MOVED 命令來進行一個跳轉,告訴客戶端去連接這個節點以獲取數據:

    GET x -MOVED 3999 127.0.0.1:6381

    MOVED 指令第一個參數 3999 是 key 對應的槽位編號,后面是目標節點地址,MOVED 命令前面有一個減號,表示這是一個錯誤的消息。客戶端在收到 MOVED 指令后,就立即糾正本地的 槽位映射表,那么下一次再訪問 key 時就能夠到正確的地方去獲取了。

    集群的主要作用

  • 數據分區: 數據分區 (或稱數據分片) 是集群最核心的功能。集群將數據分散到多個節點,一方面 突破了 Redis 單機內存大小的限制,存儲容量大大增加另一方面 每個主節點都可以對外提供讀服務和寫服務,大大提高了集群的響應能力。Redis 單機內存大小受限問題,在介紹持久化和主從復制時都有提及,例如,如果單機內存太大,bgsave 和 bgrewriteaof 的 fork 操作可能導致主進程阻塞,主從環境下主機切換時可能導致從節點長時間無法提供服務,全量復制階段主節點的復制緩沖區可能溢出……

  • 高可用: 集群支持主從復制和主節點的 自動故障轉移 (與哨兵類似),當任一節點發生故障時,集群仍然可以對外提供服務。

  • ■集群中數據如何分區?

    Redis 采用方案三。

    方案一:哈希值 % 節點數

    哈希取余分區思路非常簡單:計算 key 的 hash 值,然后對節點數量進行取余,從而決定數據映射到哪個節點上。

    不過該方案最大的問題是,當新增或刪減節點時,節點數量發生變化,系統中所有的數據都需要 重新計算映射關系,引發大規模數據遷移。

    方案二:一致性哈希分區

    一致性哈希算法將 整個哈希值空間 組織成一個虛擬的圓環,范圍是 [0 - 232 - 1],對于每一個數據,根據 key 計算 hash 值,確數據在環上的位置,然后從此位置沿順時針行走,找到的第一臺服務器就是其應該映射到的服務器:

    與哈希取余分區相比,一致性哈希分區將 增減節點的影響限制在相鄰節點。以上圖為例,如果在 node1 和 node2 之間增加 node5,則只有 node2 中的一部分數據會遷移到 node5;如果去掉 node2,則原 node2 中的數據只會遷移到 node4 中,只有 node4 會受影響。

    一致性哈希分區的主要問題在于,當 節點數量較少 時,增加或刪減節點,對單個節點的影響可能很大,造成數據的嚴重不平衡。還是以上圖為例,如果去掉 node2,node4 中的數據由總數據的 1/4 左右變為 1/2 左右,與其他節點相比負載過高。

    方案三:帶有虛擬節點的一致性哈希分區

    該方案在 一致性哈希分區的基礎上,引入了 虛擬節點 的概念。Redis 集群使用的便是該方案,其中的虛擬節點稱為 槽(slot)。槽是介于數據和實際節點之間的虛擬概念,每個實際節點包含一定數量的槽,每個槽包含哈希值在一定范圍內的數據。

    在使用了槽的一致性哈希分區中,槽是數據管理和遷移的基本單位。槽 解耦數據和實際節點 之間的關系,增加或刪除節點對系統的影響很小。仍以上圖為例,系統中有 4 個實際節點,假設為其分配 16 個槽(0-15);

    • 槽 0-3 位于 node1;4-7 位于 node2;以此類推....

    如果此時刪除 node2,只需要將槽 4-7 重新分配即可,例如槽 4-5 分配給 node1,槽 6 分配給 node3,槽 7 分配給 node4;可以看出刪除 node2 后,數據在其他節點的分布仍然較為均衡。

    ■節點之間的通信機制了解嗎?

    集群的建立離不開節點之間的通信,例如我們在 快速體驗 中剛啟動六個集群節點之后通過 redis-cli 命令幫助我們搭建起來了集群,實際上背后每個集群之間的兩兩連接是通過了 CLUSTER MEET <ip> <port> 命令發送 MEET 消息完成的,下面我們展開詳細說說。

    兩個端口

    哨兵系統 中,節點分為 數據節點哨兵節點:前者存儲數據,后者實現額外的控制功能。在 集群 中,沒有數據節點與非數據節點之分:所有的節點都存儲數據,也都參與集群狀態的維護。為此,集群中的每個節點,都提供了兩個 TCP 端口:

    • 普通端口: 即我們在前面指定的端口 (7000等)。普通端口主要用于為客戶端提供服務 (與單機節點類似);但在節點間數據遷移時也會使用。

    • 集群端口: 端口號是普通端口 + 10000 (10000是固定值,無法改變),如 7000 節點的集群端口為 17000。集群端口只用于節點之間的通信,如搭建集群、增減節點、故障轉移等操作時節點間的通信;不要使用客戶端連接集群接口。為了保證集群可以正常工作,在配置防火墻時,要同時開啟普通端口和集群端口。

    Gossip 協議

    節點間通信,按照通信協議可以分為幾種類型:單對單、廣播、Gossip 協議等。重點是廣播和 Gossip 的對比。

    • 廣播是指向集群內所有節點發送消息。優點 是集群的收斂速度快(集群收斂是指集群內所有節點獲得的集群信息是一致的),缺點 是每條消息都要發送給所有節點,CPU、帶寬等消耗較大。

    • Gossip 協議的特點是:在節點數量有限的網絡中,每個節點都 “隨機” 的與部分節點通信 (并不是真正的隨機,而是根據特定的規則選擇通信的節點),經過一番雜亂無章的通信,每個節點的狀態很快會達到一致。Gossip 協議的 優點 有負載 (比廣播) 低、去中心化、容錯性高 (因為通信有冗余) 等;缺點 主要是集群的收斂速度慢。

    消息類型

    集群中的節點采用 固定頻率(每秒10次)定時任務 進行通信相關的工作:判斷是否需要發送消息及消息類型、確定接收節點、發送消息等。如果集群狀態發生了變化,如增減節點、槽狀態變更,通過節點間的通信,所有節點會很快得知整個集群的狀態,使集群收斂。

    節點間發送的消息主要分為 5 種:meet 消息、ping 消息、pong 消息、fail 消息、publish 消息。不同的消息類型,通信協議、發送的頻率和時機、接收節點的選擇等是不同的:

    • MEET 消息: 在節點握手階段,當節點收到客戶端的 CLUSTER MEET 命令時,會向新加入的節點發送 MEET 消息,請求新節點加入到當前集群;新節點收到 MEET 消息后會回復一個 PONG 消息。

    • PING 消息: 集群里每個節點每秒鐘會選擇部分節點發送 PING 消息,接收者收到消息后會回復一個 PONG 消息。PING 消息的內容是自身節點和部分其他節點的狀態信息,作用是彼此交換信息,以及檢測節點是否在線。PING 消息使用 Gossip 協議發送,接收節點的選擇兼顧了收斂速度和帶寬成本,具體規則如下:(1)隨機找 5 個節點,在其中選擇最久沒有通信的 1 個節點;(2)掃描節點列表,選擇最近一次收到 PONG 消息時間大于 cluster_node_timeout / 2 的所有節點,防止這些節點長時間未更新。

    • PONG消息: PONG 消息封裝了自身狀態數據??梢苑譃閮煞N:第一種 是在接到 MEET/PING 消息后回復的 PONG 消息;第二種 是指節點向集群廣播 PONG 消息,這樣其他節點可以獲知該節點的最新信息,例如故障恢復后新的主節點會廣播 PONG 消息。

    • FAIL 消息: 當一個主節點判斷另一個主節點進入 FAIL 狀態時,會向集群廣播這一 FAIL 消息;接收節點會將這一 FAIL 消息保存起來,便于后續的判斷。

    • PUBLISH 消息: 節點收到 PUBLISH 命令后,會先執行該命令,然后向集群廣播這一消息,接收節點也會執行該 PUBLISH 命令。

    ■集群數據如何存儲的有了解嗎?

    節點需要專門的數據結構來存儲集群的狀態。所謂集群的狀態,是一個比較大的概念,包括:集群是否處于上線狀態、集群中有哪些節點、節點是否可達、節點的主從狀態、槽的分布……

    節點為了存儲集群狀態而提供的數據結構中,最關鍵的是 clusterNode 和 clusterState 結構:前者記錄了一個節點的狀態,后者記錄了集群作為一個整體的狀態。

    clusterNode 結構

    clusterNode 結構保存了 一個節點的當前狀態,包括創建時間、節點 id、ip 和端口號等。每個節點都會用一個 clusterNode 結構記錄自己的狀態,并為集群內所有其他節點都創建一個 clusterNode 結構來記錄節點狀態。

    下面列舉了 clusterNode 的部分字段,并說明了字段的含義和作用:

    typedef struct clusterNode {//節點創建時間mstime_t ctime;//節點idchar name[REDIS_CLUSTER_NAMELEN];//節點的ip和端口號char ip[REDIS_IP_STR_LEN];int port;//節點標識:整型,每個bit都代表了不同狀態,如節點的主從狀態、是否在線、是否在握手等int flags;//配置紀元:故障轉移時起作用,類似于哨兵的配置紀元uint64_t configEpoch;//槽在該節點中的分布:占用16384/8個字節,16384個比特;每個比特對應一個槽:比特值為1,則該比特對應的槽在節點中;比特值為0,則該比特對應的槽不在節點中unsigned char slots[16384/8];//節點中槽的數量int numslots;………… } clusterNode;

    除了上述字段,clusterNode 還包含節點連接、主從復制、故障發現和轉移需要的信息等。

    clusterState 結構

    clusterState 結構保存了在當前節點視角下,集群所處的狀態。主要字段包括:

    typedef struct clusterState {//自身節點clusterNode *myself;//配置紀元uint64_t currentEpoch;//集群狀態:在線還是下線int state;//集群中至少包含一個槽的節點數量int size;//哈希表,節點名稱->clusterNode節點指針dict *nodes;//槽分布信息:數組的每個元素都是一個指向clusterNode結構的指針;如果槽還沒有分配給任何節點,則為NULLclusterNode *slots[16384];………… } clusterState;

    除此之外,clusterState 還包括故障轉移、槽遷移等需要的信息。

    五、其他問題

    ■Redis 如何實現分布式鎖?

    推薦閱讀 之前的系列文章:Redis(3)——分布式鎖深入探究

    ■Redis 過期鍵的刪除策略?

    簡單描述

    先拋開 Redis 想一下幾種可能的刪除策略:

  • 定時刪除:在設置鍵的過期時間的同時,創建一個定時器 timer). 讓定時器在鍵的過期時間來臨時,立即執行對鍵的刪除操作。

  • 惰性刪除:放任鍵過期不管,但是每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期,如果過期的話,就刪除該鍵;如果沒有過期,就返回該鍵。

  • 定期刪除:每隔一段時間程序就對數據庫進行一次檢查,刪除里面的過期鍵。至于要刪除多少過期鍵,以及要檢查多少個數據庫,則由算法決定。

  • 在上述的三種策略中定時刪除和定期刪除屬于不同時間粒度的 主動刪除,惰性刪除屬于 被動刪除。

    三種策略都有各自的優缺點

  • 定時刪除對內存使用率有優勢,但是對 CPU 不友好;

  • 惰性刪除對內存不友好,如果某些鍵值對一直不被使用,那么會造成一定量的內存浪費;

  • 定期刪除是定時刪除和惰性刪除的折中。

  • Redis 中的實現

    Reids 采用的是 惰性刪除和定時刪除 的結合,一般來說可以借助最小堆來實現定時器,不過 Redis 的設計考慮到時間事件的有限種類和數量,使用了無序鏈表存儲時間事件,這樣如果在此基礎上實現定時刪除,就意味著 O(N) 遍歷獲取最近需要刪除的數據。

    ■Redis 的淘汰策略有哪些?

    Redis 有六種淘汰策略

    策略描述
    volatile-lru從已設置過期時間的 KV 集中優先對最近最少使用(less recently used)的數據淘汰
    volitile-ttl從已設置過期時間的 KV 集中優先對剩余時間短(time to live)的數據淘汰
    volitile-random從已設置過期時間的 KV 集中隨機選擇數據淘汰
    allkeys-lru從所有 KV 集中優先對最近最少使用(less recently used)的數據淘汰
    allKeys-random從所有 KV 集中隨機選擇數據淘汰
    noeviction不淘汰策略,若超過最大內存,返回錯誤信息

    4.0 版本后增加以下兩種

    • volatile-lfu:從已設置過期時間的數據集(server.db[i].expires)中挑選最不經常使用的數據淘汰

    • allkeys-lfu:當內存不足以容納新寫入數據時,在鍵空間中,移除最不經常使用的 key

    ■Redis常見性能問題和解決方案?

  • Master 最好不要做任何持久化工作,包括內存快照和 AOF 日志文件,特別是不要啟用內存快照做持久化。

  • 如果數據比較關鍵,某個 Slave 開啟 AOF 備份數據,策略為每秒同步一次。

  • 為了主從復制的速度和連接的穩定性,Slave 和 Master 最好在同一個局域網內。

  • 盡量避免在壓力較大的主庫上增加從庫。

  • Master 調用 BGREWRITEAOF 重寫 AOF 文件,AOF 在重寫的時候會占大量的 CPU 和內存資源,導致服務 load 過高,出現短暫服務暫?,F象。

  • 為了 Master 的穩定性,主從復制不要用圖狀結構,用單向鏈表結構更穩定,即主從關系為:Master<–Slave1<–Slave2<–Slave3…,這樣的結構也方便解決單點故障問題,實現 Slave 對 Master 的替換,也即,如果 Master 掛了,可以立馬啟用 Slave1 做 Master,其他不變。

  • ■假如Redis里面有1億個key,其中有10w個key是以某個固定的已知的前綴開頭的,如何將它們全部找出來?

    使用 keys 指令可以掃出指定模式的 key 列表。但是要注意 keys 指令會導致線程阻塞一段時間,線上服務會停頓,直到指令執行完畢,服務才能恢復。這個時候可以使用 scan 指令,scan 指令可以無阻塞的提取出指定模式的 key 列表,但是會有一定的重復概率,在客戶端做一次去重就可以了,但是整體所花費的時間會比直接用 keys 指令長。

    ■More..

    參考資料

  • 3w字深度好文|Redis面試全攻略,讀完這個就可以和面試官大戰幾個回合了 - https://mp.weixin.qq.com/s/f9N13fnyTtnu2D5sKZiu9

  • 大廠面試!我和面試官之間關于Redis的一場對弈!- https://mp.weixin.qq.com/s/DHTPSfmWTZpdTmlytzLz1

  • Redis面試題(2020最新版) - https://blog.csdn.net/ThinkWon/article/details/103522351

  • 總結

    以上是生活随笔為你收集整理的妈妈再也不担心我面试被 Redis 问得脸都绿了的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    日韩素人在线观看 | 三级性生活视频 | 精品视频免费 | 天天干 夜夜操 | 成人黄色视 | 精品国产精品国产偷麻豆 | 国产一级久久久 | 五月天丁香视频 | 日韩精品久久久久久久电影竹菊 | av综合站| 久久久激情网 | 色网站视频 | 成人黄色av免费在线观看 | 欧美日韩久久久 | 99精品免费在线 | 久久精品专区 | 成人av.com| 日韩成人精品一区二区 | 色吊丝在线永久观看最新版本 | 黄色软件在线观看 | 在线观看免费av片 | 免费看黄色91 | 91久久奴性调教 | 日韩,中文字幕 | 色香网 | 午夜视频导航 | 婷婷六月天丁香 | 亚洲精品ww | 成年人电影免费在线观看 | 国产精品久久久久久久7电影 | av网站大全免费 | 国产精品初高中精品久久 | 黄色网址av| 伊人六月 | 99精品国产在热久久下载 | 99在线免费观看视频 | 色国产精品一区在线观看 | 成人sm另类专区 | 国产精品12| 92av视频 | 91视频在线网址 | 插久久| 欧美精品久久久久久久久久久 | 国产在线播放一区二区三区 | 亚洲精品国产欧美在线观看 | 韩国中文三级 | 2021av在线 | 91高清视频免费 | 九九亚洲视频 | 在线播放一区二区三区 | 国产精品视频免费 | 久久性生活片 | 久久久久9999亚洲精品 | 草久在线播放 | 综合婷婷丁香 | 久久久久综合精品福利啪啪 | 成人黄色小说视频 | 国内精品久久久 | 色播六月天 | 中文区中文字幕免费看 | 国产精品专区h在线观看 | 在线 高清 中文字幕 | 丁香高清视频在线看看 | 天天操天天射天天 | 久久免费视频一区 | 99久久精品一区二区成人 | 丁香网五月天 | 高清日韩一区二区 | 国产黄色在线网站 | 色婷婷激情四射 | 国产精品涩涩屋www在线观看 | 91精品国自产在线偷拍蜜桃 | 婷婷久久五月 | 日韩精品中文字幕在线播放 | 色天天综合久久久久综合片 | 98超碰人人 | 欧美日韩国产色综合一二三四 | 免费观看国产成人 | 91看片一区二区三区 | 69国产盗摄一区二区三区五区 | 国产美女搞久久 | 色欧美视频 | www.色的| 成人三级视频 | 视频一区二区在线观看 | 一级黄色a视频 | 日本精品视频在线播放 | 免费精品视频在线 | 久操视频在线播放 | 狠狠干免费 | 在线观看aaa | 欧美性性网 | 中文字幕av在线播放 | 国产五月婷 | 亚洲视频,欧洲视频 | www.狠狠操.com | 麻豆国产精品一区二区三区 | 久久毛片高清国产 | 中文字幕在线观看资源 | 久久精品日产第一区二区三区乱码 | 国内一区二区视频 | 99精品一级欧美片免费播放 | 久草视频在| 天天操夜夜操夜夜操 | 久久婷婷视频 | 97视频在线观看视频免费视频 | 精品国产1区 | 高清精品在线 | 亚洲激情五月 | 中文永久免费观看 | 国产五十路毛片 | 国产一级视频在线免费观看 | 国产精品久久久久久久久久尿 | 97人人澡人人添人人爽超碰 | 精品国产乱码久久久久久浪潮 | 日韩动态视频 | 99久久精品国产网站 | 黄p网站在线观看 | 久草网免费 | 日本中文字幕电影在线免费观看 | 国产精品女同一区二区三区久久夜 | 免费网站在线观看成人 | 精品国产一区二区三区在线 | 中文字幕av日韩 | 国产精品福利久久久 | 777奇米四色 | 91精品国自产在线观看欧美 | 午夜精品一区二区三区在线视频 | 岛国av在线 | 日韩天堂网 | 在线免费视 | 九九视频免费观看视频精品 | 久久久久影视 | 精品高清视频 | 福利一区在线视频 | 又大又硬又黄又爽视频在线观看 | 精品黄色在线观看 | 97在线观看免费 | 日韩欧美精品一区二区 | 国产精品久久麻豆 | 国产精品二区在线 | 国产精品毛片一区二区在线看 | av免费在线免费观看 | 2019国产精品 | 一区二区三区四区五区在线视频 | 久久精品日本啪啪涩涩 | 欧美a在线免费观看 | 在线免费观看视频一区二区三区 | 亚洲成aⅴ人在线观看 | 黄色av在 | 激情综合网五月激情 | 91视频 - v11av | 国产一区久久久 | 一级一片免费看 | 丝袜美腿在线播放 | 色a4yy| 97av视频在线观看 | 干狠狠| 亚洲精品久 | 99r在线播放 | 久久久久久久久久免费 | 欧美日韩一区二区免费在线观看 | 96精品视频 | 国产视频久久久 | 日韩在线观看中文字幕 | 丁香影院在线 | aaa黄色毛片| www.av在线.com| 精品毛片在线 | 国产午夜不卡 | 国产中文字幕大全 | 亚洲三级网 | 欧美性生活小视频 | 91成人精品一区在线播放 | 免费观看www7722午夜电影 | 日韩在线免费高清视频 | 在线观看免费91 | 国产精品久久久久免费观看 | 久久黄色a级片 | 黄色片网站av | 麻花豆传媒一二三产区 | 国内精品久久久久影院优 | 国产91学生粉嫩喷水 | 免费大片黄在线 | 亚洲成人av片在线观看 | 日韩欧美有码在线 | 日本三级吹潮在线 | 亚洲精选国产 | 天天操比 | 99精品在线视频播放 | 国产精品爽爽爽 | 日韩久久午夜一级啪啪 | 女人18精品一区二区三区 | 欧美激情精品久久久久久免费印度 | 91热在线| 欧美日韩一区二区三区在线观看视频 | 婷婷在线精品视频 | 午夜精品久久久久久久爽 | 国产精品99久久久久 | 99久久国产免费,99久久国产免费大片 | 国产精品高潮呻吟久久久久 | 免费视频资源 | 精品不卡视频 | 久久综合九色综合欧美就去吻 | 欧美日韩免费一区 | 美女网站视频色 | 久久影院中文字幕 | 欧美最猛性xxxxx免费 | 成人免费视频播放 | 激情久久一区二区三区 | 中文在线免费观看 | 亚洲精选99 | 99免费看片| 日韩欧美电影在线观看 | 成人黄色毛片视频 | 亚洲在线观看av | 欧美电影黄色 | 日韩中文字幕免费在线播放 | 精品国产一区二区三区不卡 | 日韩精品中文字幕在线播放 | 国产香蕉97碰碰久久人人 | 亚洲欧美国内爽妇网 | 国产69久久久欧美一级 | 草久在线观看视频 | zzijzzij亚洲成熟少妇 | 久久国产亚洲精品 | 99精品免费久久久久久久久日本 | 久久久免费视频播放 | 欧美亚洲久久 | av免费在线免费观看 | 天天av天天 | 欧美一级片在线免费观看 | 婷婷久久一区二区三区 | 久久久久亚洲国产精品 | 亚洲免费高清视频 | 久操97| 美女视频黄,久久 | 亚洲欧美激情插 | 女人18毛片90分钟 | 国产丝袜 | a特级毛片| av性网站 | 综合网天天色 | 中午字幕在线观看 | 99在线观看免费视频精品观看 | 久久99国产精品二区护士 | 亚洲天天在线日亚洲洲精 | 天天色天天射天天操 | 久久精品精品电影网 | 婷婷综合影院 | 超碰人人在| 在线 国产 亚洲 欧美 | 美腿丝袜一区二区三区 | 中文字幕第一页在线视频 | 中文字幕一二三区 | 国产伦精品一区二区三区… | 在线亚洲激情 | 色香网 | 日韩欧美99| 人人天天夜夜 | 射射色 | 国产一级大片免费看 | 欧美在线一二区 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 亚洲黄色高清 | bbbb操bbbb | 国产欧美精品一区二区三区 | www.福利 | 国产日韩一区在线 | 伊人国产在线播放 | 天天天色综合 | 中文字幕av电影下载 | 一区二区三区四区在线免费观看 | 欧美乱码精品一区二区 | 久久免费的精品国产v∧ | 欧美在线观看视频免费 | 久久五月激情 | 国产精品久久久久久久久免费 | 玖玖视频网 | 亚洲国产精品久久久 | 国产裸体bbb视频 | 最新国产一区二区三区 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 国产破处在线视频 | 国产精品伦一区二区三区视频 | 深夜激情影院 | 久久免费成人精品视频 | 久久午夜免费视频 | 婷婷福利影院 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 日韩精品最新在线观看 | 黄色精品久久 | 久久专区| 91禁在线观看 | 亚洲男男gaygay无套同网址 | 国产婷婷一区二区 | 国产精品一区二区三区在线看 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 国产精品刺激对白麻豆99 | 亚洲午夜久久久影院 | 99色婷婷 | 久久8| 日韩va欧美va亚洲va久久 | 日韩大片在线免费观看 | 日韩中文在线电影 | 伊人小视频 | 亚洲国产大片 | 91av视频免费观看 | 欧美了一区在线观看 | 久草免费看 | 中文字幕一二三区 | 成人国产亚洲 | 国产不卡av在线 | 超碰在线人 | 激情久久久久久久久久久久久久久久 | 久草综合视频 | 免费美女久久99 | 国产精品久久久久久欧美 | 在线观看日本高清mv视频 | 成人在线观看影院 | 日韩专区在线 | 色在线高清 | 亚洲综合色视频在线观看 | 国产精品video爽爽爽爽 | 精品免费久久久久 | 中文字幕成人一区 | 国产无套视频 | 久久视奸 | 黄av免费在线观看 | 久久99精品一区二区三区三区 | 一区二区久久久久 | 日韩免费视频线观看 | 亚洲少妇自拍 | 日日干美女 | 99久久99久久免费精品蜜臀 | 国内精品久久久久影院一蜜桃 | 久久av黄色| av在线播放快速免费阴 | 黄色av影视| 久草视频免费观 | 国产黄大片在线观看 | 天天色天天操综合网 | 成人黄色在线电影 | 日日爱网站| 99久久99久久综合 | 精品久久福利 | 一区二区三区免费在线观看 | av电影中文字幕 | 欧美另类巨大 | 超碰人人草人人 | 草久久影院| 天天曰| 国产精品成人久久久久久久 | 999色视频| 欧美一二区视频 | 狠狠gao| 日韩高清无线码2023 | 久久久亚洲精华液 | 日韩国产精品久久久久久亚洲 | 69视频在线 | 狠狠黄| 在线播放第一页 | 日韩中文在线观看 | 欧美成年人在线视频 | 黄色a一级视频 | 国产视频不卡一区 | 亚洲精品综合一二三区在线观看 | 日韩欧美黄色网址 | 欧美一级在线观看视频 | 免费高清看电视网站 | 最新av免费 | 草草草影院 | 草久在线观看视频 | 中文字幕精品久久 | 伊人黄色网 | 欧美精品你懂的 | 日韩和的一区二在线 | 99在线视频精品 | 国产伦理一区二区三区 | 美女很黄免费网站 | 免费网站黄 | 国产一区国产精品 | 在线不卡a | 三级黄色片子 | 在线精品观看 | 国产成人精品一区二区 | 亚洲视频久久久久 | 色香蕉在线视频 | 蜜臀精品久久久久久蜜臀 | 中文字幕一区二区三区四区在线视频 | 久久影院午夜论 | 91污在线 | 免费在线观看视频一区 | 在线观看av小说 | 精品久久中文 | 久久中文欧美 | 国产999视频在线观看 | 亚洲天堂网视频在线观看 | 激情av一区二区 | 最近中文字幕免费视频 | 日韩免费在线看 | 天天插日日操 | 国产精品国产三级国产aⅴ无密码 | 中文字幕视频免费观看 | 4438全国亚洲精品观看视频 | 国产日韩av在线 | 天天干天天操人体 | 狠狠干网址 | 亚洲精品美女在线 | 人人干人人上 | 日韩欧美在线视频一区二区三区 | 国产第一页福利影院 | 亚洲天天摸日日摸天天欢 | 玖玖在线精品 | 国产精品99久久久久久宅男 | 黄a在线看 | 美腿丝袜一区二区三区 | 欧美男同视频网站 | 免费色视频在线 | 日韩高清在线看 | 久久99最新地址 | 免费在线播放黄色 | 亚洲一区二区三区毛片 | 日日干日日 | 久久精品国产99国产 | 在线成人一区二区 | 日韩欧美视频 | 国内精品久久久久久久久久 | 麻豆视频入口 | 天天干天天搞天天射 | 天天操综合网站 | 日韩美女久久 | 五月婷久 | 福利一区在线 | 美女网站在线观看 | 天天操天天干天天干 | 欧美一区二区三区不卡 | 六月色婷 | 日本一区二区高清不卡 | 婷婷激情五月综合 | 国产亚洲精品免费 | 天天操网站 | 日韩精品不卡 | 草在线视频| 人人看看人人 | 久久视频一区二区 | 欧美精品黑人性xxxx | 热久久电影 | 日韩精品免费一区二区 | 欧美激情精品久久久久久免费 | 成人免费视频视频在线观看 免费 | 日韩午夜网站 | 久久好看免费视频 | 黄色日批网站 | 婷婷丁香色 | 五月婷婷深开心 | 国产日本在线 | 欧美福利视频 | 欧美一级爽 | 最新国产精品亚洲 | 久久精品国产免费看久久精品 | 国产护士hd高朝护士1 | 天天摸夜夜添 | 国产福利在线免费 | 日韩精品免费一区 | 久久精品99国产精品 | 免费观看十分钟 | 亚洲伦理一区二区 | 国产精品美女久久久久久久 | 欧美另类网站 | 91高清免费看 | 噜噜色官网| 伊人影院得得 | 最新av观看 | 91麻豆精品国产91久久久更新时间 | 久久免费视频在线观看6 | 欧美性成人 | 成人在线视频你懂的 | 日韩视频在线不卡 | 久久国产精品99精国产 | 精品久久久久久亚洲 | 国产精品一区二区在线 | 精品国产一区二区三区久久久 | 免费人成网 | 在线观看国产高清视频 | japanesexxxxfreehd乱熟 | 免费观看久久久 | 色狠狠一区二区 | 操操日日| 成人av片免费观看app下载 | 久久精品一二三区白丝高潮 | 在线观看免费视频你懂的 | 国产亚洲精品中文字幕 | 日韩高清www | 亚洲精品国偷自产在线99热 | 免费aa大片 | 日本久久综合网 | 国产精品女人久久久久久 | 亚洲国产精品成人综合 | 婷婷色狠狠 | 欧美精品一区二区三区一线天视频 | 亚洲国产成人精品在线 | 久久一区二区三区四区 | 日韩精品视 | 亚洲精品在线视频观看 | 久久久久日本精品一区二区三区 | 免费毛片一区二区三区久久久 | 精品国产一区二区三区不卡 | 最新av网址在线观看 | 97精品一区二区三区 | 亚洲va欧美va | 97在线视| 欧美精品一区二区三区一线天视频 | 不卡的av电影 | 日韩在线欧美在线 | 日韩精品视频一二三 | 美女网站在线免费观看 | 国产精品永久在线观看 | 深夜免费福利网站 | 精品久久久久久亚洲综合网站 | 伊人网综合在线观看 | 亚洲免费在线观看视频 | 国产日韩中文字幕 | 久久久久电影网站 | 永久免费的av电影 | 欧美激情视频一二区 | 黄色av电影 | 国产1区2区3区精品美女 | 久久久国产视频 | 碰超在线| 欧美日韩二区三区 | 操久| 怡春院av| 日韩精品最新在线观看 | 亚洲清纯国产 | 亚洲精品中文字幕视频 | 日韩欧美网站 | 日韩网站在线看片你懂的 | 国产玖玖精品视频 | 深爱激情五月婷婷 | 国产精品一区在线播放 | 亚洲精品国产视频 | 国内精品久久久久久久久久 | 日韩精品在线视频免费观看 | 日韩精品久久久久久中文字幕8 | 色综合久久88色综合天天免费 | 波多野结衣久久资源 | 成人午夜电影免费在线观看 | 黄色大全在线观看 | 精品中文字幕在线 | 亚洲 综合 激情 | av在线一级 | 丁香六月中文字幕 | 欧产日产国产69 | 激情文学丁香 | 国产成人一区二区三区影院在线 | 国产黄色在线网站 | 国产精品久久久久999 | 午夜久久成人 | 最新中文字幕在线资源 | 日韩欧美一区二区三区黑寡妇 | 手机在线视频福利 | 人人澡人人爽欧一区 | 一本大道久久精品懂色aⅴ 五月婷社区 | 成人小视频在线免费观看 | 久久免费黄色大片 | 主播av在线 | 久久99精品国产99久久 | 欧美视频日韩视频 | 99精品在线播放 | 97超碰免费在线观看 | 日韩av成人在线观看 | 亚洲精品国产第一综合99久久 | 天天综合五月天 | 91精品久久久久久久久久入口 | 亚洲国产剧情 | 久久久久国产精品免费 | 精品uu | 亚洲一区欧美激情 | 日韩av中文字幕在线免费观看 | 亚洲欧洲成人精品av97 | av高清影院 | 成人免费视频播放 | www日日 | 国产精品一区二区三区久久 | 国内外成人免费在线视频 | 丁香视频五月 | 免费a视频在线 | 亚洲欧美日韩一区二区三区在线观看 | 国产福利在线 | 大荫蒂欧美视频另类xxxx | 蜜臀av性久久久久蜜臀av | 在线三级中文 | 在线视频 91 | 亚洲国产人午在线一二区 | 成年人免费看片 | 国产精品久久9 | 久久久久久久久久亚洲精品 | 久久综合成人 | 久草在线这里只有精品 | 亚洲激情| 丁香视频全集免费观看 | www激情久久 | www免费看片com | 国产精品第二页 | 亚洲人成免费 | 国产成人精品免高潮在线观看 | 狠狠色伊人亚洲综合网站野外 | 在线天堂亚洲 | 探花视频在线观看免费 | 亚洲人人精品 | 久久国产精品第一页 | 久久tv视频 | 丁香婷婷激情网 | 91福利视频免费观看 | 成人免费色 | 中文字幕二区三区 | 亚洲精品女 | www.在线看片.com | 亚洲日本中文字幕在线观看 | 免费看的国产视频网站 | 精品一二三区 | 伊人五月天婷婷 | 天天操天天操天天操 | 亚洲精品久久激情国产片 | 在线观看你懂的网站 | 国产精品 中文在线 | 99视频精品全部免费 在线 | 成人国产网址 | 亚洲成人中文在线 | 国产精品门事件 | 欧美极品裸体 | 久久天堂网站 | 亚州精品视频 | 婷婷丁香激情 | 综合色在线 | 亚洲天天综合网 | 成人黄色电影视频 | 色婷婷激情 | 国产美女精品在线 | 亚洲涩涩涩 | 久久艹综合 | 日韩免费一级a毛片在线播放一级 | 久久国产电影院 | 国产精品大全 | 一区二区精品在线 | 久久婷亚洲五月一区天天躁 | 国产资源免费 | 黄色官网在线观看 | 在线影院av | 国产高清中文字幕 | 日韩精品免费一区二区 | 在线观看午夜 | 成人欧美一区二区三区在线观看 | 精品在线观看国产 | 久久久国产影院 | 日韩在线观看中文字幕 | 日本中文在线 | 久草在线视频在线观看 | 国产一区二区综合 | 99电影| 五月婷婷视频在线 | 99久久久久国产精品免费 | 激情av资源 | 午夜视频在线观看一区二区 | 国产精品嫩草55av | 午夜精品一区二区三区免费视频 | 一区二区高清在线 | 五月天综合 | 天天天干天天射天天天操 | 福利一区二区在线 | 激情视频一区二区三区 | 天天操天天干天天插 | 亚洲第一成网站 | 色综合欧洲 | 久久国产精品99国产 | 欧美美女视频在线观看 | 亚洲黄色app | 国产精品爽爽爽 | 国产一区在线免费观看视频 | 中文字幕一区二区在线播放 | 婷色| 国内精品久久久久久久久久清纯 | 日韩免费高清在线 | 干av在线 | 欧美午夜性生活 | 亚洲专区在线 | 69av久久 | 国产麻豆电影 | 17婷婷久久www | 国产黄在线免费观看 | 欧美极品久久 | 国产亚洲精品久久久久久 | 国产成人精品不卡 | 天天综合五月天 | 97视频资源 | 久久亚洲专区 | 午夜国产在线观看 | 国产亚洲永久域名 | 91亚洲在线观看 | 国产高清在线观看 | 日韩系列在线观看 | av手机在线播放 | 午夜美女福利 | 久久福利 | 狠狠狠色丁香综合久久天下网 | 69视频永久免费观看 | 日本动漫做毛片一区二区 | 播五月婷婷 | 国产精品刺激对白麻豆99 | 国产激情电影综合在线看 | 美女在线免费视频 | 91av久久 | 亚洲精品黄色 | 国产人在线成免费视频 | 午夜视频一区二区 | 日韩免费电影网 | 国产一区二区在线免费播放 | 久久综合成人 | 亚洲精品国产精品国 | 丁香久久婷婷 | 日日插日日干 | 四虎小视频 | 菠萝菠萝在线精品视频 | 欧美精品在线视频观看 | 99国产精品久久久久老师 | 国产精品久久久久国产精品日日 | 国产中文字幕在线 | 四虎在线观看 | 日本中文字幕久久 | 国产精品99久久久久久人免费 | 国产只有精品 | 国产激情小视频在线观看 | 92国产精品久久久久首页 | 操久久免费视频 | 日韩av电影中文字幕 | 6080yy精品一区二区三区 | 精品超碰 | 超碰激情在线 | 亚洲国产字幕 | 成人免费色 | 婷婷五月色综合 | 国产精品毛片一区视频 | 丁香六月伊人 | 人人澡人人干 | 日批在线观看 | 久久视屏网 | 久久91久久久久麻豆精品 | www.色com | 国产精选在线 | 国产亚洲免费的视频看 | 国产精品视频区 | 一区二区视频在线观看免费 | 69av免费视频 | 高潮久久久久久 | 亚洲在线视频免费 | 亚洲乱码一区 | 成人蜜桃网 | 韩国精品在线 | 人人狠狠综合久久亚洲 | 天天色中文 | 欧美 日韩 国产 成人 在线 | a视频在线观看免费 | 麻豆你懂的| av黄色免费在线观看 | 免费在线黄色av | 中文字幕在线国产精品 | 色婷婷激情| 亚洲欧美日韩精品久久久 | 在线国产91| 99久久99久久免费精品蜜臀 | 久久久久国产免费免费 | 插综合网 | 伊人色**天天综合婷婷 | 欧美一级在线看 | 日韩高清av | jizzjizzjizz亚洲 | 色婷婷播放| 欧美精品乱码久久久久久 | 久久久高清免费视频 | 亚洲天堂社区 | 91桃色免费观看 | 国产日本在线观看 | 97精品国产91久久久久久久 | 精品国产一区二区三区四区vr | 国产精品va在线观看入 | 久久人网 | 久草视频在线资源 | 91麻豆国产| 亚洲天堂自拍视频 | 欧美日韩精品国产 | 中文字幕黄色网址 | 中文字幕在线人 | 日韩中文在线视频 | 色a4yy| 久福利| 少妇视频一区 | 色999在线 | 久久影视网 | 色在线视频 | 国产亚洲人成网站在线观看 | 免费午夜av | 成人小电影在线看 | 99视频免费 | 精品国产乱码久久久久久天美 | 亚洲精品视频在线观看免费视频 | 久久久国产精品人人片99精片欧美一 | 91久久国产综合精品女同国语 | 国产女做a爱免费视频 | 国产黄色大片 | 亚洲成人影音 | 精品久久久久久久久久岛国gif | 一区二区视频电影在线观看 | 婷五月激情 | 综合伊人久久 | 亚洲精品日韩在线观看 | 久久综合九色欧美综合狠狠 | 精品福利视频在线 | 一区二区av | 欧美久久久 | 看污网站| 久久99精品国产 | 国产资源网站 | 国产视频一区在线 | 日韩视频在线观看视频 | 亚洲成人动漫在线观看 | 深爱激情五月综合 | 日韩狠狠操| 中文字幕欧美日韩va免费视频 | 日韩av三区 | 国产精品 中文在线 | 天天干天天做 | 日韩精品在线看 | 免费视频 三区 | 婷婷色六月天 | 少妇视频在线播放 | 亚洲jizzjizz日本少妇 | 欧美男男激情videos | 成x99人av在线www | 国产三级久久久 | 国产成人a v电影 | 久久婷婷国产色一区二区三区 | 丁香婷婷网 | 色姑娘综合天天 | 九九视频在线观看视频6 | 国产精品免费成人 | 天堂网av在线 | 国产精品99久久久久久武松影视 | 国产成人精品亚洲a | 国产精品久久久av久久久 | 免费网址你懂的 | 色丁香综合 | 亚洲高清视频在线 | 久久人91精品久久久久久不卡 | 五月天色丁香 | 亚洲九九九在线观看 | 波多野结衣一区 | 精品国产一区二区三区四区在线观看 | 又湿又紧又大又爽a视频国产 | 欧美日韩精品在线免费观看 | 成人免费影院 | 日韩电影中文,亚洲精品乱码 | 91在线精品秘密一区二区 | 久草久视频 | 美女久久久久久久久久 | 成人av高清在线观看 | 99精品欧美一区二区三区黑人哦 | 天天色播| 国产一区二区精品在线 | 国产亚洲观看 | 日韩丝袜| 久久精品综合 | 日日夜色 | 精品一区 在线 | 天天天射| 在线视频 你懂得 | 欧美性久久久 | 香蕉网站在线观看 | 中文字幕视频免费观看 | 五月天婷婷视频 | 在线精品视频在线观看高清 | 99在线免费视频 | 超碰在线94 | 五月花丁香婷婷 | 在线看欧美 | 久久免费观看少妇a级毛片 久久久久成人免费 | 综合久久久久久久 | 日韩高清无线码2023 | 91成人精品一区在线播放 | 在线看的av网站 | 中文字幕在线国产精品 | 黄av免费在线观看 | 亚洲精品日韩在线观看 | 免费日韩电影 | 亚洲免费精品视频 | 欧美日韩在线看 | 国产精品一码二码三码在线 | 在线播放国产精品 | 午夜久久福利视频 | 一区二区中文字幕在线播放 | 久久av影视| 二区三区在线视频 | 日本精品久久久久中文字幕 | 香蕉久草 | 夜夜干天天操 | 成人午夜电影免费在线观看 | 亚洲综合色丁香婷婷六月图片 | 天堂av最新网址 | 久久国产欧美日韩精品 | 久久久久久久久久久精 | 国产一区在线不卡 | 99国产精品一区二区 | 开心丁香婷婷深爱五月 | 国产日韩精品欧美 | 天天射综合网视频 | 人人干在线观看 | 三级av免费 | 国产一二三四在线观看视频 | 日韩欧美一区视频 | 欧美a级一区二区 | 激情欧美国产 | 在线久久| 国产精品久久久久永久免费 | 天天操天天射天天舔 | 午夜天使 | 在线看的毛片 | 亚洲乱码精品久久久 | 国产一区在线不卡 | av专区在线| 狠狠综合久久 | 国产高清视频免费最新在线 | 国产成人l区 | 久久看片网站 | 欧美日韩在线播放 | 亚洲日本精品视频 | 在线看的av网站 | 国产精品一区二区久久精品爱微奶 | 久日精品 | 国产原创在线 | 在线观看韩日电影免费 | 国产美女永久免费 | 亚洲电影影音先锋 | 亚洲视频在线观看网站 | 黄色电影网站在线观看 | 久久精品国产亚洲aⅴ | av丝袜在线 | 亚洲免费成人 | 久久久久高清毛片一级 | 国产精品自在线拍国产 | 狠狠夜夜 | 国产精品免费久久久久久 | 久久久免费在线观看 | 日韩午夜av | 亚洲视频一 | 久久一视频| 一区二区三区精品在线视频 | 亚洲国产精品va在线看黑人动漫 | 久久玖| 国产精品高清在线观看 | 91av亚洲| 免费福利在线播放 | 日韩电影在线一区二区 | 奇米影视在线99精品 | 成人午夜黄色影院 | 天天se天天cao天天干 | 在线视频1卡二卡三卡 | 免费在线激情视频 | 日本一区二区免费在线观看 | 黄视频网站大全 | 97电影在线看视频 | 国产精品v欧美精品v日韩 | 精品国产一区二区三区久久 | 天天色婷婷 | 999精品在线| 久久综合爱 | 久久99免费观看 | 私人av| 91成人在线看| www.夜色.com | 99激情网 | 美女免费黄视频网站 | 国产成人精品一区二区三区免费 | 超碰午夜 | 亚洲www天堂com | 欧美一级黄色视屏 | 国产久视频| 久久国产精品系列 | 91精品在线看 | 亚洲国产视频网站 | 综合国产在线 | 天天曰 | 丁香在线观看完整电影视频 | 亚洲a在线观看 | 四虎国产精品永久在线国在线 | 免费观看黄色12片一级视频 | 91精品视频免费看 | 婷婷新五月 | 欧美日高清视频 |