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

岛国精品视频在线播放| 99精品桃花视频在线观看| 日韩一区在线视频| 日本50路肥熟bbw| 亚洲小少妇裸体bbw| 国产精品亲子伦对白| 成人国产1314www色视频| 成人毛片18女人毛片| 999国产精品视频| 亚洲成人网久久久| 亚洲免费看av| 超碰激情在线| 18欧美乱大交hd1984| 国产视频在线观看一区| 国产又粗又猛又爽又黄91| 亚洲国内自拍| 久久久精品影院| 好吊一区二区三区视频| 精品精品视频| 色噜噜狠狠成人中文综合| 国产精品8888| 97视频在线观看网站| 99精品1区2区| 97中文在线观看| 中文字幕一区二区人妻| 亚洲久久成人| 色综合视频网站| 一本在线免费视频| 在线日韩一区| 亚洲精品国产拍免费91在线| 免费不卡av网站| 国外成人福利视频| 色综合久久久久网| 国产精品网站免费| 啦啦啦中文在线观看日本| 国产精品不卡在线观看| 日韩jizzz| 日韩av资源站| 久久综合色8888| 精品国产综合| 色呦呦中文字幕| 国产91综合网| 粉嫩av免费一区二区三区| 国产精品视频一区二区三区,| 日韩电影在线观看电影| 奇米一区二区三区四区久久| 日本一本高清视频| 亚洲第一区色| 97av在线播放| 久久露脸国语精品国产91| 欧美视频导航| 久久久久女教师免费一区| 欧美一区二区三区爽爽爽| 天天插综合网| 久久在线视频在线| 日本激情视频一区二区三区| 欧美国产一区二区三区激情无套| 中文字幕精品一区久久久久| 欧美波霸videosex极品| 欧美理论在线播放| 最新91在线视频| 懂色av蜜臀av粉嫩av永久| 日韩a一区二区| 色妞欧美日韩在线| 精品国产国产综合精品| 伊人成综合网| 97国产精品人人爽人人做| 圆产精品久久久久久久久久久| 亚洲区欧美区| 国产精品极品美女在线观看免费 | 国精产品一区一区三区免费视频 | 国产一区二区在线观看免费| 97人人模人人爽视频一区二区| 成人免费一级视频| av中文字幕不卡| 欧美精品一区二区三区在线看午夜 | av中文在线资源库| 色综合久久中文字幕综合网| 亚洲另类第一页| 亚洲91网站| 日韩精品中文字幕久久臀| 亚洲国产日韩一区无码精品久久久| 欧美日韩在线二区| 久久精品国产成人精品| 亚洲精品在线观看av| 久久精品日产第一区二区| 国产精品视频色| 亚洲免费成人在线| 久久久久国产精品人| aaa免费在线观看| 黄在线观看免费网站ktv| 91久久精品国产91性色tv| 不卡中文字幕在线观看| 久久男人av| 在线播放精品一区二区三区| 毛片aaaaa| 日韩激情一区二区| 国产日本一区二区三区| 福利视频在线看| 亚洲午夜久久久久久久久电影院| 毛葺葺老太做受视频| 91精品国产自产在线丝袜啪 | 国产一区自拍视频| av在线免费观看网| 亚洲一区二区三区四区在线| wwwwww.色| 久久精品亚洲成在人线av网址| 日韩中文字幕在线免费观看| 国产做受高潮漫动| 国产中文字幕一区| 欧美一区激情视频在线观看| 青青草原av在线| 欧美三级中文字幕| 在线免费观看成年人视频| 亚洲网色网站| 国产精品丝袜高跟| 五月天婷婷社区| 亚洲免费在线播放| 亚洲污视频在线观看| 丝袜av一区| 欧美劲爆第一页| 国产乱码精品一区二区三区精东| 久久先锋影音av| 国产中文字幕二区| 亚洲精品黑牛一区二区三区| 日韩中文理论片| 波多野结衣一区二区三区在线| av中文一区二区三区| 4444亚洲人成无码网在线观看| 国产亚洲人成a在线v网站| 亚洲欧美一区二区精品久久久| 天天操天天射天天爽| 国产精品亚洲午夜一区二区三区 | 久久国产精品亚洲77777| 国产精品18毛片一区二区| 黄色网在线免费看| 欧美日韩国产综合一区二区| 亚洲一区二区三区日韩| 亚洲一区欧美激情| 九色综合日本| 欧美亚洲日本精品| 亚洲精品mp4| 日韩精品成人在线| 成人免费毛片aaaaa**| 中文字幕日韩精品无码内射| 精品成人18| 欧美理论片在线观看| 国产suv一区二区| 亚洲精品高清在线| 国产裸体视频网站| 亚洲综合婷婷| av在线不卡一区| 青春草视频在线| 亚洲成年人在线播放| 九九免费精品视频| 国产91高潮流白浆在线麻豆| 成人av在线不卡| 黑人久久a级毛片免费观看| 欧美成人精品在线观看| 精品国产av 无码一区二区三区| 亚洲人成影院在线观看| 中文字幕乱妇无码av在线| 国产精品激情电影| 久久久av水蜜桃| 一呦二呦三呦精品国产| 尤物九九久久国产精品的特点| 亚洲系列第一页| 亚洲女同ⅹxx女同tv| 白丝校花扒腿让我c| 一本色道久久综合亚洲精品高清| 精品综合久久| 国产成人福利夜色影视| 欧美成人精品在线播放| 亚州av在线播放| 欧美三级一区二区| 91嫩草丨国产丨精品| 国产不卡免费视频| 无码aⅴ精品一区二区三区浪潮| 国产欧美一区二区三区精品观看| 国产一区二区丝袜高跟鞋图片| а√天堂在线官网| 亚洲国产婷婷香蕉久久久久久| 波多野结衣视频网址| 亚洲色图丝袜美腿| 日韩 中文字幕| 另类小说欧美激情| 福利视频一区二区三区四区| 九九热线有精品视频99| 91亚洲精品视频| 蜜桃麻豆av在线| 精品国产一区二区三区久久狼黑人 | 久久精品久久综合| 亚洲精品无码国产| 欧美中文一区二区| 国产69精品久久久久9999apgf | 91成人在线免费视频| 国产精品一区二区三区四区| 国产成人在线免费看| 欧美国产美女| 欧美高清性xxxxhdvideosex| 欧美影院精品| 国产精品久久久久久亚洲影视| 后进极品白嫩翘臀在线播放| 色噜噜亚洲精品中文字幕| 天堂在线视频免费观看| 4438成人网| 成人a v视频| 亚洲国产精品一区二区久久恐怖片 | 国产xxxxx视频| 在线成人av| 五月天男人天堂| 蜜臀av免费一区二区三区| 丁香婷婷久久久综合精品国产| 黄色日韩网站| 国产v综合ⅴ日韩v欧美大片 | 国产精品久久久久久久久久久久 | 高清性色生活片在线观看| 精品国产91乱码一区二区三区| 亚洲一区 中文字幕| 色诱亚洲精品久久久久久| 精品在线免费观看视频| 亚洲图片欧美激情| www.日本高清视频| xnxx国产精品| 成年女人免费视频| 国产乱码精品一区二区三区忘忧草| 久久久久久三级| 亚洲男人影院| 久久综合九色综合88i| 欧美日韩成人| 国产成人亚洲综合无码| 国产精品久久观看| 中文字幕日韩精品久久| 欧洲乱码伦视频免费| 欧美日韩精品免费观看视一区二区| 国产乱论精品| 国产欧美日韩综合一区在线观看 | 一个色的综合| 成人在线免费小视频| 日本一区二区三不卡| 在线日本制服中文欧美| 欧美激情www| 欧美**字幕| 欧美精品欧美精品| 国产欧美一区二区精品久久久| 欧美一区二区视频在线| 欧美猛男同性videos| 日韩成人av网站| re久久精品视频| 三区精品视频| 99精品国产一区二区三区| 亚洲欧洲日夜超级视频| 日韩理论片av| 中文字幕中文字幕在线中一区高清 | 99在线视频精品| 青青草视频播放| 国产喷白浆一区二区三区| 极品人妻videosss人妻| 国产精品美女www爽爽爽| 人与动物性xxxx| 亚洲人成网站影音先锋播放| 日韩a级片在线观看| 一区二区三区日韩在线观看| 国产午夜激情视频| 日韩欧美在线免费观看| 中文字幕观看视频| 日韩一区二区三区在线观看| 熟妇高潮一区二区三区| 亚洲丝袜av一区| 色网站在线看| 欧美高清性猛交| 无码小电影在线观看网站免费| 国产成人中文字幕| 亚洲国产天堂| 国产精品一区二区三区观看| 午夜精品福利影院| 亚洲欧洲一区二区福利| 牛夜精品久久久久久久99黑人| 青青草精品视频在线| 日韩国产欧美三级| 久久人人爽人人片| 91美女蜜桃在线| 希岛爱理中文字幕| 色综合网站在线| 国产美女永久免费| 日韩成人在线观看| 在线观看a视频| 91国产一区在线| 青青青国产精品| 国产一级二级三级精品| 日本一区二区三区视频| 大陆av在线播放| 免费成人在线网站| 又黄又爽的网站| 亚洲欧洲国产专区| 岛国av中文字幕| 日韩免费在线观看| 国产精品久久久久久久龚玥菲| 久久99亚洲精品| 91欧美精品| 蜜桃臀一区二区三区| 综合色一区二区| 乌克兰美女av| 337p粉嫩大胆色噜噜噜噜亚洲| 永久免费未视频| 日本韩国一区二区| 国产成人手机在线| 久久精视频免费在线久久完整在线看| caoporn视频在线| 亚洲综合日韩中文字幕v在线| 国产精品一区二区99| www插插插无码视频网站| 麻豆91在线观看| 色欲av无码一区二区三区| 亚洲九九爱视频| 亚洲视频在线免费播放| 精品一区二区电影| 色女人在线视频| 国产一区二区色| 日韩成人精品一区二区| 欧美一级在线看| www.欧美精品一二区| 欧美黑吊大战白妞| 欧美日韩成人综合| 成人午夜影视| 国产精彩精品视频| 丝袜美腿综合| 自拍日韩亚洲一区在线| 国产盗摄视频一区二区三区| 国产精品69久久久久孕妇欧美| 日本精品一区二区三区四区的功能| 人妻无码中文字幕免费视频蜜桃| 欧美理论片在线观看| 久久久久九九精品影院| 波多野结衣激情| 精东粉嫩av免费一区二区三区| 自拍偷拍你懂的| 欧美日韩一区高清| 永久免费av在线| 成人日韩av在线| 久久久久电影| 一级片免费在线观看视频| 亚洲同性gay激情无套| 国产女18毛片多18精品| 美女福利精品视频| 亚洲精品一二三**| 精品人妻大屁股白浆无码| 国产99精品在线观看| 久久精品国产亚洲av香蕉| 精品毛片乱码1区2区3区| 欧美xxxx少妇| 久久精品magnetxturnbtih| 免费亚洲婷婷| 久久国产柳州莫菁门| 欧美日韩精品免费观看视频| 欧美黄色激情| 7777精品久久久大香线蕉小说 | 日韩一级片播放| 国产精品女同互慰在线看| 国产又大又长又粗| 欧美裸体xxxx极品少妇| 国产96在线亚洲| 久久婷婷国产精品| 亚洲欧洲日韩在线| 国产成人麻豆精品午夜在线| 色综合天天狠天天透天天伊人| 欧美巨大xxxx| 一路向西2在线观看| 亚洲免费观看高清完整| 亚洲欧美国产高清va在线播放| 午夜欧美大片免费观看| 奇米狠狠一区二区三区| 日本xxxx黄色| 亚洲愉拍自拍另类高清精品| 天天操天天射天天舔| 国产精品18久久久久久麻辣| 婷婷六月综合| 51调教丨国产调教视频| 欧美视频在线一区二区三区| 超碰超碰在线| 麻豆av一区二区| 另类小说欧美激情| 日本在线小视频| 日韩在线视频免费观看高清中文| 国模大尺度视频一区二区| 国产伦精品一区二区三区四区视频_| 国产欧美日韩综合精品一区二区| 国产理论片在线观看| 91国产精品电影| 外国成人激情视频| 亚洲精品乱码久久久久久不卡| 精品视频1区2区| 欧美巨大丰满猛性社交| 亚洲精品日韩成人| 成人动漫在线一区| 中文字幕 国产| 777精品视频| 欧美精品大片| 能直接看的av| 亚洲免费av电影|