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

孩娇小videos精品| 91精品免费| av电影在线不卡| 欧美亚洲综合视频| 亚洲精品久久久久久国产精华液| 国产亚洲欧美一区二区三区| 天天综合久久综合| 最新国产精品久久久| 亚洲国产精品va在线观看黑人| 国产麻花豆剧传媒精品mv在线| 欧美日本一道| 99久久精品99国产精品| 国产精自产拍久久久久久| 欧美日韩精品在线观看视频| 妖精一区二区三区精品视频| 在线播放一区二区三区| 男女啪啪免费视频网站| 日韩欧美小视频| 91在线一区二区| 成人精品福利视频| 在线观看日本网站| 亚洲午夜一级| 一级做a爰片久久毛片美女图片| 古装做爰无遮挡三级聊斋艳谭| 一个人看的www视频在线免费观看| 国产精品高潮久久久久无| 国产亚洲情侣一区二区无| 国产视频一二三四区| 久久久久久色| 97精品久久久中文字幕免费| 精品无码久久久久成人漫画| 国内精品视频在线观看 | 亚洲国产精品一| 久久久蜜桃一区二区人| 午夜精品蜜臀一区二区三区免费 | 午夜久久影院| 日韩有码在线观看| 亚洲欧洲久久久| 麻豆精品99| 欧美变态口味重另类| 国产乱码一区二区三区四区| 456成人影院在线观看| 婷婷国产v国产偷v亚洲高清| 美女黄色免费看| а√天堂官网中文在线| 国产精品免费看片| 亚洲国产另类久久久精品极度| 三区在线视频| 91丨porny丨蝌蚪视频| 国产精品久久久久av福利动漫| 国产ts变态重口人妖hd| 狠狠网亚洲精品| 成人黄色片网站| 92久久精品一区二区| 美女视频黄久久| 国产日韩在线看片| 一级淫片免费看| 精品在线播放免费| 91久久久久久久久久久| 99热这里只有精品1| 精品一区二区三区免费毛片爱 | 亚洲精品一区国产| 精品欧美一区二区久久| 日本美女视频网站| 久久久久高潮毛片免费全部播放| 精品对白一区国产伦| 国产精品入口麻豆| 日韩欧美美女在线观看| 亚洲精品视频在线播放| 国产成人av一区二区三区不卡| 蜜桃一区二区三区| 原创国产精品91| 成人信息集中地| 欧美一区二区三区另类| 久久久久久九九九| 亚洲图片在线视频| 麻豆视频一区二区| 91免费版黄色| 五月激情丁香婷婷| 久久精品综合网| 亚洲一区二区三区四区中文| 久久黄色美女电影| 亚洲sss视频在线视频| 国产日产欧美视频| 国产精品久久久久77777丨| 91精品国产91久久久久久一区二区 | 亚洲女人av| 国产精品第8页| 国产女人爽到高潮a毛片| 国产成人在线免费| 欧美久久久久久久| 国产精品久久麻豆| 欧美日韩在线免费观看| 污污网站免费观看| av自拍一区| 中文字幕亚洲欧美| 国产污片在线观看| 免费在线观看视频一区| 99re在线视频观看| 国产免费a∨片在线观看不卡| 亚洲图片激情小说| 久久无码高潮喷水| 日本一区精品视频| 国产亚洲xxx| 国产在线一二区| 秋霞av亚洲一区二区三| 国产精品免费一区二区三区| 成年人视频免费在线观看| 尤物av一区二区| 999精品网站| jizz性欧美23| 在线中文字幕日韩| 精品少妇一二三区| 激情图片小说一区| 欧美精品亚洲精品| 538视频在线| 91精品综合久久久久久| 伊人网伊人影院| 在线播放不卡| 91精品久久香蕉国产线看观看| a毛片在线免费观看| 久久久久亚洲蜜桃| 久久久999免费视频| 欧美成人精品午夜一区二区| 中文字幕在线亚洲| 无码人妻一区二区三区免费 | 老牛影视av老牛影视av| 欧美精品综合| 91在线观看免费| 97视频精彩视频在线观看| 欧美日韩亚洲天堂| 国产人妻黑人一区二区三区| 欧美一区高清| 91在线观看免费高清| 中国日本在线视频中文字幕| 色综合久久中文字幕综合网| 国产一级伦理片| 亚洲啪啪91| 99re在线国产| 牛牛精品视频在线| 精品免费国产二区三区 | 超碰97在线免费观看| 欧美日韩亚洲一区二区| 国产真实乱人偷精品| 黄色亚洲免费| 国产精品乱码| 激情av在线| 亚洲成人久久一区| 日韩欧美性视频| av成人免费在线观看| 久草免费福利在线| 国产亚洲精品美女久久| 97久久精品人人澡人人爽缅北| 丰满大乳国产精品| 亚洲成人精品一区| 一区二区不卡免费视频| 西西人体一区二区| 日韩三级电影| 欧美黄色a视频| 久久这里有精品视频| 国产jzjzjz丝袜老师水多| 亚洲综合丁香婷婷六月香| 国产一精品一aⅴ一免费| 黄色综合网站| 久久99久久精品国产| 日韩免费福利视频| 一本色道久久88精品综合| 中文字幕在线视频第一页| 亚洲日本va在线观看| 香蕉视频在线观看黄| 日韩午夜高潮| 日韩av影视| 成人影院网站ww555久久精品| 九九九热精品免费视频观看网站| 亚洲精品无码久久久| 欧美日韩综合视频| 国产7777777| 国产精品一区二区无线| 9久久9毛片又大又硬又粗| 免费欧美一区| 亚洲sss综合天堂久久| 2020日本在线视频中文字幕| 亚洲社区在线观看| 国产视频aaa| 日韩欧美有码在线| 国产高清视频免费在线观看| 成人国产免费视频| 日韩av手机版| 亚洲午夜在线| 日韩视频在线播放| 亚洲精品一区在线| 国产精品露脸自拍| 久久不射影院| 中文字幕亚洲综合久久筱田步美| 亚洲av无码国产精品永久一区 | 亚洲天堂视频网| 亚洲图片欧美综合| 欧美老女人性生活视频| 盗摄精品av一区二区三区| 午夜欧美福利视频| 伊人久久大香线蕉综合热线 | 国产精品无码在线| 紧缚奴在线一区二区三区| 99精品在线免费视频| 亚洲精品小说| 欧洲在线视频一区| 成人资源在线| 91精品美女在线| 中文字幕一区久| 欧美激情精品久久久久久免费印度| 精品视频三区| 亚洲级视频在线观看免费1级| 亚洲一区在线观| 色婷婷综合久久久久中文| 久久久久无码国产精品不卡| 中文字幕+乱码+中文字幕一区| 亚洲av成人无码一二三在线观看| 久久99热狠狠色一区二区| 红桃av在线播放| 亚洲午夜电影| 日韩黄色片在线| 888久久久| 日韩欧美一区二区三区四区| 日本亚洲不卡| 国产精品成人一区二区三区| 中文成人在线| 国产一区视频在线| 日本黄色一区| 国产精品都在这里| 久久久久久久| 青草热久免费精品视频| 2019中文字幕在线电影免费| 久久6免费高清热精品| 黄色大片在线播放| 色噜噜亚洲精品中文字幕| 国产黄色在线播放| 亚洲欧美在线免费| 青青草超碰在线| 精品中文视频在线| 欧美扣逼视频| 亚洲人在线观看| 国产在线一二三区| 国产亚洲精品91在线| 国产高清在线观看| 亚洲日本成人女熟在线观看| 美女做暖暖视频免费在线观看全部网址91| 亚洲精品成a人在线观看| 欧美一级免费片| 亚洲国产97在线精品一区| 日本精品一二区| 亚洲第一色中文字幕| 天天爱天天干天天操| 亚洲精品一区二区三区在线观看| 免费成人在线看| 日韩电影大全免费观看2023年上| 性xxxx视频播放免费| 亚洲国产成人精品久久| 天堂网www中文在线| 亚洲天堂一区二区三区| 91露出在线| 久久福利网址导航| 24小时免费看片在线观看| 欧美与欧洲交xxxx免费观看 | 91传媒视频在线观看| 亚洲不卡视频| 狠狠色噜噜狠狠狠狠色吗综合| 日日天天久久| 亚洲欧美国产精品桃花| 99热在线成人| 99在线免费视频观看| 亚洲综合电影一区二区三区| 欧美 日韩 国产 激情| 韩国三级在线一区| 中国黄色片视频| 久久久久久久久蜜桃| 91免费在线看片| 一级做a爱片久久| 精品人妻一区二区三区免费看| 欧美专区日韩专区| 精品国产九九九| 亚洲欧美日韩视频一区| 四虎久久免费| 国产69精品久久久久99| 影音成人av| 国产 高清 精品 在线 a| 在线亚洲a色| 穿情趣内衣被c到高潮视频| 国产亚洲网站| 网站在线你懂的| 91在线观看地址| 乱h高h女3p含苞待放| 精品福利视频导航| 91国产精品一区| 亚洲精品少妇网址| 18在线观看的| 国产成人一区二| 粉嫩的18在线观看极品精品| 日本一区二区三区视频在线播放| 欧美一区不卡| 中文字幕网av| 91麻豆国产自产在线观看| 国产精品国产三级国产传播| 欧美日韩在线视频一区| 999免费视频| 在线成人免费网站| 乱馆动漫1~6集在线观看| 91欧美日韩一区| 精品国产一区二区三区小蝌蚪| www.好吊操| 精品在线亚洲视频| 天天干天天操天天拍| 黄色成人在线播放| 午夜精品在线播放| 日韩中文字幕精品视频| 在线黄色的网站| 精品国产乱码久久久久久蜜柚| 国产精品毛片久久| www.涩涩涩| 久久久久久久久99精品| 日韩av在线播放观看| 正在播放一区二区| 午夜视频在线观看网站| 奇米一区二区三区四区久久| 大香伊人久久精品一区二区| 法国空姐在线观看免费| 蜜臀av性久久久久蜜臀aⅴ四虎 | 你懂的一区二区三区| 日本男女交配视频| 国产一区二区三区精品欧美日韩一区二区三区| 四虎国产精品成人免费入口| 欧美日韩国产中字| 色呦呦视频在线| 久久免费视频网| 99a精品视频在线观看| 午夜久久久久久久久久久| 国产美女在线精品| 情侣偷拍对白清晰饥渴难耐| 欧美日韩一区不卡| se在线电影| 国产精品视频免费在线观看| 五月国产精品| 狠狠爱免费视频| 国产香蕉久久| 精品中文字幕视频| 中文字幕日本一区| 国产大尺度在线观看| 精品中文av资源站在线观看| 无码人妻精品中文字幕| 777午夜精品视频在线播放| 久久国产精品一区| 亚洲综合日韩在线| 国产精品99免费看| 久久久久亚洲无码| 亚洲成av人片| 色久视频在线播放| 国产精品白嫩美女在线观看| 精品国产精品国产偷麻豆| 男女爽爽爽视频| 日韩一区在线免费观看| 国产精品伊人久久| 欧美激情视频一区二区三区不卡| 99久久香蕉| 无码精品国产一区二区三区免费| 国产性天天综合网| 亚洲综合精品在线| 欧美福利视频网站| 欧美色图五月天| 黄色三级视频在线| 亚洲日本在线观看| 午夜黄色小视频| 国产精品久久久久久久久影视| 久久在线视频| aaa黄色大片| 91国内精品野花午夜精品| 午夜免费福利在线观看| 99电影网电视剧在线观看| 国产精品试看| 黄色裸体一级片| 亚洲成人在线视频播放| 成人小电影网站| 在线观看三级网站| 97精品久久久久中文字幕| 中文字幕人妻一区二区三区视频| 欧美成人精品h版在线观看| 欧美巨大xxxx| 国产成年人视频网站| 亚洲高清不卡在线观看| 国产黄色在线播放| 鬼打鬼之黄金道士1992林正英| 全国精品久久少妇| 久久国产精品波多野结衣| 亚洲午夜未满十八勿入免费观看全集| 97色婷婷成人综合在线观看| 免费国产黄色网址| 日韩一区在线播放| 国产中文字幕在线观看| 国产精品久久精品国产| 久久9热精品视频| 国产一级一级国产| 欧美精品激情在线观看|