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

Redis 的五種基本數據類型和使用場景

數據庫 Redis
由于是單線程,所以Redis的命令執行是串行而不是并行的,意味著同一時間內redis只會執行一個命令。

一、redis的特性:單線程

由于是單線程,所以redis的命令執行是串行而不是并行的,意味著同一時間內redis只會執行一個命令。

由于一次只能執行一條命令,所以要拒絕長命令(就是運行時間長的命令),因為會引起后面的命令阻塞。長命令如:keys,flushall,flushdb,mutil/exec等。

單線程為什么這么快:因為redis是純內純操作。

注意,這里的說redis單線程只是指redis執行讀寫命令的時候是單線程。

redis在接收和處理讀寫請求的時候雖然使用的是單線程,但redis采用了多路復用技術來處理網絡IO(即用戶的讀寫請求),通過其內置的eventloop事件循環機制監聽多個讀寫事件,從而使得讀寫請求在單線程下也能并發執行。

而后來為了能夠處理更高QPS的請求,redis6.0版本之后開始使用多線程接收和處理用戶的網絡IO請求,每個線程再使用多路復用技術,能夠極高的提升網絡IO的效率(對于redis而言,CPU和內存IO不是其瓶頸,網絡IO才是)。不過在執行讀寫操作依舊是單線程處理。

二、redis的五種數據結構

1.字符串類型

字符串的key是字符串,value可以是字符串,數字,二進制,json,但本質上value也還是字符串。

單個value大小不能超過512M,但實際應用中一般不會存超過100K的內容。

字符串類型的使用場景:

  • 緩存
  • 計數器
  • 分布式鎖
  • 等等

常用命令:

get/set/del
incr/decr/incrby/decrby

關于 set setnx setxx 的區別
set 不管key是否存在都設置
setnx key不存在才設置,相當于新增
set key value xx key存在才設置,相當于修改

實戰場景1:記錄每一個用戶的訪問次數,或者記錄每一個商品的瀏覽次數。

方案:

  • 鍵名: userid:pageview 或者 pageview:userid 如pageview:5
  • 使用命令:incr

使用理由:每一個用戶訪問次數或者商品瀏覽次數的修改是很頻繁的,如果使用mysql這種文件系統頻繁修改會造成mysql壓力,效率也低。而使用redis的好處有二:使用內存,很快;單線程,所以無競爭,數據不會被改亂

實戰場景2:緩存頻繁讀取,但是不常修改的信息,如用戶信息,視頻信息

方案:業務邏輯上:先從redis讀取,有就從redis讀取;沒有則從mysql讀取,并寫一份到redis中作為緩存,注意要設置過期時間。

鍵值設計上:一種是直接將用戶一條mysql記錄做序列化(serialize或json_encode)作為值,userInfo:userid 作為鍵名如:userInfo:1

另一種是以 表名:主鍵名:字段名:id值 作為鍵,字段值作為值。如 user:id:name:1 = "zbp"    

實戰場景3:分布式id生成器incr id

例如,mysql做了分布式,數據分攤到每一個mysql服務器,在插入數據時,每一個mysql服務器的id要自增但卻不能相同。此時可以使用redis的incr來完成。原因是,redis是單線程,意味并發請求生成id時,生成的id不會重復。(單線程無競爭)

實戰場景4:限定某個ip特定時間內的訪問次數使用 incr + setex

例如限定某ip在10秒內訪問api的次數不能超過1000次

<?php

$r=new Redis();
$r->connect($RedisHost,$RedisPort);
$redis_key = "arts_api|".$_SERVER["REMOTE_ADDR"];

if(!$r->exists($redis_key)){
  $r->setex($redis_key,10,"1");
}else{
  $r->incr($redis_key);
 
  //判斷是否超過規定次數
  if($r->get($redis_key)>1000){
    die("訪問過快");
  }
 
}

?>

實戰場景5:分布式session

我們知道,session是以文件的形式保存在服務器中的; 如果你的應用做了負載均衡,將網站的項目放在多個服務器上,當用戶在服務器A上進行登陸,session文件會寫在A服務器;當用戶跳轉頁面時,請求被分配到B服務器上的時候,就找不到這個session文件,用戶就要重新登陸

如果想要多個服務器共享一個session,可以將session存放在redis中,redis可以獨立與所有負載均衡服務器,也可以放在其中一臺負載均衡服務器上;但是所有應用所在的服務器連接的都是同一個redis服務器。

實現如下,以PHP為例:

設置php.ini 文件中的session.save_handle 和session.save_path

session.save_handler = Redis
session.save_path =  "tcp://47.94.203.119:6379"     # 大部分情況下,使用的都是遠程redis,因為redis要為多個應用服務

如果為redis已經添加了auth權限(requirpass),session.save_path項則應該這樣寫

session.save_path =  "tcp://47.94.203.119:6379?persistent=1&database=10&auth=myredisG506"

使用redis存儲session信息:

/**
 * 將session存儲在redis中
 */
session_start();
echo session_id();
echo "<br>";
$_SESSION['age'] = 26;
$_SESSION['name'] = 'xiaobudiu';
$_SESSION['sex'] = 'man';
var_dump($_SESSION);

此時session_id依舊存在cookie中。

redis中的key為 PHPREDIS_SESSION:session_id。

當用戶跳轉頁面的時候,php內部會先根據session_id()獲取cookie的session_id,再根據session_id獲取到redis中的key再根據key獲取value。

所以redis的session是通過cookie中的session_id得知 調用$_SESSION['name']是要獲取張三的用戶名而不是李四的用戶名。

如果關閉瀏覽器,cookie會失效,再打開瀏覽器的時候,session_id就不見了; 這個時候,雖然redis還保存這張三的session。

但是php已經無法獲取到這個session。

所以張三再登陸的時候,會重新生成一個session。此時張三的session會有兩個,一個是正在使用的,一個是已經失效的。失效的session不會一直放在redis中占用內存,php自動給這個redis的可以設置了過期時間。你也可以給session手動設置過期時間,通過ini_set('session.gc_maxlifetime',$lifetime)。(如果是文件的形式存儲的session,php會定時清理失效的session文件,失效的session就是在瀏覽器cookie中找不到session_id的session)

我們可以封裝一個session類,這個session類在原基礎上多了可以對session中的某個屬性設置過期時間

封裝session類:

class Session
{

  function __construct($lifetime = 3600)
{
    //初始化設置session會話存活時間,如果redis中的key存在超過3600秒,會自動執行session_destory(),具體表現為key被刪除
    ini_set('session.gc_maxlifetime',$lifetime);
  }

  /**
  * 設置當前會話session的key-value
  * @param String $name  session name
  * @param Mixed $data  session data
  * @param Int  $expire 有效時間(秒)
  */
  function set($name, $data, $expire = 600)  # session中的單獨的某個鍵也可以設置過期時間,很靈活
{
    $session_data = array();
    $session_data['data'] = $data;
    $session_data['expire'] = time()+$expire;
    $_SESSION[$name] = $session_data;
  }

  /**
  * 讀取當前會話session中的key-value
  * @param String $name session name
  * @return Mixed
  */
  function get($name)
{
    if(isset($_SESSION[$name])) {
      if($_SESSION[$name]['expire'] > time()) {
        return $_SESSION[$name]['data'];
      }else{
        self::clear($name);
      }
    }
    return false;
  }

  /**
  * 清除當前session會話中的某一key-value
  * @param String $name session name
  */
  function clear($name)
{
    unset($_SESSION[$name]);
  }

  /**
  * 刪除當前session_id對應的session文件(清空當前session會話存儲,在redis中的表現為刪掉一個session的key,在文件形式session中表現為刪除一個session文件)
  */
  function destroy()
{
    session_destroy();
  }

}

在一個會話生命周期中,一個redis的key存著這個會話的$_SESSION所有信息包括 $_SESSION['name'],["age"]等。

redis存session比文件存session的優勢在: 前者可以做分布式session,后者不行;前者是純內存操作,更快,后者是文件IO操作。

我們可以看一下一個key里面的內容:

get PHPREDIS_SESSION:6mmndoqm87st2s75ntlsvbp25q

得到:

"name|a:2:{s:4:\"data\";s:3:\"zbp\";s:6:\"expire\";i:1584351986;}age|a:2:{s:4:\"data\";i:18;s:6:\"expire\";i:1584351986;}job|a:2:{s:4:\"data\";s:10:\"programmer\";s:6:\"expire\";i:1584351986;}"

是一堆序列化的內容。所以這種方式相比于使用hash結構來存的效率更低。

因為這種方式取其中一個字段name就要將整個key獲取出來,而且序列化和反序列化也要消耗性能。

題外話:在網站分布多臺機器的時候,要做session分布式才可以跨機器獲取session; 如果我們不用session,改用純cookie代替session,將用戶信息都存到cookie中,這樣無論用戶訪問到哪臺機器都無所謂,反正都可以在瀏覽器中獲取用戶信息。

但是這真的是一種很好的解決分布式session的方式嗎?

本人有時候也會做做爬蟲,知道有些頁面必須登陸后才能訪問,如果將用戶信息存在cookie,爬蟲完全可以偽造一份用戶的cookie來訪問用戶的隱私頁面。所以使用cookie會帶來這樣的安全問題。

或者你的cookie是在瀏覽器可視的,而使用session,只有session_id在瀏覽器是可視的,用戶具體信息在服務端中你是看不到的。

mget/mset 批量操作:

n次get命令花費的時間 = n次網絡時間+n次命令時間

一次mget命令獲取n個key的時間 = 1次網絡時間+n次命令時間 尤其是客戶端(php/Python)和redis服務端不在同一主機上,網絡時間就會比較長。

所以盡量用mget,但是mget不要獲取太多key,否則要傳輸的數據過大對網絡開銷和性能都有負擔。 

2. 哈希類型

相關命令如下:

hget/hset/hdel/hgetall
hexists/hlen
hmget/hmset

實戰場景1:記錄每一個用戶的訪問次數

方案: 

鍵名: user:1:info  

字段名:pageview

使用命令:hincrby

和單純使用字符串類型進行記錄不同,這里可以將用戶訪問次數也放到用戶信息中作為一個整體,user:1:info中還存儲著name,email,age之類的信息

hgetall/hvals/hkeys

PS:慎用hgetall,因為hgetall會獲取一個hash key中的所有字段,這是一個長命令,而redis是單線程,會阻塞住后面的命令的執行。

字符串和哈希類型對比:這里我們以“將一個用戶的信息存為redis字符串和哈希“作為比對。

字符串存儲方式:

  • 方案1: 鍵名 user:1:info  值 序列化后的用戶對象
  • 方案2: 鍵名 user:1:字段名   值 字段值

哈希存儲方式:

方案3: 鍵名 user:1:info  值 用戶數據

方案1的優點是設計簡單,可節省內存(相對于方案2),缺點一是如果要修改用戶對象中的某個屬性要將整個用戶對象從redis中取出來,二是要對數據進行序列化和反序列化也會產生一定CPU開銷。

方案2的優點是可以單獨更新用戶的屬性,無需將這個用戶所有屬性取出。

缺點一是單個用戶的數據是分散的不利于管理,二是占用內存,方案1一個用戶的數據用一個key就可以保存,方案2一個用戶的數據要多個key才可以保存。

方案3的優點:直觀,節省空間,可以單獨更新hash中的某個屬性缺點:ttl不好控制

3.列表類型

列表本質是一個有序的,元素可重復的隊列

添加元素命令:

rpush/lpush
rpush c b a   # cba,插入方向<-,即從右往左
lpush c b a   # abc,插入方向->,從左往右
linsert  # 在一個元素前或后插入元素

刪除元素命令:

lpop/rpop   #彈出
lrem        #刪除
ltrim   # 修剪列表返回一個子列表,會影響原列表

查詢元素命令:

lrange  # 按照范圍查詢列表返回一個子列表
lindex  # 按索引取
llen    # 列表長度
改
lset    # 修改某索引的值為新值

實戰場景1:微博中的時間軸功能(文章按時間排序,還可以做分頁)

方案:做一個列表用于存放某個用戶的所有微博id,key為 weiboList:user:1,值為微博id。

做一個哈希,里面放微博的內容。

該用戶新增一個微博就會忘列表中lpop一個微博id,查詢的時候使用lrange即可,分頁也可以使用lrange。

blpop/brpop     # 是lpop和rpop的阻塞版

當列表長度不為空時,lpop和blpop效果一樣。

當列表長度為空,lpop會立刻返回nil,而blpop會等待,直到有元素進入列表,blpop就會執行彈出。

它的應用場景就是消息隊列。

小結:

  • 用列表實現棧:lpush+lpop = stack
  • 用列表實現隊列:lpush+rpop = queue
  • 用列表實現固定集合: lpush+ltrim = capped collection
  • 用列表實現消息隊列:lpush+brpop = message queue

4.集合類型

集合的特點是無序性和確定性(不重復)。

新增元素命令
sadd


刪除元素命令
srem
scard #個數
sismember   #是否存在
srandmember # 隨機選n個元素
spop    # 隨機彈出元素,影響原集合
smembers    # 返回所有元素,要慎用,不要獲取內容較大的集合

實戰場景1:抽獎

使用spop即可,利用的是它的無序性和不重復。

實戰場景2:贊,踩,收藏功能等。

方案: 每一個用戶做一個收藏的集合,每個收藏的集合存放用戶收藏過的文章id或者商品id。

鍵名: set:userCol:用戶id

值:文章id

如果使用mysql實現,需要建立多對多關系,要建中間表。

實戰場景3:給文章添加標簽

方案: 要創建兩種集合,以文章id為鍵名放標簽的集合,以標簽id為鍵名放文章的集合。創建兩種集合是因為我們會查詢某標簽下有什么文章,也會查詢某文章下有什么標簽

鍵名: article:1:tags    值:tag的id

鍵名: tag:1:users        值:user的id

而且這兩個集合創建時要放在一個事務中進行。

sdiff/sinter/sunion     # 交集并集差集

實戰場景4:共同好友

5.有序集合

有序集合的特點是 有序,無重復值,相關命令如下:

zadd key score element
zrem
zscore      # 獲取分數
zincrby     # 增加減少分數
zcard       # 元素個數
zrange      # 按下標范圍獲取元素,加上withscores會按分數排序
zrangebyscore   # 按照分數范圍獲取元素
zcount      # 按分數范圍計算元素個數
zremrangebyrank     # 刪除指定下標范圍的元素
zremrangebyscore

實戰場景1:排行榜

實戰場景2:延時隊列

最后強調一下,要慎用hgetall,原因如下:

當一個hash的字段數很多,存儲的內容很多時,處理hgetall請求會花費較長時間;而redis是單線程,同一時間只能處理一個操作,所以后面的操作都要等待hgetall處理完畢才能處理,很影響效率和性能。

還有一種情況:列表或者集合中存了很多哈希的鍵名。

通過 lrange 0 -1 或者 smembers 這樣的命令取出列表或者集合中所有鍵名再通過hgetall取出大量的hash,而每個hash中又有大量的字段。這種情況下性能會急劇下降,而且占用大量內存,甚至會造成宕機。

下面總結時間復雜度為n的命令:

String類型:

  • MSET、MSETNX、MGET

List類型:

  • LPUSH、RPUSH、LRANGE、LINDEX、LSET、LINSERT
  • LINDEX、LSET、LINSERT 這三個命令謹慎使用

Hash類型:

  • HDEL、HGETALL、HKEYS/HVALS
  • HGETALL、HKEYS/HVALS 謹慎使用

Set類型:

  • SADD、SREM、SRANDMEMBER、SPOP、
  • SMEMBERS、SUNION/SUNIONSTORE、SINTER/SINTERSTORE、SDIFF/SDIFFSTORE
  • Set類型的第二行命令謹慎使用。

Sorted Set類型:

  • ZADD、ZREM、
  • ZRANGE/ZREVRANGE、ZRANGEBYSCORE/ZREVRANGEBYSCORE、ZREMRANGEBYRANK/ZREMRANGEBYSCORE
  • Sorted Set的第二行時間復雜度 O(log(N)+M),需要謹慎使用

其他常用命令:

  • DEL、KEYS
  • KEYS 命令謹慎使用

基本上,設置多個值或者獲取多個值的命令其時間復雜度為n。時間復雜度越高,執行命令消耗的時間越長。

責任編輯:趙寧寧 來源: 程序員阿沛
相關推薦

2019-08-12 15:40:26

Redis數據庫數據類型

2023-07-04 08:41:08

Redis數據類型

2020-11-04 07:34:02

Redis數據類型

2023-04-28 15:05:25

React軟件項目可維護性

2019-11-11 14:55:25

Redis數據類型命令

2016-08-18 14:13:55

JavaScript基本數據引用數據

2023-11-13 08:31:25

SpringRedis存儲

2024-03-13 14:57:37

2010-10-08 09:02:03

JavaScript基

2017-02-27 08:34:09

JavaScript數據引用

2021-06-15 09:20:08

Redis數據類型

2023-03-27 10:04:27

數據類型浮點型布爾型

2011-05-26 14:27:56

java

2020-10-26 13:46:07

Java基礎入門篇

2021-04-28 18:16:24

Rust數據類型

2010-04-27 11:03:39

Oracle Java

2018-05-25 09:50:30

Java數據類型類型轉換

2009-08-14 11:15:45

C#基本數據類型

2015-04-07 10:46:48

Redis

2024-12-19 08:50:38

Redis存儲系統
點贊
收藏

51CTO技術棧公眾號

少妇一级淫免费播放| 亚洲free嫩bbb| 亚洲午夜精品久久久久久高潮| 欧美成人福利| 亚洲午夜激情网站| 欧美精品一区三区在线观看| 国产又爽又黄免费软件| 亚洲黄色av| 日韩网站免费观看高清| 日b视频在线观看| 成人高清一区| 亚洲不卡av一区二区三区| 四虎永久国产精品| 日本xxxxxwwwww| 久久国产精品无码网站| 2019av中文字幕| 国产精品99久久久久久成人| 亚洲桃色综合影院| 精品电影一区二区三区| 国产三级国产精品国产专区50| 国产乱码午夜在线视频| 18欧美亚洲精品| 欧美另类高清视频在线| 欧美一级淫片aaaaaa| 国内精品第一页| 国产精品亚洲精品| 免费无码国产精品| 亚洲毛片av| 欧美国产日韩中文字幕在线| 国产美女高潮视频| av亚洲在线观看| 日韩精品免费看| 亚洲午夜久久久久久久久| 亚洲青青一区| 欧美色综合天天久久综合精品| 日本网站免费在线观看| 18加网站在线| 亚洲欧美成人一区二区三区| 亚洲欧美日产图| 国产福利在线观看| 久久精品人人做人人爽人人| 久久精品国产综合精品| 天堂在线视频网站| 成人av免费观看| 99一区二区三区| 亚洲AV无码乱码国产精品牛牛| 国产毛片一区二区| 亚洲自拍高清视频网站| 国产黄频在线观看| 国产成人免费视频网站| 999日本视频| 国产av一区二区三区| 国产精品一区在线观看你懂的| 国产日韩中文字幕| 99热这里只有精品66| 国产一区二区三区观看| 亚洲在线视频福利| 精品久久久无码中文字幕| 国产成人午夜电影网| 3d精品h动漫啪啪一区二区| 精品欧美在线观看| 成人爱爱电影网址| 久久国产精品免费一区| 青青国产在线| 欧美国产精品一区二区| 在线观看日本一区| av免费在线网站| 亚洲电影一级黄| 色综合av综合无码综合网站| 色豆豆成人网| 欧美日韩久久久久久| 日韩精品xxx| 国产一区二区三区不卡av| 日韩精品一二三四区| www.av天天| 91精品国产调教在线观看| 欧美成人精品激情在线观看 | 亚洲国产成人精品视频| 久久国产精品网| 亚洲精品福利电影| 欧美日韩国产欧美日美国产精品| 男生和女生一起差差差视频| 国产伦理久久久久久妇女 | 日本色护士高潮视频在线观看 | 欧美日韩破处| 在线播放日韩专区| 国产探花在线免费观看| 亚洲黄色成人| 国产日韩精品视频| 色婷婷av一区二区三区之e本道| 久久综合久久99| 一区二区视频国产| 91探花在线观看| 欧美日韩国产综合久久| 亚洲av熟女高潮一区二区| 国产一区二区精品久| 欧美区二区三区| 久久久蜜桃一区二区| 国产在线视频一区二区三区| 麻豆传媒一区| 国产在线观看av| 欧美日韩精品在线| 777视频在线| 欧美亚洲国产日韩| 久久久精品久久久| 国产精品久久久久久人| 国产高清久久久久| 亚洲精品国产精品久久| 三级在线观看视频| 日韩一区二区电影| 国产精品1区2区3区4区| 国产一区二区三区成人欧美日韩在线观看| 国产免费一区二区三区在线能观看 | 日韩不卡手机在线v区| 国产精品久久波多野结衣| 最新电影电视剧在线观看免费观看| 亚洲高清在线视频| 精品综合久久久久| 亚洲免费观看高清完整版在线观| 久久69精品久久久久久国产越南| 中文字幕+乱码+中文| 久久亚洲一区二区三区明星换脸| 国产视频在线观看网站| 亚洲高清国产拍精品26u| 亚洲人永久免费| 国产污污视频在线观看| 粉嫩13p一区二区三区| 一级特黄录像免费播放全99| 欧美性片在线观看| 亚洲欧美国产va在线影院| 亚洲精品国产精品乱码| 成人黄色a**站在线观看| 激情图片qvod| 国产一区二区三区视频在线| 色婷婷综合久久久久中文字幕1| 亚洲成人第一网站| 26uuu精品一区二区| 青青青国产在线观看| 国产精品一线| 性欧美长视频免费观看不卡| 亚洲国产精品久久久久久久| 亚洲老司机在线| 欧美日韩久久婷婷| 久久久久av| 91九色视频在线| 黄色网页在线播放| 91精品国产综合久久精品性色| 免费三级在线观看| 国产专区综合网| 精品国产一区二区三区在线| 日本一区影院| 欧美日韩ab片| 免费av网站在线播放| 亚洲韩国一区二区三区| 国产女人18毛片水真多18| 精品成人久久| 久久99精品久久久久子伦| 黄色在线网站噜噜噜| 亚洲免费精彩视频| 人妻中文字幕一区二区三区| 国产精品美女久久久久久| 高清av免费看| 在线一区免费| 国产一区二区三区奇米久涩| xxxxxx欧美| 尤物精品国产第一福利三区| 国产精品久久欧美久久一区| 一区二区三区在线观看动漫| 亚洲一区二区在线免费| 亚洲一区观看| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 亚洲一区av| 久久免费高清视频| 欧美美女色图| 91精品国产一区二区三区蜜臀| 久久精品无码人妻| 久久久精品人体av艺术| 中文字幕日韩综合| 亚洲毛片在线| 亚洲欧美日韩精品在线| 粉嫩久久久久久久极品| 日韩美女免费视频| 国产在线观看91| 亚洲精品一区中文| 国产精品久久久久久免费免熟| 午夜欧美在线一二页| 蜜桃久久精品成人无码av| 国产在线播放一区| 少妇高潮喷水久久久久久久久久| 999成人精品视频线3| 国产精品亚洲一区| 福利一区和二区| 91精品国产91久久久久久久久| 欧美jizz18性欧美| 日韩成人激情视频| 国产绳艺sm调教室论坛| 日韩欧美国产一区二区| 人妻少妇精品一区二区三区| 久久亚洲一级片| 99999精品| 免费人成网站在线观看欧美高清| 无码粉嫩虎白一线天在线观看| 日韩欧美一区二区三区免费看| 国产欧美一区二区视频| 日韩国产91| 日本高清不卡的在线| 欧美理论电影| 久久精品中文字幕免费mv| 男女污视频在线观看| 亚洲精品一区二区三区精华液 | 国产成人av福利| 亚洲福利精品视频| 国产农村妇女毛片精品久久莱园子| 99精品一级欧美片免费播放| 成人久久一区| 欧美国产一二三区| 精品嫩草影院| av免费精品一区二区三区| 日日夜夜亚洲| 国产精品午夜视频| 日韩在线免费| 秋霞午夜一区二区| xxx.xxx欧美| 欧美贵妇videos办公室| 高清免费电影在线观看| 中文字幕自拍vr一区二区三区| 激情小视频在线观看| 精品偷拍各种wc美女嘘嘘| 成人午夜免费在线观看| 日韩免费高清视频| av综合在线观看| 欧美一级在线观看| 99热这里只有精品66| 91精品国模一区二区三区| 国产精品色综合| 欧美三级在线视频| 一区二区不卡视频在线观看| 欧美日韩中文国产| 一区二区三区免费在线| 欧美日韩国产综合久久 | 亚洲第一中文字幕| 手机看片一区二区三区| 亚洲国内精品在线| 亚洲欧美日韩免费| 亚洲精选中文字幕| 九一国产在线| 中文字幕在线观看日韩| 在线免费看av| 久久夜色精品亚洲噜噜国产mv| 精精国产xxxx视频在线| 欧美理论电影在线观看| 婷婷色在线播放| 久久久久久久影院| 美女露胸视频在线观看| 国外色69视频在线观看| 岛国av在线网站| 欧美一区二区三区免费视| 麻豆免费版在线观看| 国产精品九九九| 亚洲天堂网站| 国产麻豆日韩| 国产精品日韩精品中文字幕| 亚洲一区影院| 欧美日韩成人| 欧美黄色免费影院| 蜜桃久久精品一区二区| 深夜福利网站在线观看| 不卡在线视频中文字幕| 久久久久久久久久久国产精品| 日本一区二区视频在线观看| 多男操一女视频| 亚洲图片欧美视频| 超碰在线免费97| 欧美一三区三区四区免费在线看 | 97超碰国产在线| 日韩欧美视频一区| 欧美3p视频在线观看| 久久精品国产一区| av手机在线观看| 国产精品女视频| 大型av综合网站| 亚洲不卡一卡2卡三卡4卡5卡精品| 欧美激情欧美| 国产精品12345| 久久99久久99小草精品免视看| 麻豆精品国产传媒| 国产亚洲午夜高清国产拍精品| 日本一级二级视频| 色婷婷综合久久久中文一区二区| 国产深喉视频一区二区| 亚洲欧美日韩第一区| 超鹏97在线| 国产福利成人在线| 91精品啪在线观看国产爱臀| 日本一区二区在线| 伊人成人网在线看| 中文字幕天天干| 91首页免费视频| 久久99久久98精品免观看软件| 欧美在线观看视频一区二区 | 日本丰满少妇xxxx| 美国三级日本三级久久99| 性久久久久久久久久久| 亚洲免费观看高清| 国产99久久久久久免费看| 亚洲成人1234| 成年人网站在线| 国产精品网红直播| 亚洲免费成人av在线| 成人一级生活片| 国内精品自线一区二区三区视频| japanese中文字幕| 欧美日韩国产黄| 国产视频手机在线| 日韩在线观看网址| 秋霞国产精品| 欧美精品久久久| 亚洲国产午夜| 91成人在线观看喷潮蘑菇| 亚洲欧美日韩在线播放| 中文字幕乱码人妻无码久久 | 国产视频一区二区不卡| 亚洲综合专区| 亚洲污视频在线观看| 久久伊人中文字幕| 在线观看黄网站| 欧美精品一区二区三区在线播放| av网站导航在线观看免费| 成人女保姆的销魂服务| 97久久视频| 五月天av在线播放| 国产精品免费久久| 一级爱爱免费视频| 日韩亚洲欧美中文高清在线| 78精品国产综合久久香蕉| 日韩高清dvd| 日韩电影免费在线看| 欧美做受高潮6| 色婷婷综合久久久久中文一区二区| 视频在线不卡| 日本91av在线播放| 欧美丝袜一区| 99免费视频观看| 欧美国产乱子伦 | 亚洲精品美女在线观看| 成年人黄色大片在线| 久久精品丝袜高跟鞋| 国产日韩精品视频一区二区三区| av在线网站观看| 91成人国产精品| 看黄网站在线观看| av激情久久| 中文精品视频| 人妻少妇无码精品视频区| 欧美网站大全在线观看| 香蕉视频在线看| 91成人在线看| 9色精品在线| 国产探花视频在线播放| 7777女厕盗摄久久久| 免费不卡av| 欧美大陆一区二区| 日本欧美一区二区三区| 青青青在线免费观看| 337p日本欧洲亚洲大胆精品| 中文在线8资源库| 午夜精品福利一区二区| 国内久久精品视频| 亚洲男人的天堂在线视频| 国产亚洲精品久久久久久| 婷婷激情成人| 成人在线观看你懂的| 国产日产欧美一区二区视频| 97超碰中文字幕| 91国内揄拍国内精品对白| 九九热线有精品视频99| 亚洲图片 自拍偷拍| 香蕉影视欧美成人| 成人午夜影视| 99r国产精品视频| 久久在线精品| 日韩在线观看视频一区二区| 精品国产自在久精品国产| 韩国成人动漫| 黄色录像特级片| 国产日韩一级二级三级| 精品人妻久久久久一区二区三区 | 精品国产欧美| www.com毛片| 亚洲欧美日韩精品久久久久| 头脑特工队2免费完整版在线观看| 国产欧美在线播放| 国产亚洲一级| 免费中文字幕在线观看| 亚洲色图50p| 福利片在线一区二区| 国产wwwxx| 欧美日韩亚洲成人| 伊人影院在线视频| 亚洲欧美日韩国产成人综合一二三区|