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

騰訊面試之言淺意深 Redis

存儲 存儲軟件 Redis
字符串 String、列表 list、集合 set、有序集合 sortedSet、哈希 hash、位圖 bitMap 、Stream 流(redis 5.0 版本新特性)、HyperLogLog。

[[398188]]

本文轉載自微信公眾號「碼農私房話」,作者Liew。轉載本文請聯系碼農私房話公眾號。

redis 與 memcached 的區別

數據類型:memcached 只支持 string,而 redis 還支持列表 list、集合 set、hash、有序集合 sortedSet、位圖 bitMap、HyperLogLog 以及 Stream(redis 5.0 版本新特性)。

主從備份:redis 支持主從的模式應用,主數據庫有多個副本,使得可以擴展數據庫讀取能力,且具有高可用性。

數據存儲:memcached 與 redis 都支持數據存儲在內存中,除此之外, redis 還支持將數據保存在磁盤中。

持久化:memcached 的數據只保存在內存,宕機后數據將丟失,而 redis 可利用持久化機制將數據保留在磁盤上,用于歸檔或恢復。

事務:redis 支持事務,可將一組命令原子操作地執行。

發布/訂閱:redis 支持具有模式匹配的發布/訂閱消息功能。

Lua 腳本:redis 允許執行事務性 Lua 腳本,幫助提高性能并簡化應用代碼。

地理空間支持:redis 具有專用命令,可以處理大規模實時地理空間數據,例如查找兩個元素(人或地方)之間的距離以及查找點的給定距離內的所有元素。

線程模型:redis 使用的是單線程模型,而 memcached 使用的是多線程架構,可以利用多個核心及擴大計算能力來處理更多操作,在一定程度上性能會比 redis 優秀。

多語言客戶端支持:redis 和 memcached 都支持多種語言客戶端,包括 Java、Python、Php、C、C ++、Go等。

redis 有哪些數據類型

字符串 String、列表 list、集合 set、有序集合 sortedSet、哈希 hash、位圖 bitMap 、Stream 流(redis 5.0 版本新特性)、HyperLogLog。

redis 的使用場景有哪些?

熱點數據緩存:對于系統中常用且不常更新的數據可加載到 redis ,提升性能。

分布式鎖:結合 setexnx命令實現或者直接用 Redisson 的功能。

排行榜:使用 Sorted Sets 輕松實現游戲排行榜。

隊列:redis 的 list 底層是鏈表,但同時也可用于隊列,使用 lpush 、brpop 命令操作隊列。

計數器:控制一個手機號一天限制發送 5 條短信,或用于庫存扣減,保證不超發。

布隆過濾器:快速準確判斷 10 萬個號碼是否在 10 億個號碼庫里或者請求 IP 地址是否在 10 億 的黑名單庫。

GeoHash:實現美團外賣或餓了么「附近的商家」功能,或者計算兩個人之間的距離。

BitMap:使用位圖可實現用戶類似近 7 天簽到功能或某時間范圍內用戶的登錄狀態。

延遲操作:使用 SortSet 實現延遲隊列,例如訂單在 30 分鐘內未支付則自動取消并發送短信。

好友關系及點贊:set 集合可用于記錄文章的點贊、閱讀數;用 zinterstore 查詢共同好友、zset 實現好友關系。

分布式限流:基于令牌桶算法,利用 Lua 腳本實現分布式限流,Spring Cloud Gateway中的限流就是典型例子。

redis 線程模型

在 redis 6 版本前均采用的是單線程模型,基于 Reactor 模式開發了網絡事件處理器,redis 在處理客戶端的請求時,包括請求命令的獲取、解析、執行、內容返回等都由一個順序串行的主線程處理,這就是所謂的“單線程”。

但在 redis 6 版本后便正式引入多線程模型,隨著越來越復雜的業務場景,需要更高的 QPS,常用的解決方案是對數據分區并采用更多的服務器,但該方案缺點是 投入的成本高,維護的 redis 服務器多。

在redis 執行期間,網絡的讀寫及系統調用占用了大部分 CPU 時間,而瓶頸主要在于網絡的 IO 消耗,因此優化的主要有以下原因:

  • 充分利用服務器 CPU 資源,而目前 redis 主線程只能利用一個核。
  • 多線程任務可以分攤 redis 同步 IO 讀寫負荷,例如:memcached。

redis 為何選擇單線程網絡模型?

  • 使用單線程模型能帶來更好的可維護性,方便開發與調試。
  • 使用單線程模型也能并發的處理客戶端的請求。
  • 避免頻繁的 CPU 上下文切換開銷及多線程帶來的安全同步。
  • redis 服務中運行的絕大多數操作的性能瓶頸都不是 CPU。

從官方中給出的解析可以看到官方認為 redis 的大多數命令操作性能瓶頸并不在 CPU,主要受限于內存和網絡。

  • It’s not very frequent that CPU becomes your bottleneck with Redis, as usually Redis is either memory or network bound. For instance, using pipelining Redis running on an average Linux system can deliver even 1 million requests per second, so if your application mainly uses O(N) or O(log(N)) commands, it is hardly going to use too much CPU.

因此,第三點起到決定性的因素,另外兩點是使用單線程帶來的好處。

redis 為什么這么”快“?

1、完全基于內存,絕大部分請求是純粹的內存操作。

2、采用單線程,避免了不必要的上下文切換和競爭條件,但同時也無法利用多核的優勢。

3、使用多路 I/O 復用模型,實現高吞吐的 IO 操作。

4、數據結構簡單,大多數讀/寫操作為 O(n) 或 O(log(N))。

使用 redis 的隊列存在什么問題 ?

1、存在消息丟失的可能性。

2、生產速度與消費速度不匹配引起消息堆積,將會導致 redis 內存耗盡。

3、隊列中的消息不允許重復消費。

redis 如何實現分布式鎖 ?

實現思想大致如下:

1、使用 setnx、setex 命令把當前獲取鎖的請求信息(鎖的 key、線程 id等)保存到 redis,同時記錄同個線程獲取鎖的次數(實現可重入功能)。

2、釋放瑣時,為避免誤刪,需判斷當前操作的線程是否與加鎖的是同一個,若是同一個則 del 對應鎖的 key 即可。

涉及到多個命令執行,需把獲取鎖、釋放鎖的邏輯放在 lua 腳本中保證原子性,具體可參考 Redisson 分布式鎖的實現:

獲取鎖邏輯代碼:

  1. if (redis.call('exists', KEYS[1]) == 0) then  
  2.   redis.call('hset', KEYS[1], ARGV[2], 1);  
  3.   redis.call('pexpire', KEYS[1], ARGV[1]);  
  4.   return nil;  
  5. end
  6.  
  7. if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then 
  8.   redis.call('hincrby', KEYS[1], ARGV[2], 1); 
  9.   redis.call('pexpire', KEYS[1], ARGV[1]); 
  10.   return nil; 
  11. end
  12.  
  13. return redis.call('pttl', KEYS[1]); 

釋放鎖邏輯代碼:

  1. if (redis.call('hexists', KEYS[1], ARGV[3]) == 0) then 
  2.   return nil; 
  3. end
  4. local counter = redis.call('hincrby', KEYS[1], ARGV[3], -1);  
  5. if (counter > 0) then  
  6.   redis.call('pexpire', KEYS[1], ARGV[2]);  
  7.   return 0;  
  8. else 
  9.   redis.call('del', KEYS[1]);  
  10.   redis.call('publish', KEYS[2], ARGV[1]);  
  11.   return 1;  
  12. end
  13. return nil; 

如何解決業務端未執行完邏輯,但鎖已過期?

可參考 Redisson 框架處理鎖租期的方案,在每次獲取鎖時判斷 leaseTime 是否為 -1 ,若是則在獲取鎖成功后新建一個線程專門檢測對應鎖的 key 是否過期,過期的話則調用 lua 腳本更新 key 的過期時間。

  1. private RFuture<Boolean> tryAcquireOnceAsync(long leaseTime, TimeUnit unit, long threadId) { 
  2.   if (leaseTime != -1) { 
  3.     return tryLockInnerAsync(leaseTime, unit, threadId, RedisCommands.EVAL_NULL_BOOLEAN); 
  4.   } 
  5.   RFuture<Boolean> ttlRemainingFuture = tryLockInnerAsync(commandExecutor.getConnectionManager().getCfg().getLockWatchdogTimeout(), TimeUnit.MILLISECONDS, threadId, RedisCommands.EVAL_NULL_BOOLEAN); 
  6.   ttlRemainingFuture.onComplete((ttlRemaining, e) -> { 
  7.     if (e != null) { 
  8.       return
  9.     } 
  10.  
  11.     // lock acquired 
  12.     if (ttlRemaining) { 
  13.       scheduleExpirationRenewal(threadId); 
  14.     } 
  15.   }); 
  16.   return ttlRemainingFuture; 

scheduleExpirationRenewal() 方法具體調用邏輯如下:

  1. private void renewExpiration() { 
  2.   ExpirationEntry ee = EXPIRATION_RENEWAL_MAP.get(getEntryName()); 
  3.   if (ee == null) { 
  4.     return
  5.   } 
  6.  
  7.   Timeout task = commandExecutor.getConnectionManager().newTimeout(new TimerTask() { 
  8.     @Override 
  9.     public void run(Timeout timeout) throws Exception { 
  10.       ExpirationEntry ent = EXPIRATION_RENEWAL_MAP.get(getEntryName()); 
  11.       if (ent == null) { 
  12.         return
  13.       } 
  14.       Long threadId = ent.getFirstThreadId(); 
  15.       if (threadId == null) { 
  16.         return
  17.       } 
  18.  
  19.       RFuture<Boolean> future = renewExpirationAsync(threadId); 
  20.       future.onComplete((res, e) -> { 
  21.         if (e != null) { 
  22.           log.error("Can't update lock " + getName() + " expiration", e); 
  23.           return
  24.         } 
  25.  
  26.         // reschedule itself 
  27.         renewExpiration(); 
  28.       }); 
  29.     } 
  30.   }, internalLockLeaseTime / 3, TimeUnit.MILLISECONDS); 
  31.  
  32.   ee.setTimeout(task); 

通過代碼發現每次鎖續期完成后又會重新創建新線程刷新租期。

redis lua 實現分布式鎖存在的問題

1、對設置有租約時間的客戶端,當長時間阻塞將導致鎖失效。

2、當 redis master 發生故障時,某 slave 升級為新 master,但鎖信息未同步到新的 master ,導致其他請求能獲取鎖。

什么是 RedLock

對于 redis 主從漂移時,將導致鎖失效的問題,redis 作者提出 RedLock 的算法:假設 redis 的部署模式是 redis cluster,總共有 3個 master 節點,加鎖的時候,它會向多半節點發送 setex mykey myvalue 命令,只要過半節點成功,才算加鎖成功。同樣當釋放鎖的時候需要向所有節點發送 del 命令,感興趣的可以閱讀 Redisson 源碼實現。

使用 RedLock 雖解決了 master 故障帶來的同步問題,但它需要更多的 redis 實例資源,同時性能也會有一定的折損。

講講緩存穿透、擊穿、雪崩

緩存穿透:指緩存和數據庫中都沒有的數據,而用戶或攻擊者不斷發起請求,如發起為 userId 為負數或不存在的數據,將導致數據庫壓力過大,解決方案:

1、對參數值做有效性校驗、用戶鑒權等。

2、對緩存與數據庫中都不存在的數據,可映射其 userId -> null 到緩存中,并根據業務場景設置過期時間,防止攻擊者的暴力攻擊。

緩存擊穿:指緩存中沒有數據,但數據庫中有數據,一般是未做熱加載或緩存過期導致,在某一刻由于并發查詢同一條數據的請求特別多,讀緩存無數據,因此同時去數據庫查詢數據,引起數據庫壓力瞬間增大,解決方案:

1、設置熱點數據緩存過期時間更長或永久。

2、當查詢緩存無數據時,使用互斥鎖控制只允許一個線程 A 查詢數據庫,其余請求線程等待線程 A 加載數據到緩存,如Guava Cache在查詢緩存無數據時,只允許一個線程加載。

緩存雪崩:指緩存中大批量數據到過期時間,同時查詢數據量巨大,引起數據庫壓力過大甚至宕機。與緩存擊穿不同的是,緩存擊穿是圍繞并發查詢同一條數據,而緩存雪崩是不同數據都過期了,很多數據都查不到從而查數據庫,解決方案:

1、設置緩存數據的過期時間隨機,防止同一時間內大量數據發生過期。

2、設置熱點數據過期時間更長或永久。

談談緩存和數據庫一致性問題

常見的緩存與數據庫操作順序有幾種方式:

先寫緩存,再更新 DB:

  • 如果第一步更新緩存失敗,直接返回,無影響。
  • 如果緩存寫成功,更新 DB 失敗,此時若不清除緩存中已寫入的數據,則會造成數據不一致(緩存中是新值,DB 中是舊值)。如果增加清除緩存的邏輯,那么清除操作又失敗了該如何處理?

先更新 DB,再寫緩存:

  • 如果更新 DB 失敗,直接返回,無影響。
  • 如果更新 DB 成功,緩存寫入失敗則會造成數據不一致(即 DB 中是新值,緩存中是舊值),如果重試寫入緩存,那重試也失敗該如何處理?

先刪除緩存,再更新 DB:

  • 如果刪除緩存失敗,直接返回,無影響。
  • 如果刪除緩存成功,更新 DB 失敗,則會造成后續請求未命中緩存,則從數據庫中回查數據。

先更新 DB,再刪除緩存:

  • 如果更新 DB 失敗,直接返回,無影響。
  • 如果更新 DB 成功,刪除緩存失敗則會造成數據不一致(DB 中是新值,緩存中是舊值)。

該問題本質上就是一個分布式數據一致性問題,在不要求強一致性的場景下,保證最終一致性即可,在更新完數據庫后,通過 Canal 訂閱 MySQL 的 binlog 日志使緩存失效,若操作緩存失敗,把緩存信息放至 MQ 重試。

對數據要求強一致性或無法接收臟數據,最簡單的方式是不使用緩存,直接走數據庫。

redis 持久化方式哪些?

RDB,全稱 Redis Database,在指定的時間間隔內將內存中的數據集以快照的方式寫入磁盤,實際操作過程是 fork 一個子進程,先將數據集寫入臨時文件,寫入成功后,再替換之前的文件,用二進制壓縮存儲,在恢復數據時將快照文件直接讀到內存里。

優點:

  • RDB 快照是壓縮后的二進制文件,文件的大小會很小,比較適合使用全量復制與備份的場景。
  • 相比于 AOF 機制,如果數據集很大,RDB 的恢復效率會更高。

缺點:

  • 如果想保證數據的高可用性,即最大限度的避免數據丟失,那么 RDB 不是一個很好的選擇,因為系統一旦在定時持久化之前出現宕機現象,沒有來得及寫入磁盤的數據都將丟失。
  • 由于每次生成 RDB 快照都需要 fork 子進程生成全量數據的快照,占用 CPU 與磁盤資源,不適合于頻繁執行。
  • 兼容問題,不同版本的 redis 生成的快照可能不兼容。

AOF,全稱為 Append Only File,將操作命令與數據以格式化的方式追加到操作日志文件的尾部,在 append 操作返回后(已經寫入到文件或者即將寫入),才進行實際的數據變更,日志文件保存了歷史所有的操作過程,當 redis server 需要恢復數據時,可直接重放該日志文件,即可還原所有的操作過程。

在 redis 中提供每秒同步、每次修改同步、不同步3 種同步策略。實際每秒同步是異步完成的,其效率高,一旦系統出現宕機,則這一秒內修改的數據將會丟失。

每次修改同步,即每次發生的數據變化都會被立即記錄到磁盤中,可想而至,這種同步方式效率是最低的。

優點:

  • AOP 機制提供更高的數據安全性,即數據持久性。
  • AOF 持久化方式包含一個格式清晰、易于理解的日志內容,用于記錄所有的修改操作。
  • 對于寫入了一半數據后出現了系統崩潰的現象,redis 能通過 redis-check-aof 工具幫助解決數據一致性的問題。
  • 當日志文件過大時,redis 會啟動 rewrite 機制,可以刪除其中的某些命令。

缺點:

  • 對相同數量的數據而言,AOF 文件通常要大于 RDB 文件,AOF 的恢復數據的速度要比 RDB 效率低。
  • 根據同步策略的不同,AOF 在運行效率上通常會慢于 RDB,但每秒同步策略的效率是比較高的,禁用同步策略的效率和 RDB 效率類似。

對于選擇哪種持久化方式,可根據系統能否接受部分性能的犧牲,通過 AOF 方式換取更高的數據一致性,或者禁用 RDB 備份換取更高的性能,待請求量或流量少的時間點再定時執行 save 命令做快照備份,但目前生產環境接觸的更多都是二者結合使用的。

redis 部署方式有哪些

單機模式,即只有一個 redis 實例,所有的服務都連接到該實例上,該模式不適用于生產環境,若 redis 實例發生宕機或內存不足等,將導致所有服務都受影響。

哨兵模式,redis 官方推薦的高可用性方案,在 master 宕機后,redis 本身不具備自動主備切換的功能,而 redis-sentinel 是一個獨立運行的進程,它能監控多個 master-slave 集群,發現 master 宕機后能自動選舉新的 master。

集群模式,隨著業務和數據量劇增,已達到單節點性能瓶頸,垂直擴容受機器限制,水平擴容涉及對業務的影響,及數據遷移時存在數據丟失的風險。

因此在 redis 3.0 推出 cluster 分布式集群方案,當遇到單節點內存、并發、流量瓶頸時,可采用cluster 方案實現負載均衡,該方案主要解決分片問題,把整個數據按照規則分成多個子集存儲在多個不同 redis 節點上,每個節點各自負責整個數據的一部分。

redis 為何使用哈希槽而沒用一致性 hash

redis 集群沒有直接使用一致性哈希,而是使用哈希槽,不同點就是對于哈希空間的定義,一致性哈希的空間是一個圓環,節點分布是基于圓環的,無法很好的控制數據分布,可能會產生數據傾斜問題。

而 redis 的槽位空間是自定義分配的,可以自定義大小,自定義位置的。redis 集群包含了 16384 個哈希槽,每個 Key 經過 CRC16 算法計算后會落在一個具體的槽位上,而槽位具體在哪個機器上是用戶自己根據自己機器的情況配置的,機器硬盤小的可以分配少一點槽位,硬盤大的可以分配多一點。

另外在容錯性和擴展性上與一致性哈希一樣,都是轉移受影響的數據。而哈希槽本質上是對槽位的轉移,把故障節點負責的槽位轉移到其他正常的節點上,擴展節點也是一樣,把其他節點上的槽位轉移到新的節點上。

談談數據遷移時,客戶端訪問數據的流程

當數據遷移過程中,新舊節點對應的槽都存在部分數據,客戶端首先嘗試訪問舊的節點,如果對應的數據在舊節點里,舊節點正常處理。

如果不在舊節點,則可能在新節點或者不存在。當客戶端訪問舊節點不存在時,會向客戶端返回 ASK 或者 MOVED 重定向指令,其中 MOVED 是永久轉向信號,ASK 則表示只需要這一次操作做轉向。

需要注意的是,客戶端查詢新節點時,需要先發一條 ASKING 命令,否則這個請求命令會被帶有 IMPORTING 狀態的槽新節點拒絕執行。

對于客戶端,收到 MOVED 時,需要更新 slot 映射信息,當收到 ASK 時,則需要向新節點發 ASKING 命令并重新執行操作命令。

redis 過期數據清除機制

被動刪除:當操作讀/寫一個已過期的 key 時,會觸發惰性刪除策略,直接刪除過期 key 并且返回NIL。

主動刪除:由于惰性刪除策略無法保證冷數據被及時刪掉,因此 redis 會定期主動淘汰清除已過期的 key。

redis 內存淘汰策略

當前已用內存超過 redis 配置的 maxmemory 限定時,會觸發主動清理策略,策略如下:

  • noeviction :不進行數據淘汰,當緩存被寫滿后,Redis不提供服務直接返回錯誤。
  • volatile-random :在設置過期時間的鍵值對中隨機刪除。
  • volatile-ttl :在設置過期時間的鍵值對,基于過期時間的先后進行刪除,越早過期的越先被刪除。
  • volatile-lru:基于LRU(Least Recently Used) 算法篩選設置了過期時間的鍵值對, 最近最少使用的原則篩選數據。
  • volatile-lfu:使用 LFU( Least Frequently Used ) 算法選擇設置了過期時間的鍵值對, 使用頻率最少的原則篩選數據
  • allkeys-random:從所有鍵值對中隨機選擇并刪除數據。
  • allkeys-lru:使用 LRU 算法在所有數據中進行篩選。
  • allkeys-lfu:使用 LFU 算法在所有數據中進行篩選。

線上 redis 實例內存不足,該如何處理

這是在面試騰訊音樂時被問到的問題,考察個人應急問題處理能力,首先第一要素是解決問題,即線上擴容,不能影響用戶功能使用,但線上擴容只是解燃眉之急,后面數據增加后不可能繼續擴容,畢竟成本擺在那里,因此可使用 redis cluster 方案把數據均衡的分布存儲在不同的 redis 實例中,解決 redis 單實例存儲過高的問題,但使用 redis cluster 方案也會引入一定的問題,例如某些命令不能在 cluster 下執行,增加數據遷移復雜度等。 

 

責任編輯:武曉燕 來源: 碼農私房話
相關推薦

2021-11-02 11:35:17

通信進程面試

2010-08-11 12:07:08

騰訊筆試題騰訊筆試題

2024-05-23 16:41:40

2024-04-18 08:00:00

腦裂問題Redis哨兵模式

2024-12-19 17:09:55

Redis哨兵模式數據庫

2013-12-03 09:32:19

2020-07-17 20:35:41

Redis數據庫緩存

2024-06-03 06:45:18

2021-10-27 11:00:30

C++語言面試

2009-02-26 10:33:08

面試求職計算機專業

2018-11-19 10:40:17

騰訊馬化騰互聯網

2021-10-18 08:41:20

Redis ACID事務

2024-04-30 10:40:11

2018-01-11 16:43:32

面試騰訊職位

2023-08-17 14:42:54

Redis分布式鎖

2019-02-18 13:36:03

Redis數據庫面試

2013-06-18 10:12:39

程序員未來

2009-02-20 16:21:18

UbuntuLinux中國化

2020-11-12 10:20:40

前端面試web

2025-05-15 08:25:00

點贊
收藏

51CTO技術棧公眾號

日本wwww视频| 欧美一级免费视频| aaa毛片在线观看| a天堂在线视频| 青青草成人影院| 午夜欧美视频在线观看| 91人人爽人人爽人人精88v| 日本黄色片在线播放| а√资源新版在线天堂| 天堂成人免费av电影一区| 精品女同一区二区| 日韩 欧美 自拍| 中文字幕欧美人妻精品一区蜜臀 | 99精彩视频| 日本精品在线免费观看| 久久av日韩| 久久久久免费观看| 97视频人免费观看| 白嫩情侣偷拍呻吟刺激| 天堂av资源在线观看| 九色综合狠狠综合久久| 中文字幕成人在线| 国产性生交xxxxx免费| 日本美女一级片| 国户精品久久久久久久久久久不卡| 欧美三级在线看| 日韩国产在线一区| 日本高清不卡码| 日韩av中文字幕一区| 亚洲一区二区三区中文字幕| 91手机在线观看| 国产一二三四区| 国产乱码精品一区二区三区亚洲人 | 中文 欧美 日韩| 精品国产乱码久久久久久果冻传媒 | 九九热国产在线| 欧美日韩中出| 一区二区在线观看免费| 超碰97在线资源| 久草网视频在线观看| 国产成人一二片| 亚洲aaa精品| 就去色蜜桃综合| 蜜臀尤物一区二区三区直播| 国内黄色精品| 欧美日韩一区二区不卡| 中文字幕中文字幕99| 国产情侣av在线| 在线观看的日韩av| 亚洲品质视频自拍网| 天天影视综合色| 97超碰国产一区二区三区| 蜜乳av一区二区| 插插插亚洲综合网| 亚洲天堂2024| 外国成人直播| 亚洲色大成网站www久久九九| 亚洲一区亚洲二区亚洲三区| 国产一级大片在线观看| 天天久久夜夜| 91精品国产色综合久久ai换脸| 日本一区二区三区四区五区六区| 成人午夜视频一区二区播放| 亚洲伊人观看| 日韩视频中文字幕| 星空大象在线观看免费播放| 玛雅亚洲电影| 亚洲欧美激情插| 久久国产精品精品国产色婷婷 | 欧美在线你懂得| 福利在线小视频| 欧洲一级在线观看| 狠狠色狠狠色合久久伊人| 欧美极品欧美精品欧美视频| 亚洲精品午夜视频| 日韩中文字幕在线一区| 色哟哟精品一区| 欧美 国产 精品| 国产福利电影在线| 大胆亚洲人体视频| 国产精品露脸av在线| 久草视频免费在线播放| 国产亚洲精品美女久久久久久久久久| 91精品在线观看入口| 六月激情综合网| 污视频网站在线免费| 中文字幕国产一区| 精品视频导航| 成 人 免费 黄 色| 日韩专区视频| 天堂av最新在线| 99久久综合国产精品| 国产精品久久久久久亚洲影视 | 2019精品视频| 动漫性做爰视频| 国产成人ay| 亚洲第一级黄色片| 色呦色呦色精品| 亚洲国产福利| 午夜精品123| 国产高清免费在线| av在线三区| 26uuu精品一区二区在线观看| 91成人伦理在线电影| 亚洲综合五月天婷婷丁香| 免费中文字幕日韩欧美| 色综合久久精品亚洲国产| 奇米网一区二区| 精品黄色一级片| 国产丝袜一区二区三区免费视频| 韩国三级hd中文字幕有哪些| 欧洲亚洲精品久久久久| 欧美在线播放高清精品| 中国丰满人妻videoshd| 91九色在线播放| 亚洲一区二区av电影| 最新av在线免费观看| 五月香视频在线观看| 欧美经典一区二区三区| 欧洲亚洲一区二区| 男人av在线| 久久久久久久久久久电影| 蜜桃麻豆91| 蜜桃视频在线观看网站| 久久久久久夜精品精品免费| 久久日韩精品| 国产系列在线观看| 久久精品夜色噜噜亚洲a∨| 久久精精品视频| 四虎影院在线播放| 久久人人爽人人爽| 日韩av电影免费观看| 国产主播福利在线| 亚洲国产激情av| 亚洲午夜精品一区二区| 欧美精品电影| 亚洲品质自拍视频| 欧美日韩激情四射| 国产99在线| 日韩欧美在线视频| 国产精品涩涩涩视频网站| 欧美不卡高清一区二区三区| 欧美视频在线观看一区二区| 中文字幕成人免费视频| 91国内精品| 亚洲国产高清自拍| 白白色免费视频| 欧美高清在线| 欧美日韩国产成人| 超碰超碰超碰超碰| 蜜桃久久久久久久| 7777奇米亚洲综合久久| 污视频在线免费| 欧美国产国产综合| 超碰97在线看| 是的av在线| 欧美日韩一本到| 91丨porny丨九色| 日韩欧美黄色| 最近2019中文字幕mv免费看| 欧美激情精品久久| 久久综合九色| 91精品国产一区二区三区动漫 | 日韩黄色一级大片| 美女诱惑一区二区| 国产精品推荐精品| av中文天堂在线| 亚洲一区二区三区国产| 久久久久狠狠高潮亚洲精品| 伊人亚洲精品| 国产婷婷97碰碰久久人人蜜臀| 免费观看特级毛片| 亚洲黄色成人| 国产精品影院在线观看| 欧美一级视频免费| 国产精品久久看| 三上悠亚久久精品| 国产精一区二区| 国产亚洲免费的视频看| 久草视频中文在线| 美国av一区二区| 好吊色欧美一区二区三区四区| fc2在线中文字幕| 五月激情综合网| 妖精视频在线观看| 青青草成人影院| 欧美一区二三区| 性生活免费网站| 国产精品久久久爽爽爽麻豆色哟哟 | 国产亚洲精品成人a| 国产精品videosex性欧美| 欧美一级淫片播放口| 亚洲AV午夜精品| 综合分类小说区另类春色亚洲小说欧美 | 久久久久亚洲| 国产精品偷伦免费视频观看的| 四虎精品在永久在线观看| 一区二区三区在线免费观看| jizzzz日本| 欧美码中文字幕在线| 91地址最新发布| 亚洲精品无amm毛片| 自拍偷拍亚洲综合| 国产高清视频网站| 国产一区二区三区四区五区传媒| 久久久视频免费观看| 亚洲国产精彩视频| 亚洲欧美国产三级| 亚洲天堂av一区二区| 欧美色爱综合| 国产精品旅馆在线| 福利在线观看| 欧美吻胸吃奶大尺度电影| 色欲av无码一区二区三区| 在线欧美亚洲| 国产精品一区视频| 国产不卡人人| 日韩av在线免费观看一区| 日本熟妇成熟毛茸茸| 成人a免费在线看| 你真棒插曲来救救我在线观看| 538任你躁精品视频网免费| 欧美大片在线免费观看| 亚洲美女性生活| 五月天国产精品| 成年人网站免费看| 久久午夜视频| 视频一区视频二区视频三区高| 蜜桃视频成人m3u8| 中文字幕欧美日韩精品| 中日韩av在线| 亚洲欧美国产三级| 国产综合内射日韩久| 亚洲激情av| 日本高清久久一区二区三区| 成人黄色视屏网站| 日韩中文字幕精品视频| 国产精品色综合| 亚洲一区视频在线观看视频| 国产成人精品无码片区在线| 毛片一区二区| 在线观看欧美亚洲| 一区二区三区在线免费看| 久久久久国产精品免费| 日本亚洲一区| 欧美日韩色综合| 波多野结衣亚洲一区二区| 丁香婷婷综合色啪| 国产精品宾馆在线精品酒店| 国内成人精品| 5g国产欧美日韩视频| 午夜影院在线观看国产主播| 一个人看的www久久| 国产乱人乱偷精品视频a人人澡| 亚洲最大成人综合| 免费中文字幕av| 开心九九激情九九欧美日韩精美视频电影 | www.久久综合| 欧美日韩国产一区二区三区| 欧美自拍偷拍网| 成人精品电影在线观看| 麻豆一区二区三区视频| 黑丝一区二区三区| 翔田千里亚洲一二三区| 亚洲午夜免费| 国产成人午夜视频网址| 黄网在线免费看| 中文字幕免费精品一区高清| 囯产精品久久久久久| 欧美日韩在线播放三区四区| 久久久久久久99| 国产精品午夜在线观看| 欧美xxxxx精品| 韩国一区二区在线观看| 毛片av免费在线观看| 欧美欧美全黄| 亚洲精品视频一二三| 色综合久久中文| 成人国产一区二区| 久久精品国产福利| 91sao在线观看国产| 在线观看中文| 伊人久久久久久久久久| 日本国产在线观看| 欧美日韩国产综合一区二区三区 | 欧美成人高清| 亚洲国产精品综合| 日本午夜精品| 国产精品theporn88| 伦一区二区三区中文字幕v亚洲| 国产91精品视频在线观看| 污污片在线免费视频| 日韩中文字幕国产| 成人欧美亚洲| 亚洲视频专区在线| 视频在线不卡| 亚洲黄色在线看| 亚洲精品视频91| 日韩你懂的在线观看| 国产伦精品一区二区三区视频痴汉 | 日韩麻豆第一页| 丰满熟妇乱又伦| 欧美成人aa大片| www.黄色片| 欧美一级高清大全免费观看| 91肉色超薄丝袜脚交一区二区| 色狠狠综合天天综合综合| 五月天激情国产综合婷婷婷| 亚洲6080在线| 日韩成人一区二区三区| 五月天网站亚洲| 成年免费在线观看| 欧美日韩亚洲国产一区| 国产精品国产三级国产专区52| 午夜精品一区二区三区三上悠亚 | 午夜欧美视频在线观看| 久久国产精品波多野结衣| 亚洲女子a中天字幕| 欧美人禽zoz0强交| 亚洲专区一二三| 精品一区二区三区人妻| 亚洲第一搞黄网站| 在线观看国产亚洲| 色呦呦国产精品| 国产情侣免费视频| 欧美精品在线视频| 国产人妻精品一区二区三| 日韩一区二区三区av| 亚洲av无码国产精品久久不卡| 精品av久久707| 亚洲色图欧美视频| 国产亚洲视频在线观看| 视频免费一区| 色综合天天狠天天透天天伊人 | 亚洲综合色网站| 亚洲精品男人天堂| 欧美亚洲国产bt| 国产情侣一区二区| 亚洲电影在线看| 蝌蚪视频在线播放| 日韩在线欧美在线| 欧美人与禽性xxxxx杂性| 91av福利视频| 999国产精品亚洲77777| 91久久精品久久国产性色也91| 亚洲超碰在线观看| 欧美日本韩国一区二区三区| 日韩成人a**站| 青青在线视频免费观看| 亚洲欧美日韩专区| 九九热99视频| 成人激情午夜影院| 成年人看的免费视频| 亚洲一区免费观看| 国产精品露脸视频| 亚洲成人黄色网址| 在线观看完整版免费| 久久久久久久影院| 日韩亚洲国产免费| 国产在线一区二区三区欧美 | 国产成人免费在线观看不卡| 少妇毛片一区二区三区| 亚洲欧洲日韩av| 国产精品久久久久久99| 在线电影院国产精品| 视频一区二区在线播放| 不用播放器成人网| 成人天堂yy6080亚洲高清| 成人永久免费| 色婷婷一区二区三区| 国产h视频在线播放| 久久成人综合网| 亚洲第一黄色网址| 亚洲精品日日夜夜| 亚洲第一区av| 日韩电影中文 亚洲精品乱码| 哥也色在线视频| 国产成人精品午夜| 精品国产导航| 手机在线视频你懂的| 人禽交欧美网站| 香蕉视频黄色在线观看| 亚洲成人激情av| 国产麻豆91视频| 尤物精品国产第一福利三区| 国产网站在线| 成人在线看片| 欧美 亚欧 日韩视频在线 | 久久精品性爱视频| 91精品国产aⅴ一区二区| 69久久夜色| 国产精品狠色婷| 一本色道久久综合狠狠躁的番外| 黄色一级片国产| 国产精品一级在线| 久久中文免费视频| 欧美精品一二三| 日本不卡不卡| 国产欧美 在线欧美| 成人精品视频|