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

詳解 mini-redis 復(fù)刻 Redis 的 I NCR 指令

數(shù)據(jù)庫 Redis
本文將針對字符串操作中介紹筆者近期所復(fù)刻的鍵值自增指令的落地思路,以幫助讀者更好的理解和學習mini-redis。

因為近期比較忙碌,所以對于mini-redis的復(fù)刻基本處于一些指令向的完善,而本文將針對字符串操作中介紹筆者近期所復(fù)刻的鍵值自增指令的落地思路,以幫助讀者更好的理解和學習mini-redis。

對象類型前置校驗

因為指令是基于字符串操作的,所以在執(zhí)行INCR或者DECR之前我們都必須針對入?yún)⒌逆I值對進行校驗,所以對于以下情況,我們都必須采用fail-fast的方式提前將失敗暴露,將鍵值對已存在,對應(yīng)的值非字符串類型(例如:字典類型),直接響應(yīng)錯誤:

基于上述的基本概念,我們給出落地的代碼,即位于command.go的incrDecrCommand方法,可以看到我們會優(yōu)先到redis內(nèi)存中查看是否存在對應(yīng)的key,如果存在則進行必要的類型判斷,如果非字符串類型即REDIS_STRING則直接響應(yīng)錯誤出去,并直接返回:

func incrDecrCommand(c *redisClient, incr int64) {
 var value int64
 var oldValue int64
 var newObj *robj
 //查看鍵值對是否存在
 o := lookupKeyWrite(c.db, c.argv[1])
 //如果鍵值對存在且類型非字符串類型,直接響應(yīng)錯誤并返回
 if o != nil && checkType(c, o, REDIS_STRING) {
  return
 }
 
 
 //......

}

對此我們也給出checkType的內(nèi)部邏輯,可以看到當比對類型不一致時會直接輸出錯誤并返回true,讀者可以參考注釋了解:

func checkType(c *redisClient, o *robj, rType int) bool {
 //如果類型不一致,則輸出-WRONGTYPE Operation against a key holding the wrong kind of value
 if o.robjType != rType {
  addReply(c, shared.wrongtypeerr)
  return true
 }
 return false
}

其實筆者這里也想吐槽一句redis對于函數(shù)設(shè)計的語義的不恰當性,理論性合理的函數(shù)進行校驗時正確的做法應(yīng)該是:

  • 邏輯校驗失敗,輸出錯誤返回false。
  • 邏輯校驗正確,返回true。

也只能說因為某些歷史原因,或者設(shè)計者有著自己的主觀編碼習慣吧,本著一比一的復(fù)刻理念,筆者也沿襲了這樣的編碼思路。

基于數(shù)值池高效完成字符串轉(zhuǎn)換

針對字符串類型(可以轉(zhuǎn)數(shù)值的情況下,它也會轉(zhuǎn)數(shù)值類型),我們都是通過robj類型創(chuàng)建和維護,因為我們本次所復(fù)刻的incr和decr所操作的類型是字符串中可轉(zhuǎn)為數(shù)值的對象,所以本著數(shù)值類型有跡可循的規(guī)律以及空間換時間的思想,我們提出池化思想,即將0-9999數(shù)值緩存一份數(shù)值池,后續(xù)的增減操作后處于該范圍的數(shù)值都可以直接使用數(shù)值池里對應(yīng)的robj對象,以節(jié)約robj對象創(chuàng)建的開銷和非必要的內(nèi)存資源占用:

所以筆者在main.go中聲明sharedObjectsStruct 這個結(jié)構(gòu)體中聲明了一個integers維護常量池的robj對象:

type sharedObjectsStruct struct {
 //......
 integers       [REDIS_SHARED_INTEGERS]*robj //通用0~9999常量數(shù)值池
 //......
}

然后在createSharedObjects方法中完成初始化,后續(xù)就可以直接使用了:

func createSharedObjects() {
 //......

 var i int64
 //初始化常量池對象
 for i = 0; i < REDIS_SHARED_INTEGERS; i++ {
  //基于接口封裝數(shù)值
  num := interface{}(i)
  //生成string對象
  shared.integers[i] = createObject(REDIS_STRING, &num)
  //聲明編碼類型為int
  shared.integers[i].encoding = REDIS_ENCODING_INT
 }

 //......
}

于是我們就得出了后續(xù)的編碼邏輯:

  • 將value強轉(zhuǎn)為數(shù)值判斷是否超出范圍,如果超了則拋出異常。反之進入步驟2。
  • 查看取值范圍是否大于10000,如果是則自己生成robj對象,反之采用池化數(shù)值池的robj。
  • 基于1、2生成的數(shù)值對象將鍵值對更新或者覆蓋到內(nèi)存數(shù)據(jù)庫中。
/**
 針對字符串類型的值進行如下判斷的和轉(zhuǎn)換:
 1. 如果為空,說明本次的key不存在,直接初始化一個空字符串,后續(xù)會直接初始化一個0值使用
 2. 如果是字符串類型,則轉(zhuǎn)為字符串類型
 3. 如果是數(shù)值類型,則先轉(zhuǎn)為字符串類型進行后續(xù)的通用數(shù)值轉(zhuǎn)換操作保證一致性
 */
 var s string
 if o == nil {
  s = ""
 } else if isString(*o.ptr) {
  s = (*o.ptr).(string)
 } else {
  s = strconv.FormatInt((*o.ptr).(int64), 10)
 }
 //進行類型強轉(zhuǎn)為數(shù)值,如果失敗,直接輸出錯誤并返回
 if getLongLongFromObjectOrReply(c, s, &value, nil) != REDIS_OK {
  return
 }

 oldValue = value
 //如果累加超范圍則報錯
 if (incr < 0 && oldValue < 0 && incr < (math.MinInt64-oldValue)) ||
  (incr > 0 && oldValue > 0 && incr > (math.MaxInt64-oldValue)) {
  errReply := "increment or decrement would overflow"
  addReplyError(c, &errReply)
  return
 }
 //基于incr累加的值生成value
 value += incr
 //如果超常量池范圍則封裝一個對象使用 
 if o != nil &&
  (value < 0 || value >= REDIS_SHARED_INTEGERS) &&
  (value > math.MinInt64 || value < math.MaxInt64) {
  newObj = o

  i := interface{}(value)
  o.ptr = &i
 } else if o != nil {//如果對象存在,且累加結(jié)果沒超范圍則調(diào)用createStringObjectFromLongLong獲取常量對象
  newObj = createStringObjectFromLongLong(value)
  //將寫入結(jié)果覆蓋
  dbOverwrite(c.db, c.argv[1], newObj)
 } else {//從常量池獲取數(shù)值,然后添加鍵值對到數(shù)據(jù)庫中
  newObj = createStringObjectFromLongLong(value)
  dbAdd(c.db, c.argv[1], newObj)
 }

通用結(jié)果響應(yīng)

完成上述操作后就是將結(jié)果按照RESP協(xié)議規(guī)范將結(jié)果響應(yīng)給客戶端,按照協(xié)議要求數(shù)值類型必須用:號開頭,所以假設(shè)我們累加結(jié)果為10,那么響應(yīng)給客戶端的結(jié)果就是10\r\n。

對應(yīng)我們的給出最后的代碼段:

//將累加后的結(jié)果返回給客戶端,按照RESP格式即 :數(shù)值\r\n,例如返回10 那么格式就是:10\r\n
 reply := *shared.colon + strconv.FormatInt(value, 10) + *shared.crlf
 addReply(c, &reply)

完整的代碼實現(xiàn)

我們來小結(jié)一下上述的實現(xiàn)思路:

  • 鍵值對查詢與校驗。
  • 數(shù)值類型轉(zhuǎn)換與越界判斷。
  • 字符串類型強轉(zhuǎn)并基于取值范圍查看是否通過數(shù)值池獲取。
  • 更新或覆蓋鍵值對。
  • 將操作結(jié)果返回客戶端。

完整代碼如下:

func incrDecrCommand(c *redisClient, incr int64) {
 var value int64
 var oldValue int64
 var newObj *robj
 //查看鍵值對是否存在
 o := lookupKeyWrite(c.db, c.argv[1])
 //如果鍵值對存在且類型非字符串類型,直接響應(yīng)錯誤并返回
 if o != nil && checkType(c, o, REDIS_STRING) {
  return
 }
 /**
 針對字符串類型的值進行如下判斷的和轉(zhuǎn)換:
 1. 如果為空,說明本次的key不存在,直接初始化一個空字符串,后續(xù)會直接初始化一個0值使用
 2. 如果是字符串類型,則轉(zhuǎn)為字符串類型
 3. 如果是數(shù)值類型,則先轉(zhuǎn)為字符串類型進行后續(xù)的通用數(shù)值轉(zhuǎn)換操作保證一致性
 */
 var s string
 if o == nil {
  s = ""
 } else if isString(*o.ptr) {
  s = (*o.ptr).(string)
 } else {
  s = strconv.FormatInt((*o.ptr).(int64), 10)
 }
 //進行類型強轉(zhuǎn)為數(shù)值,如果失敗,直接輸出錯誤并返回
 if getLongLongFromObjectOrReply(c, s, &value, nil) != REDIS_OK {
  return
 }

 oldValue = value

 if (incr < 0 && oldValue < 0 && incr < (math.MinInt64-oldValue)) ||
  (incr > 0 && oldValue > 0 && incr > (math.MaxInt64-oldValue)) {
  errReply := "increment or decrement would overflow"
  addReplyError(c, &errReply)
  return
 }
 //基于incr累加的值生成value
 value += incr
 //如果超常量池范圍則封裝一個對象使用
 if o != nil &&
  (value < 0 || value >= REDIS_SHARED_INTEGERS) &&
  (value > math.MinInt64 || value < math.MaxInt64) {
  newObj = o

  i := interface{}(value)
  o.ptr = &i
 } else if o != nil { //如果對象存在,且累加結(jié)果沒超范圍則調(diào)用createStringObjectFromLongLong獲取常量對象
  newObj = createStringObjectFromLongLong(value)
  //將寫入結(jié)果覆蓋
  dbOverwrite(c.db, c.argv[1], newObj)
 } else { //從常量池獲取數(shù)值,然后添加鍵值對到數(shù)據(jù)庫中
  newObj = createStringObjectFromLongLong(value)
  dbAdd(c.db, c.argv[1], newObj)
 }
 //將累加后的結(jié)果返回給客戶端,按照RESP格式即 :數(shù)值\r\n,例如返回10 那么格式就是:10\r\n
 reply := *shared.colon + strconv.FormatInt(value, 10) + *shared.crlf
 addReply(c, &reply)

}

遞增遞減的復(fù)用

基于上述函數(shù)對應(yīng)的遞增指令I(lǐng)NCR就使用incrCommand,入?yún)?代表加1,而decrCommand則傳-1扣減即可:

func incrCommand(c *redisClient) {
 //累加1
 incrDecrCommand(c, 1)
}

func decrCommand(c *redisClient) {
 //遞減1
 incrDecrCommand(c, -1)
}

最終效果演示

最后,我們將服務(wù)啟動進行測試,可以看到指令正常執(zhí)行:

127.0.0.1:6379> incr k1
(integer) 1
(4.50s)
127.0.0.1:6379> incr k1
(integer) 2
127.0.0.1:6379> incr k1
(integer) 3
127.0.0.1:6379> incr k1
(integer) 4
127.0.0.1:6379> incr k1
(integer) 5
127.0.0.1:6379> incr k1
(integer) 6
127.0.0.1:6379> decr k1
(integer) 5
127.0.0.1:6379> decr k1
(integer) 4
127.0.0.1:6379> decr k1
(integer) 3
127.0.0.1:6379> decr k1
(integer) 2
127.0.0.1:6379> decr k1
(integer) 1
127.0.0.1:6379> decr k1
(integer) 0
127.0.0.1:6379> decr k1
(integer) -1
127.0.0.1:6379>


責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關(guān)推薦

2024-11-22 15:00:00

開源Redis鏈表

2018-08-15 09:48:27

數(shù)據(jù)庫Redis應(yīng)用場景

2023-07-03 07:55:25

2024-04-18 00:20:56

Redis策略數(shù)據(jù)

2024-07-16 08:38:06

2024-04-18 08:00:00

2019-08-06 19:36:25

RedisMemcached緩存

2025-01-15 08:19:12

SpringBootRedis開源

2024-07-31 08:33:17

2024-11-11 17:12:22

2011-10-25 10:36:19

蘋果臺式機

2024-12-09 00:00:09

2024-10-08 10:13:17

2018-04-27 09:03:57

Redis數(shù)據(jù)存儲

2011-11-07 09:42:58

蘋果臺式機

2011-10-27 15:04:19

蘋果臺式機

2019-05-17 08:55:49

RedisRDBAOF

2018-11-06 10:51:07

Redis開發(fā)存儲系統(tǒng)

2024-09-26 06:30:36

2019-09-16 16:05:13

Redis集群模式
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲电影二区| 青青草娱乐在线| 中文字幕一区二区三三| 精品国产一区a| 欧美 激情 在线| 国产网站在线免费观看 | 精品www久久久久奶水| 永久av在线| www.亚洲免费av| 成人春色激情网| 日本道在线观看| 青青草成人影院| 精品国产sm最大网站| 欧美日韩成人在线一区| 色先锋aa成人| 色综合久久88色综合天天提莫| www.av网站| 亚洲综合国产| 欧美激情视频在线观看| www.99热| 婷婷精品在线观看| 亚洲欧美高清视频| 欧美女子与性| 久久黄色级2电影| 性欧美长视频免费观看不卡| 少妇愉情理伦三级| 亚州综合一区| 欧美成va人片在线观看| 欧美大片免费观看| 亚洲视频在线a| 9lporm自拍视频区在线| 亚洲天堂成人网| 神马影院午夜我不卡| 熟妇人妻系列aⅴ无码专区友真希| 美女视频第一区二区三区免费观看网站| 高清一区二区三区四区五区| 夫妻性生活毛片| 日韩av在线播放网址| 日韩毛片中文字幕| 国产+高潮+白浆+无码| 日韩在线亚洲| 日韩一区二区三区精品视频| 亚洲怡红院在线| 欧美综合社区国产| 欧美午夜电影网| 熟妇人妻无乱码中文字幕真矢织江| 国产www视频在线观看| 一区二区三区蜜桃| 麻豆映画在线观看| 日韩成人伦理| 亚洲一区二区偷拍精品| 日本a级片在线播放| 亚洲羞羞网站| 亚洲自拍偷拍麻豆| 亚洲 欧美 综合 另类 中字| 欧美极品少妇videossex| 一区二区三区在线观看动漫| 男人的天堂视频在线| 黄色网址在线免费| 亚洲黄色av一区| 成年在线观看视频| www在线看| 性欧美疯狂xxxxbbbb| 国产精品999视频| 午夜影院在线观看国产主播| 精品福利在线看| 99久久激情视频| 国产成人精选| 日韩欧美亚洲一区二区| 熟女人妻一区二区三区免费看| 亚洲综合色婷婷在线观看| 精品欧美一区二区在线观看| 91丨porny丨对白| 蜜桃一区二区三区| 伊人av综合网| 国产精品 欧美激情| 国内自拍视频一区二区三区| 午夜精品一区二区三区在线播放| 久久久精品免费看| 免费观看在线综合色| 91在线|亚洲| 欧美 日韩 国产 成人 在线| 久久综合av免费| 亚洲国产另类久久久精品极度| 成视频免费观看在线看| 亚洲成人动漫精品| 黑森林精品导航| 天堂va在线高清一区| 日韩av在线免播放器| 亚洲图片第一页| 亚洲成色精品| 国产精品狼人色视频一区| 国产亲伦免费视频播放| 9久草视频在线视频精品| 日韩福利二区| 黄色羞羞视频在线观看| 色综合久久综合| 男人午夜视频在线观看| 欧美人与动xxxxz0oz| 日韩亚洲国产中文字幕| 久久免费精彩视频| 国产激情一区| 国产成人精品免费视| 91精品国产一区二区三区| 超碰caoprom| 欧美理论视频| 欧美精品电影免费在线观看| 中文字幕 日韩有码| 丰满少妇久久久久久久| 色综合久久av| 成人黄色一级大片| 91精品一区二区三区四区| 日韩一级片免费| 国产精品三级av| 黄色大片中文字幕| 只有精品亚洲| 亚洲视频第一页| 久久黄色小视频| 国产一区二区三区四区老人| 91成人免费电影| 日本女人黄色片| 欧美特黄一级大片| 欧美亚洲成人xxx| 亚洲精华国产精华精华液网站| 国产亚洲人成网站| 91九色在线观看视频| 国产视频网站一区二区三区| 中文国产成人精品久久一| 成人免费视频毛片| 成人动漫一区二区| 国产又粗又硬又长| 色综合视频一区二区三区44| 国产亚洲综合久久| 东京热一区二区三区四区| 高清在线不卡av| 黄色一级视频播放| 亚瑟国产精品| 久久精品国产2020观看福利| 正在播放木下凛凛xv99| 国产清纯美女被跳蛋高潮一区二区久久w | 中文字幕一区久久| 国产一区毛片| 国产成人一区二区三区| 欧洲一区av| 一本色道亚洲精品aⅴ| 噜噜噜在线视频| 亚洲深夜av| 久久久久久久久久久久久久久久av | 欧美黑人xxxⅹ高潮交| 999av视频| 亚洲欧美一区二区三区久本道91| 男生操女生视频在线观看| 日韩精品dvd| 国产精品视频自拍| av在线免费一区| 欧美视频三区在线播放| 中文字幕网站在线观看| 三级久久三级久久| 亚洲一区二区三区精品在线观看| 日韩久久一区二区三区| 中日韩美女免费视频网址在线观看| 久久精品国产亚洲av麻豆蜜芽| 国产日本亚洲高清| wwwwwxxxx日本| 综合在线一区| 风间由美久久久| 在线女人免费视频| 亚洲午夜激情免费视频| 中文字幕乱码一区二区| 中文字幕欧美一| 一级片免费在线观看视频| 黄色成人91| 欧美日韩精品一区| 久久精品国产精品亚洲毛片| 久久精品成人动漫| 日本久久一级片| 91国产免费观看| 99久久精品久久亚洲精品| 狠狠色狠狠色合久久伊人| 精品人妻人人做人人爽| 一区二区美女| 成人黄色在线播放| av女在线播放| 在线一区二区日韩| av在线免费在线观看| 大荫蒂欧美视频另类xxxx| 国产精品情侣呻吟对白视频| 国产伦精品一区二区三区视频青涩 | 朝桐光av在线| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 久久av少妇| 欧美一区二区三区影视| 国产手机在线视频| 国产精品灌醉下药二区| 人妖粗暴刺激videos呻吟| 日韩高清在线不卡| 黄色三级中文字幕| 成久久久网站| 国内精品二区| 国产精久久久| 国产成人免费91av在线| 视频在线这里都是精品| 亚洲午夜激情免费视频| 亚洲精品视频专区| 欧美日韩国产一区二区三区地区| 日本三级黄色大片| 亚洲老司机在线| 精品欧美一区二区久久久| 国产成人免费av在线| 亚洲xxxx2d动漫1| 99精品视频网| 国产又粗又长又爽视频| 日本大胆欧美| 欧美日韩电影一区二区| 超碰成人在线观看| 91亚洲国产成人精品性色| 欧美影视资讯| 2018日韩中文字幕| 女同视频在线观看| 久久天天躁狠狠躁夜夜躁2014| 欧美少妇另类| 亚洲国产一区二区三区在线观看| 国产精品一级二级| 在线精品视频免费观看| 日韩手机在线观看| 亚洲一区二区三区激情| 波多野结衣爱爱视频| 国产欧美一区二区三区鸳鸯浴 | 亚洲欧美电影院| 欧美a在线播放| 久久综合色综合88| 视频免费在线观看| 国产成人精品www牛牛影视| 一女二男3p波多野结衣| 日韩高清一级片| 欧美极品欧美精品欧美图片| 在线亚洲自拍| 亚洲熟女乱色一区二区三区| 亚洲麻豆视频| 黄色一级在线视频| 在线视频精品| 日本三级免费网站| 久久国产精品99国产| 久久久久久久午夜| 国产精品综合色区在线观看| 一区二区传媒有限公司| 亚洲成人中文| 中国丰满人妻videoshd| 亚洲综合激情| 91视频免费版污| 蜜桃av一区二区三区电影| 成人性生生活性生交12| 欧美aaaaa成人免费观看视频| 免费看国产黄色片| 蜜臀av一区二区在线免费观看| 亚洲第一中文av| 精品在线观看免费| 亚洲一级片免费观看| 成人午夜看片网址| a天堂视频在线观看| 久久久夜色精品亚洲| 国产sm调教视频| 中文字幕一区二区三区在线观看| 亚洲综合久久av一区二区三区| 综合婷婷亚洲小说| 精品少妇theporn| 狠狠做深爱婷婷久久综合一区| 国产精品视频一区在线观看| 欧美日韩在线三区| a天堂中文在线观看| 亚洲第一精品夜夜躁人人爽| 青青国产在线| 久久好看免费视频| 丁香高清在线观看完整电影视频| 国产69久久精品成人看| 日韩精品三区| 亚洲伊人久久综合| 精品少妇3p| 亚洲高清乱码| 午夜国产欧美理论在线播放| 久久成人免费观看| 麻豆成人av在线| 无码人妻精品一区二区三区99不卡| 久久婷婷一区二区三区| 国精品无码一区二区三区| 亚洲电影在线免费观看| 最近中文字幕免费观看| 欧美一区二区三区色| 青青青草原在线| 欧美成人在线免费| 欧美二三四区| 99porn视频在线| 国产中文字幕一区二区三区| 超碰10000| 欧美a一区二区| 亚洲视频在线播放免费| 国产精品高潮呻吟久久| 日本午夜视频在线观看| 777奇米四色成人影色区| 你懂的视频在线观看| 久久综合免费视频| 快播电影网址老女人久久| 国产伦精品一区二区| 久久香蕉国产| 日本在线观看a| 国产激情一区二区三区四区 | 五月婷婷欧美视频| 亚洲一级片免费看| 日韩精品在线免费播放| 午夜dj在线观看高清视频完整版| 国产精品老女人视频| 五月综合久久| 日本www在线视频| 国产精品亚洲综合一区在线观看| 欧美丰满美乳xxⅹ高潮www| 亚洲成av人片在线| 亚洲精品97久久中文字幕| 色阁综合伊人av| 欧美人体一区二区三区| 国内视频一区| 在线欧美日韩| 9191在线视频| 成人欧美一区二区三区在线播放| 五月天激情国产综合婷婷婷| 精品国产精品一区二区夜夜嗨| 蜜芽在线免费观看| 国产玖玖精品视频| 久操国产精品| 国产亚洲天堂网| 91在线一区二区三区| 精品无码一区二区三区电影桃花| 欧美一区二区三区在线观看视频| 亚洲欧美视频一区二区| 国产精自产拍久久久久久| 久久精品高清| www.com久久久| 中文字幕一区二区三区蜜月| 在线观看日韩一区二区| 最近更新的2019中文字幕| 国产精品黄色片| 亚洲欧洲在线一区| 麻豆精品在线观看| 俄罗斯毛片基地| 欧美日韩精品一区二区三区四区| 国产精品视频一区二区久久| 国产福利视频一区二区| 国产成人精品一区二区免费看京 | 国产美女亚洲精品7777| 视色,视色影院,视色影库,视色网| 狠狠色丁香婷婷综合| 日韩激情小视频| 欧美一二三四区在线| 手机av在线播放| 久久精品99| 久久久亚洲一区| 免费看日本黄色片| 欧美人牲a欧美精品| www在线观看播放免费视频日本| 成人欧美一区二区三区在线观看| 狠狠色丁香久久综合频道| 人妻无码中文久久久久专区| 日韩欧美在线观看| 成人高清免费在线播放| 成人激情春色网| 午夜欧美精品久久久久久久| 佐佐木明希电影| 日韩欧美在线中文字幕| 懂色av中文在线| 亚洲va码欧洲m码| 一区二区日本视频| 欧洲av一区二区三区| 7799精品视频| 日韩精品极品| 亚洲永久激情精品| 国产激情一区二区三区四区| 久久国产视频一区| 中文字幕无线精品亚洲乱码一区 | 国产精品看片你懂得| jlzzjlzzjlzz亚洲人| 69久久夜色精品国产69乱青草| 精品不卡一区| 欧美一级片在线免费观看| 欧美日韩在线看| 很黄的网站在线观看| 久久99精品久久久久子伦| 老司机免费视频一区二区 | 欧美午夜精品理论片a级按摩| 91cn在线观看| 日韩av电影免费观看| 国产高清在线观看免费不卡| 免费黄色av片| 欧美日韩国产二区| jiujiure精品视频播放| 年下总裁被打光屁股sp| 91久久精品一区二区三区| 欧美性爽视频| 一区二区三区四区五区视频| 成人av电影在线网| 国产精品久久久久久免费播放| 91精品国产精品|