国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Redis的雙向鏈表一文全知道

存儲(chǔ) 存儲(chǔ)軟件 Redis
在Redis中鏈表List的應(yīng)用非常廣泛,但是Redis是采用C語(yǔ)言來(lái)寫,底層采用雙向鏈表實(shí)現(xiàn)(這邊提一嘴,如果是科班出身或者大學(xué)有學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu)的同學(xué),可以劃走啦)。我們今天的重點(diǎn)就是雙向鏈表。

 

[[331862]]

本文轉(zhuǎn)載自微信公眾號(hào)「學(xué)習(xí)Java的小姐姐」,作者學(xué)習(xí)Java的小姐姐0618 。轉(zhuǎn)載本文請(qǐng)聯(lián)系學(xué)習(xí)Java的小姐姐公眾號(hào)。

前言

hello,又見(jiàn)面了。不要問(wèn)為什么,問(wèn)就是勤勞。馬上要開啟爆更模式啦。

在Redis中鏈表List的應(yīng)用非常廣泛,但是Redis是采用C語(yǔ)言來(lái)寫,底層采用雙向鏈表實(shí)現(xiàn)(這邊提一嘴,如果是科班出身或者大學(xué)有學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu)的同學(xué),可以劃走啦)。我們今天的重點(diǎn)就是雙向鏈表。

 

API使用

先來(lái)使用一下API。如果之前有用過(guò)的同學(xué),可以直接跳到下一小節(jié)。

lpush左側(cè)插入數(shù)據(jù)

使用lpush命令往list的左側(cè)中插入a,b,c三個(gè)字符,這邊注意順序,查詢出來(lái)的是c,b,a。下面會(huì)說(shuō)為什么,先挖個(gè)坑。

 

rpush右側(cè)插入數(shù)據(jù)

使用rpush命令往list中插入d,e兩個(gè)字符,查詢出來(lái)的順序是和我們想的一樣,最后兩位是d,e。

 

刪除某個(gè)數(shù)據(jù)

使用lrem命令刪除a字符,那么中間1代表什么意思呢?其為count,表示移除列表中與a相等的元素個(gè)數(shù)。即如果count>0,表示從表頭開始向表尾搜索,移除count個(gè)與a相等的元素。如果count<0,表示從表尾開始向表頭搜索,移除count個(gè)與a相等的元素。如果count=0,移除所有與a相等的元素,因?yàn)槭且瞥?,所以不管從表頭還是表尾,結(jié)果是一樣的。

 

修改某個(gè)數(shù)據(jù)

使用lset命令將mylist的下標(biāo)為1的元素修改為dd,原來(lái)list為c ,b,d,e,修改后的結(jié)果為c,dd,d,e。

 

具體邏輯圖

這邊看不懂沒(méi)關(guān)系,下面會(huì)針對(duì)每個(gè)模塊詳細(xì)說(shuō)明。

 

雙向鏈表的定義

節(jié)點(diǎn)ListNode

包括頭指針prev,尾指針next,當(dāng)前的值value,如下圖所示。每個(gè)節(jié)點(diǎn)都有兩個(gè)指針,既能從表頭根據(jù)尾指針找到表尾,又能從表尾根據(jù)頭指針prev找到表頭,如果將他們連起來(lái),就構(gòu)成了雙向鏈表。

 

具體代碼如下:

  1. //定義鏈表節(jié)點(diǎn)的結(jié)構(gòu)體  
  2. typedef struct listNode { 
  3.     //前面一個(gè)節(jié)點(diǎn)的指針  
  4.     struct listNode *prev; 
  5.     //后面一個(gè)節(jié)點(diǎn)的指針  
  6.     struct listNode *next
  7.     //當(dāng)前節(jié)點(diǎn)的值的指針 ,因?yàn)橹档念愋筒淮_定  
  8.     void *value; 
  9. } listNode; 

整體架構(gòu)

包括頭指針head,尾指針tail,整個(gè)鏈表長(zhǎng)度len,一些函數(shù)(個(gè)人認(rèn)為不重要,如果有知道的小伙伴歡迎評(píng)論),如下圖所示。頭指針head指向整個(gè)鏈表的第一個(gè)節(jié)點(diǎn),尾指針tail指向整個(gè)鏈表的最后一個(gè)節(jié)點(diǎn)。

 

具體代碼如下:

  1. //定義鏈表,對(duì)鏈表節(jié)點(diǎn)的再封裝 
  2. typedef struct list { 
  3.     listNode *head;//頭指針 
  4.     listNode *tail;//尾指針 
  5.     void *(*dup)(void *ptr);//節(jié)點(diǎn)拷貝函數(shù) 
  6.     void (*free)(void *ptr);//釋放節(jié)點(diǎn)值函數(shù) 
  7.     int (*match)(void *ptr, void *key);//判斷兩個(gè)節(jié)點(diǎn)是否相等函數(shù) 
  8.     unsigned long len;//鏈表長(zhǎng)度 
  9. } list; 

雙向鏈表的實(shí)現(xiàn)

創(chuàng)建表頭

我們創(chuàng)建list表結(jié)構(gòu),首先需要判斷當(dāng)前是否有可分配的空間來(lái)創(chuàng)建,使用zmalloc方法來(lái)分配空間,如果分配不了,則返回NULL,如果可以分配,則繼續(xù)。接著賦值list的頭節(jié)點(diǎn)head和尾節(jié)點(diǎn)tail為NULL,len為0,賦值相關(guān)函數(shù)為NULL。最后返回結(jié)果list。

  1. //創(chuàng)建一個(gè)表頭,返回值是鏈表結(jié)構(gòu)的指針 
  2. list *listCreate(void) 
  3.     struct list *list; 
  4.     //嘗試分配空間 
  5.     if ((list = zmalloc(sizeof(*list))) == NULL
  6.         return NULL
  7.     //相關(guān)屬性賦值 
  8.     list->head = list->tail = NULL
  9.     list->len = 0; 
  10.     list->dup = NULL
  11.     list->free = NULL
  12.     list->match = NULL
  13.     //最終結(jié)果返回 
  14.     return list; 

清空表

傳入list的指針,首先定義當(dāng)前節(jié)點(diǎn)current,使其指向頭指針,定義len,使其等于list的長(zhǎng)度。接著進(jìn)行循環(huán),每次len減一,定義新節(jié)點(diǎn)next,始終指向當(dāng)前節(jié)點(diǎn)current的下一個(gè)節(jié)點(diǎn),如果有值,則釋放該節(jié)點(diǎn),當(dāng)前節(jié)點(diǎn)current后移,next節(jié)點(diǎn)同樣后移。直到len為0,釋放完所有節(jié)點(diǎn),退出循環(huán)。最后賦值list的頭節(jié)點(diǎn)head和尾節(jié)點(diǎn)tail為NULL,len為0。

注意:這邊和SDS一樣,清空并不是直接刪除list,而是刪除其數(shù)據(jù),外層的list結(jié)構(gòu)仍然存在。這其實(shí)上是惰性刪除。

  1. void listEmpty(list *list) 
  2.     unsigned long len; 
  3.     //定義兩個(gè)節(jié)點(diǎn)指針currentnext 
  4.     listNode *current, *next
  5.     //當(dāng)前節(jié)點(diǎn)指針current指向list的頭節(jié)點(diǎn)位置,即list的第一個(gè)數(shù)據(jù) 
  6.     current = list->head; 
  7.     //len為list的長(zhǎng)度 
  8.     len = list->len; 
  9.     //開始循環(huán),每次len減1 
  10.     while(len--) { 
  11.         //先讓下一個(gè)指針指向下一個(gè)節(jié)點(diǎn),因?yàn)榈紫轮苯俞尫女?dāng)前節(jié)點(diǎn),如果不在此處復(fù)制,底下就獲取不到了 
  12.         next = current->next
  13.         //釋放當(dāng)前節(jié)點(diǎn)的值 
  14.         if (list->free) list->free(current->value); 
  15.         //釋放當(dāng)前節(jié)點(diǎn) 
  16.         zfree(current); 
  17.         //當(dāng)前節(jié)點(diǎn)等于剛才的下一個(gè)節(jié)點(diǎn)next,即開始往后移,開始下一輪循環(huán) 
  18.         current = next
  19.     } 
  20.     //釋放完給頭指針head,尾指針tail賦值為NULL 
  21.     list->head = list->tail = NULL
  22.     //len賦值0 
  23.     list->len = 0; 

添加元素到表頭

添加元素到表頭,首先新建一個(gè)新節(jié)點(diǎn)node,判斷是否有內(nèi)存分配,如果有,則繼續(xù),如果沒(méi)有,則返回NULL,退出方法。這邊新節(jié)點(diǎn)是用來(lái)存在輸入?yún)?shù)中的value的,所以需要內(nèi)存。接著將新節(jié)點(diǎn)node的value值賦值為輸入?yún)?shù)value。最后需要調(diào)整list的頭指針,尾指針,原來(lái)第一個(gè)節(jié)點(diǎn)的指針情況(這邊看下圖,描述起來(lái)有點(diǎn)混亂,圖片一目了然)。最最后,就是list的len加1,返回list。

舉個(gè)例子,如果要在list中插入節(jié)點(diǎn)f,首先將節(jié)點(diǎn)的頭指針賦值為空(對(duì)應(yīng)步驟1),然后將新節(jié)點(diǎn)的尾指針next指向第一個(gè)節(jié)點(diǎn)(對(duì)應(yīng)步驟2),將第一個(gè)節(jié)點(diǎn)的prev指向新節(jié)點(diǎn)(對(duì)應(yīng)步驟3),最后將list的頭指針head指向新節(jié)點(diǎn)(對(duì)應(yīng)步驟4)。這邊需要注意的是,步驟2和步驟3需要在步驟4前面,不然會(huì)找到第一個(gè)節(jié)點(diǎn)。

 

具體代碼如下:

  1. //添加一個(gè)元素到表頭 
  2. list *listAddNodeHead(list *list, void *value) 
  3.     listNode *node; 
  4.  
  5.     if ((node = zmalloc(sizeof(*node))) == NULL
  6.         return NULL
  7.     node->value = value;//為當(dāng)前節(jié)點(diǎn)賦值 
  8.     //如果當(dāng)前l(fā)ist為空 
  9.     if (list->len == 0) { 
  10.         list->head = list->tail = node;//頭尾指針都指向該節(jié)點(diǎn) 
  11.         node->prev = node->next = NULL;//當(dāng)前節(jié)點(diǎn)的頭尾指針都為null 
  12.     } else {//如果當(dāng)前l(fā)ist不為空 
  13.         node->prev = NULL;//新節(jié)點(diǎn)的頭指針為null 
  14.         node->next = list->head;//新節(jié)點(diǎn)的尾指針指向原來(lái)的尾指針 
  15.         list->head->prev = node;//原來(lái)的第一個(gè)節(jié)點(diǎn)的頭指針指向新節(jié)點(diǎn) 
  16.         list->head = node;//鏈表的頭指針指向新節(jié)點(diǎn) 
  17.     } 
  18.     list->len++;//list長(zhǎng)度+1 
  19.     return list; 

添加元素到表尾

添加元素到表尾,首先新建一個(gè)新節(jié)點(diǎn)node,判斷是否有內(nèi)存分配,如果有,則繼續(xù),如果沒(méi)有,則返回NULL,退出方法。這邊新節(jié)點(diǎn)是用來(lái)存在輸入?yún)?shù)中的value的,所以需要內(nèi)存。接著將新節(jié)點(diǎn)node的value值賦值為輸入?yún)?shù)value。最后需要調(diào)整list的頭指針,尾指針,原來(lái)最后一個(gè)節(jié)點(diǎn)的指針情況(這邊看下圖,描述起來(lái)有點(diǎn)混亂,圖片一目了然)。最最后,就是list的len加1,返回list。

舉個(gè)例子,如果要在list中插入節(jié)點(diǎn)f,首先將節(jié)點(diǎn)的尾指針賦值為空(對(duì)應(yīng)步驟1),然后將新節(jié)點(diǎn)的頭指針指向最后一個(gè)節(jié)點(diǎn)(對(duì)應(yīng)步驟2),將最后一個(gè)節(jié)點(diǎn)的next指向新節(jié)點(diǎn)(對(duì)應(yīng)步驟3),最后將list的尾指針tail指向新節(jié)點(diǎn)(對(duì)應(yīng)步驟4)。

 

步驟如下:

  1. //添加元素到表尾 
  2. list *listAddNodeTail(list *list, void *value) 
  3.     //新建節(jié)點(diǎn)node 
  4.     listNode *node; 
  5.     //嘗試分配內(nèi)存 
  6.     if ((node = zmalloc(sizeof(*node))) == NULL
  7.         return NULL
  8.     //為新節(jié)點(diǎn)node賦值 
  9.     node->value = value; 
  10.     //調(diào)整指針 
  11.     if (list->len == 0) { 
  12.         list->head = list->tail = node; 
  13.         node->prev = node->next = NULL
  14.     } else { 
  15.         node->prev = list->tail; 
  16.         node->next = NULL
  17.         list->tail->next = node; 
  18.         list->tail = node; 
  19.     } 
  20.     //len加1 
  21.     list->len++; 
  22.     return list; 

插入

為list的某個(gè)節(jié)點(diǎn)old_node的after(大于0為前面新增,小于0為后面新增)新增新值value,首先新建一個(gè)新節(jié)點(diǎn)node,判斷是否有內(nèi)存分配,如果有,則繼續(xù),如果沒(méi)有,則返回NULL,退出方法。這邊新節(jié)點(diǎn)是用來(lái)存在輸入?yún)?shù)中的value的,所以需要內(nèi)存。接著根據(jù)after的值確定是在節(jié)點(diǎn)old_node的前面新增數(shù)據(jù),還是在節(jié)點(diǎn)old_node的后面新增數(shù)據(jù),具體的是指針的調(diào)整。最后len加1,返回list。

  1. //在list的某個(gè)位置old_node的after(前后)插入value值 
  2. list *listInsertNode(list *list, listNode *old_node, void *value, int after) { 
  3.     listNode *node; 
  4.  
  5.     if ((node = zmalloc(sizeof(*node))) == NULL
  6.         return NULL
  7.     node->value = value; 
  8.     if (after) {//大于0 
  9.         node->prev = old_node; 
  10.         node->next = old_node->next
  11.         if (list->tail == old_node) { 
  12.             list->tail = node; 
  13.         } 
  14.     } else {//小于0 
  15.         node->next = old_node; 
  16.         node->prev = old_node->prev; 
  17.         if (list->head == old_node) { 
  18.             list->head = node; 
  19.         } 
  20.     } 
  21.     if (node->prev != NULL) { 
  22.         node->prev->next = node; 
  23.     } 
  24.     if (node->next != NULL) { 
  25.         node->next->prev = node; 
  26.     } 
  27.     list->len++; 
  28.     return list; 

刪除

從list中刪除節(jié)點(diǎn)node,如果該節(jié)點(diǎn)的前面存在節(jié)點(diǎn),使其前面一個(gè)節(jié)點(diǎn)的next指針指向node后面一個(gè)節(jié)點(diǎn)的地址,其實(shí)就是跳過(guò)了node節(jié)點(diǎn),如果該節(jié)點(diǎn)的前面不存在節(jié)點(diǎn),則將list的頭指針指向node的下一節(jié)點(diǎn)地址。同樣的,如果該節(jié)點(diǎn)的后面存在節(jié)點(diǎn),邏輯一樣的。最后釋放要?jiǎng)h除的節(jié)點(diǎn)node內(nèi)存,len減1。

  1. //從鏈表list中刪除某個(gè)節(jié)點(diǎn)node 
  2. void listDelNode(list *list, listNode *node) 
  3.     //如果該節(jié)點(diǎn)的前面存在節(jié)點(diǎn) 
  4.     if (node->prev) 
  5.         node->prev->next = node->next
  6.     else 
  7.         list->head = node->next
  8.     //如果該節(jié)點(diǎn)的前面存在節(jié)點(diǎn) 
  9.    if (node->next
  10.         node->next->prev = node->prev; 
  11.     else 
  12.         list->tail = node->prev; 
  13.     //釋放當(dāng)前節(jié)點(diǎn)node的值 
  14.     if (list->free) list->free(node->value); 
  15.     //釋放內(nèi)存 
  16.     zfree(node); 
  17.      //len-1 
  18.     list->len--; 

總結(jié)

該篇主要講了Redis的list數(shù)據(jù)類型的底層實(shí)現(xiàn)雙向鏈表adlist,先從list的一些API使用,引出雙向鏈表數(shù)據(jù)結(jié)構(gòu),進(jìn)而結(jié)合源碼對(duì)雙向鏈表進(jìn)行描述,包括節(jié)點(diǎn)listNode和list的頭指針和尾指針,最后針對(duì)list的往表頭插入元素,往表尾插入元素,刪除,修改等方法進(jìn)行源碼解析,使其對(duì)雙向鏈表有更清晰的認(rèn)識(shí)。

 

如果覺(jué)得寫得還行,麻煩給個(gè)贊👍,您的認(rèn)可才是我寫作的動(dòng)力!

 

責(zé)任編輯:武曉燕 來(lái)源: 學(xué)習(xí)Java的小姐姐
相關(guān)推薦

2024-04-26 00:02:00

Rust語(yǔ)言LinkedList

2022-03-24 08:51:48

Redis互聯(lián)網(wǎng)NoSQL

2022-04-07 08:37:05

鏈表技巧單鏈表

2022-12-20 07:39:46

2022-03-13 18:27:09

Redis數(shù)據(jù)庫(kù)開源

2023-12-26 07:33:45

Redis持久化COW

2019-07-21 09:17:11

數(shù)據(jù)緩存架構(gòu)

2020-02-07 11:07:53

數(shù)組鏈表單鏈表

2025-04-07 08:20:00

ORMPython代碼

2023-02-26 00:00:04

項(xiàng)目標(biāo)簽體系

2021-01-06 05:31:13

線性表鏈表數(shù)據(jù)

2024-08-19 13:46:00

2020-05-13 17:12:21

大數(shù)據(jù)分布式引擎

2020-11-10 10:26:16

串口打印工具

2020-05-20 22:37:42

HTTPSSSL雙向驗(yàn)證

2019-09-27 08:53:47

Redis數(shù)據(jù)C語(yǔ)言

2020-01-22 16:50:32

區(qū)塊鏈技術(shù)智能

2021-09-17 13:34:57

大數(shù)據(jù)Redis 應(yīng)用

2024-05-30 08:05:17

2024-04-28 08:14:29

C#隊(duì)列Queue
點(diǎn)贊
收藏

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

免费午夜视频在线观看| 欧美精品久久久久久久久久丰满| 亚洲视频在线观看免费| 国产精品欧美一区二区| 黄色一级在线视频| 国精产品一区| 欧美残忍xxxx极端| 韩国成人在线| 天堂久久久久va久久久久| 欧美日韩亚洲国产一区| 欧美激情精品久久久久久久变态| 亚洲一二三区精品| 成人h小游戏| 欧美激情无毛| 激情成人中文字幕| 国产精品1234| 波多野结衣在线中文| 久久人体av| 99精品欧美一区二区蜜桃免费 | 99热在线精品观看| 午夜精品aaa| 国产日韩在线播放| 午夜影院在线观看视频| 国产videos久久| 一区二区三区不卡视频在线观看| 久久中文字幕国产| 人妻熟女一二三区夜夜爱| 57pao成人永久免费| 高清国产一区二区三区| 亚洲奶大毛多的老太婆| 在线观看18视频网站| 欧美黑人巨大xxxxx| 久久影院午夜片一区| 久久97久久97精品免视看| 午夜免费看视频| 欧美电影免费| 51午夜精品视频| 中文字幕一区二区三区免费视频| 精品视频网站| 色丁香久综合在线久综合在线观看| 91美女片黄在线观看游戏| 在线观看av网| 国产精品日韩| 精品视频久久久久久| 六月丁香婷婷激情| 亚洲区小说区| 91国偷自产一区二区开放时间 | 色综合天天狠狠| 国产综合动作在线观看| 91精品久久| 国产超碰在线一区| 一级全黄肉体裸体全过程| 国产午夜久久av| 亚洲黄色av一区| 国产精品久久久久久久久久直播| heyzo高清中文字幕在线| 成人午夜精品在线| 欧美在线视频导航| 成人高清免费观看mv| 色综合天天在线| 国产爆初菊在线观看免费视频网站| 日韩综合小视频| 色综合久久久久久中文网| 国产在线视频欧美一区| 中文字幕欧美激情一区| 国产欧美在线观看| 亚洲综合色站| 一本大道久久加勒比香蕉| 理论视频在线观看| 免费精品视频| 欧美日韩国产va另类| 国产劲爆久久| 精品乱人伦小说| 天天色综合4| 在线视频精品| 日本一区高清不卡| 国产亚洲一区| 91在线国产电影| 久久婷婷久久| 久久久久久久午夜| 免费日韩av| 99久久久精品视频| 雨宫琴音一区二区在线| 美女av一区二区三区 | 久久福利一区| 高清亚洲成在人网站天堂| 91高清在线| 久久综合国产精品| 午夜免费性福利| 国产乱子轮精品视频| 成人免费淫片视频软件| 欧洲成人一区| 91精品成人久久| 伊人久久精品一区二区三区| 午夜伊人狠狠久久| 制服丝袜中文字幕在线| 久久久av网站| 欧美激情二区| 亚洲欧美日韩在线播放| 偷拍盗摄高潮叫床对白清晰| 久久久一区二区三区捆绑**| 精品网站在线看| 国产日产一区| 久久一区二区三区av| jizzjizz欧美69巨大| 色婷婷精品国产一区二区三区| 66视频精品| 午夜精品一区二区三区av| 丁香花在线电影| 色噜噜夜夜夜综合网| 亚洲人体视频| 国产一区二中文字幕在线看| 精品一区二区三区久久久| caoporn国产精品免费公开| 极品尤物一区| 亚洲人成在线播放| 成人激情电影在线| 国内伊人久久久久久网站视频| 激情综合在线| 熟妇人妻无乱码中文字幕真矢织江| 国产精品一区免费在线观看| 992tv在线影院| 亚洲美女偷拍久久| 中文字幕在线导航| 91亚洲国产成人精品一区二三 | 欧美成熟毛茸茸复古| 我不卡影院28| 亚洲最大av网站| 九九99久久精品在免费线bt| 97av自拍| 亚洲黄网站在线观看| 日韩免费大片| 久久久久久久久电影| 国产激情一区| 日韩欧美99| 91高清视频在线| 四虎5151久久欧美毛片| 国产成人中文字幕| 99v久久综合狠狠综合久久| 麻豆传媒在线完整视频| 国产精品国产三级国产aⅴ浪潮 | 国产区日韩欧美| 亚洲亚洲人成综合网络| 污黄色在线观看| 97成人超碰免| 国产人成亚洲第一网站在线播放| 欧洲熟妇精品视频| 亚洲午夜小视频| 高清久久精品| 中文字幕在线亚洲三区| 国产激情视频一区二区三区欧美 | 成人av电影在线| 国产成人无码av在线播放dvd| 亚洲成人黄色在线观看| 妞干网免费在线视频| 亚洲人成在线观看| 美女一区二区久久| www.国产区| 日韩在线观看免费全集电视剧网站 | 亚洲深夜福利网站| 久草在线在线精品观看| 亚洲第一图区| 一区二区三区黄色| 久久99精品一区二区三区| 蜜芽在线免费观看| 久久av免费观看| 国产一区二区三区四区五区美女 | aa在线观看视频| 一区二区三区国产视频| 国产成人午夜片在线观看高清观看| av影视在线| 女人被男人躁得好爽免费视频 | 亚洲一级电影| 国产中文字幕在线播放| 亚洲毛片在线看| 蜜桃视频一区二区三区在线观看| 美洲精品一卡2卡三卡4卡四卡| 欧美成人免费观看| 国产亚洲欧美日韩在线一区| 色吊丝在线永久观看最新版本| 欧美mv日韩mv亚洲| 美女免费视频一区| 特黄特黄的视频| 亚洲一区二区中文| 91精品国产欧美一区二区成人| 亚洲综合影院| 欧美日韩一区在线播放| 亚洲精品久久久久久久久久久久久 | 韩国精品一区| 欧美中文在线视频| 亚洲国产综合91精品麻豆| 天天射综合网视频| 天天干在线视频论坛| 国产在线xxxx| 国产69精品久久久久久| 在线视频国内自拍亚洲视频| 国产一区二区高清在线| 波多野吉衣av| 日本成人三级电影网站| 午夜精品国产更新|