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

一口氣搞懂 Go Sync.Map 所有知識點

開發 后端
有了選擇,總是有選擇困難癥的,這兩種到底怎么選,誰的性能更加的好?我有一個朋友說 標準庫 sync.Map 性能菜的很,不要用。我到底聽誰的...

 [[400078]]

本文轉載自微信公眾號「腦子進煎魚了」,作者陳煎魚。轉載本文請聯系腦子進煎魚了公眾號。

大家好,我是煎魚。

在之前的 《為什么 Go map 和 slice 是非線程安全的?》 文章中,我們討論了 Go 語言的 map 和 slice 非線程安全的問題,基于此引申出了 map 的兩種目前在業界使用的最多的并發支持的模式。

分別是:

  • 原生 map + 互斥鎖或讀寫鎖 mutex。
  • 標準庫 sync.Map(Go1.9及以后)。

有了選擇,總是有選擇困難癥的,這兩種到底怎么選,誰的性能更加的好?我有一個朋友說 標準庫 sync.Map 性能菜的很,不要用。我到底聽誰的...

今天煎魚就帶你揭秘 Go sync.map,我們先會了解清楚什么場景下,Go map 的多種類型怎么用,誰的性能最好!

接著根據各 map 性能分析的結果,針對性的對 sync.map 進行源碼解剖,了解 WHY。

一起愉快地開始吸魚之路。

sync.Map 優勢

在 Go 官方文檔中明確指出 Map 類型的一些建議:

  • 多個 goroutine 的并發使用是安全的,不需要額外的鎖定或協調控制。
  • 大多數代碼應該使用原生的 map,而不是單獨的鎖定或協調控制,以獲得更好的類型安全性和維護性。

同時 Map 類型,還針對以下場景進行了性能優化:

  • 當一個給定的鍵的條目只被寫入一次但被多次讀取時。例如在僅會增長的緩存中,就會有這種業務場景。
  • 當多個 goroutines 讀取、寫入和覆蓋不相干的鍵集合的條目時。

這兩種情況與 Go map 搭配單獨的 Mutex 或 RWMutex 相比較,使用 Map 類型可以大大減少鎖的爭奪。

性能測試

聽官方文檔介紹了一堆好處后,他并沒有講到缺點,所說的性能優化后的優勢又是否真實可信。我們一起來驗證一下。

首先我們定義基本的數據結構:

  1. // 代表互斥鎖 
  2. type FooMap struct { 
  3.  sync.Mutex 
  4.  data map[int]int 
  5.  
  6. // 代表讀寫鎖 
  7. type BarRwMap struct { 
  8.  sync.RWMutex 
  9.  data map[int]int 
  10.  
  11. var fooMap *FooMap 
  12. var barRwMap *BarRwMap 
  13. var syncMap *sync.Map 
  14.  
  15. // 初始化基本數據結構 
  16. func init() { 
  17.  fooMap = &FooMap{data: make(map[int]int, 100)} 
  18.  barRwMap = &BarRwMap{data: make(map[int]int, 100)} 
  19.  syncMap = &sync.Map{} 

在配套方法上,常見的增刪改查動作我們都編寫了相應的方法。用于后續的壓測(只展示部分代碼):

  1. func builtinRwMapStore(k, v int) { 
  2.  barRwMap.Lock() 
  3.  defer barRwMap.Unlock() 
  4.  barRwMap.data[k] = v 
  5.  
  6. func builtinRwMapLookup(k intint { 
  7.  barRwMap.RLock() 
  8.  defer barRwMap.RUnlock() 
  9.  if v, ok := barRwMap.data[k]; !ok { 
  10.   return -1 
  11.  } else { 
  12.   return v 
  13.  } 
  14.  
  15. func builtinRwMapDelete(k int) { 
  16.  barRwMap.Lock() 
  17.  defer barRwMap.Unlock() 
  18.  if _, ok := barRwMap.data[k]; !ok { 
  19.   return 
  20.  } else { 
  21.   delete(barRwMap.data, k) 
  22.  } 

其余的類型方法基本類似,考慮重復篇幅問題因此就不在此展示了。

壓測方法基本代碼如下:

  1. func BenchmarkBuiltinRwMapDeleteParalell(b *testing.B) { 
  2.  b.RunParallel(func(pb *testing.PB) { 
  3.   r := rand.New(rand.NewSource(time.Now().Unix())) 
  4.   for pb.Next() { 
  5.    k := r.Intn(100000000) 
  6.    builtinRwMapDelete(k) 
  7.   } 
  8.  }) 

這塊主要就是增刪改查的代碼和壓測方法的準備,壓測代碼直接復用的是大白大佬的 go19-examples/benchmark-for-map 項目。

也可以使用 Go 官方提供的 map_bench_test.go,有興趣的小伙伴可以自己拉下來運行試一下。

壓測結果

1)寫入:

方法名 含義 壓測結果
BenchmarkBuiltinMapStoreParalell-4 map+mutex 寫入元素 237.1 ns/op
BenchmarkSyncMapStoreParalell-4 sync.map 寫入元素 509.3 ns/op
BenchmarkBuiltinRwMapStoreParalell-4 map+rwmutex 寫入元素 207.8 ns/op

在寫入元素上,最慢的是 sync.map 類型,其次是原生 map+互斥鎖(Mutex),最快的是原生 map+讀寫鎖(RwMutex)。

總體的排序(從慢到快)為:SyncMapStore < MapStore < RwMapStore。

2)查找:

方法名 含義 壓測結果
BenchmarkBuiltinMapLookupParalell-4 map+mutex 查找元素 166.7 ns/op
BenchmarkBuiltinRwMapLookupParalell-4 map+rwmutex 查找元素 60.49 ns/op
BenchmarkSyncMapLookupParalell-4 sync.map 查找元素 53.39 ns/op

在查找元素上,最慢的是原生 map+互斥鎖,其次是原生 map+讀寫鎖。最快的是 sync.map 類型。

總體的排序為:MapLookup < RwMapLookup < SyncMapLookup。

3)刪除:

方法名 含義 壓測結果
BenchmarkBuiltinMapDeleteParalell-4 map+mutex 刪除元素 168.3 ns/op
BenchmarkBuiltinRwMapDeleteParalell-4 map+rwmutex 刪除元素 188.5 ns/op
BenchmarkSyncMapDeleteParalell-4 sync.map 刪除元素 41.54 ns/op

在刪除元素上,最慢的是原生 map+讀寫鎖,其次是原生 map+互斥鎖,最快的是 sync.map 類型。

總體的排序為:RwMapDelete < MapDelete < SyncMapDelete。

場景分析

根據上述的壓測結果,我們可以得出 sync.Map 類型:

  • 在讀和刪場景上的性能是最佳的,領先一倍有多。
  • 在寫入場景上的性能非常差,落后原生 map+鎖整整有一倍之多。

因此在實際的業務場景中。假設是讀多寫少的場景,會更建議使用 sync.Map 類型。

但若是那種寫多的場景,例如多 goroutine 批量的循環寫入,那就建議另辟途徑了,性能不忍直視(無性能要求另當別論)。

sync.Map 剖析

清楚如何測試,測試的結果后。我們需要進一步深挖,知其所以然。

為什么 sync.Map 類型的測試結果這么的 “偏科”,為什么讀操作性能這么高,寫操作性能低的可怕,他是怎么設計的?

數據結構

sync.Map 類型的底層數據結構如下:

  1. type Map struct { 
  2.  mu Mutex 
  3.  read atomic.Value // readOnly 
  4.  dirty map[interface{}]*entry 
  5.  misses int 
  6.  
  7. // Map.read 屬性實際存儲的是 readOnly。 
  8. type readOnly struct { 
  9.  m       map[interface{}]*entry 
  10.  amended bool 
  • mu:互斥鎖,用于保護 read 和 dirty。
  • read:只讀數據,支持并發讀取(atomic.Value 類型)。如果涉及到更新操作,則只需要加鎖來保證數據安全。
  • read 實際存儲的是 readOnly 結構體,內部也是一個原生 map,amended 屬性用于標記 read 和 dirty 的數據是否一致。
  • dirty:讀寫數據,是一個原生 map,也就是非線程安全。操作 dirty 需要加鎖來保證數據安全。
  • misses:統計有多少次讀取 read 沒有命中。每次 read 中讀取失敗后,misses 的計數值都會加 1。

在 read 和 dirty 中,都有涉及到的結構體:

  1. type entry struct { 
  2.  p unsafe.Pointer // *interface{} 

其包含一個指針 p, 用于指向用戶存儲的元素(key)所指向的 value 值。

在此建議你必須搞懂 read、dirty、entry,再往下看,食用效果會更佳,后續會圍繞著這幾個概念流轉。

查找過程

劃重點,Map 類型本質上是有兩個 “map”。一個叫 read、一個叫 dirty,長的也差不多:

sync.Map 的 2 個 map

當我們從 sync.Map 類型中讀取數據時,其會先查看 read 中是否包含所需的元素:

  • 若有,則通過 atomic 原子操作讀取數據并返回。
  • 若無,則會判斷 read.readOnly 中的 amended 屬性,他會告訴程序 dirty 是否包含 read.readOnly.m 中沒有的數據;因此若存在,也就是 amended 為 true,將會進一步到 dirty 中查找數據。

sync.Map 的讀操作性能如此之高的原因,就在于存在 read 這一巧妙的設計,其作為一個緩存層,提供了快路徑(fast path)的查找。

同時其結合 amended 屬性,配套解決了每次讀取都涉及鎖的問題,實現了讀這一個使用場景的高性能。

寫入過程

我們直接關注 sync.Map 類型的 Store 方法,該方法的作用是新增或更新一個元素。

源碼如下:

  1. func (m *Map) Store(key, value interface{}) { 
  2.  read, _ := m.read.Load().(readOnly) 
  3.  if e, ok := read.m[key]; ok && e.tryStore(&value) { 
  4.   return 
  5.  } 
  6.   ... 

調用 Load 方法檢查 m.read 中是否存在這個元素。若存在,且沒有被標記為刪除狀態,則嘗試存儲。

若該元素不存在或已經被標記為刪除狀態,則繼續走到下面流程:

  1. func (m *Map) Store(key, value interface{}) { 
  2.  ... 
  3.  m.mu.Lock() 
  4.  read, _ = m.read.Load().(readOnly) 
  5.  if e, ok := read.m[key]; ok { 
  6.   if e.unexpungeLocked() { 
  7.    m.dirty[key] = e 
  8.   } 
  9.   e.storeLocked(&value) 
  10.  } else if e, ok := m.dirty[key]; ok { 
  11.   e.storeLocked(&value) 
  12.  } else { 
  13.   if !read.amended { 
  14.    m.dirtyLocked() 
  15.    m.read.Store(readOnly{m: read.m, amended: true}) 
  16.   } 
  17.   m.dirty[key] = newEntry(value) 
  18.  } 
  19.  m.mu.Unlock() 

由于已經走到了 dirty 的流程,因此開頭就直接調用了 Lock 方法上互斥鎖,保證數據安全,也是凸顯性能變差的第一幕。

其分為以下三個處理分支:

  • 若發現 read 中存在該元素,但已經被標記為已刪除(expunged),則說明 dirty 不等于 nil(dirty 中肯定不存在該元素)。其將會執行如下操作。
    • 將元素狀態從已刪除(expunged)更改為 nil。
    • 將元素插入 dirty 中。
  • 若發現 read 中不存在該元素,但 dirty 中存在該元素,則直接寫入更新 entry 的指向。
  • 若發現 read 和 dirty 都不存在該元素,則從 read 中復制未被標記刪除的數據,并向 dirty 中插入該元素,賦予元素值 entry 的指向。

我們理一理,寫入過程的整體流程就是:

  • 查 read,read 上沒有,或者已標記刪除狀態。
  • 上互斥鎖(Mutex)。
  • 操作 dirty,根據各種數據情況和狀態進行處理。

回到最初的話題,為什么他寫入性能差那么多。究其原因:

  • 寫入一定要會經過 read,無論如何都比別人多一層,后續還要查數據情況和狀態,性能開銷相較更大。
  • (第三個處理分支)當初始化或者 dirty 被提升后,會從 read 中復制全量的數據,若 read 中數據量大,則會影響性能。

可得知 sync.Map 類型不適合寫多的場景,讀多寫少是比較好的。

若有大數據量的場景,則需要考慮 read 復制數據時的偶然性能抖動是否能夠接受。

刪除過程

這時候可能有小伙伴在想了。寫入過程,理論上和刪除不會差太遠。怎么 sync.Map 類型的刪除的性能似乎還行,這里面有什么貓膩?

源碼如下:

  1. func (m *Map) LoadAndDelete(key interface{}) (value interface{}, loaded bool) { 
  2.  read, _ := m.read.Load().(readOnly) 
  3.  e, ok := read.m[key
  4.  ... 
  5.   if ok { 
  6.   return e.delete() 
  7.  } 

刪除是標準的開場,依然先到 read 檢查該元素是否存在。

若存在,則調用 delete 標記為 expunged(刪除狀態),非常高效。可以明確在 read 中的元素,被刪除,性能是非常好的。

若不存在,也就是走到 dirty 流程中:

  1. func (m *Map) LoadAndDelete(key interface{}) (value interface{}, loaded bool) { 
  2.  ... 
  3.  if !ok && read.amended { 
  4.   m.mu.Lock() 
  5.   read, _ = m.read.Load().(readOnly) 
  6.   e, ok = read.m[key
  7.   if !ok && read.amended { 
  8.    e, ok = m.dirty[key
  9.    delete(m.dirty, key
  10.    m.missLocked() 
  11.   } 
  12.   m.mu.Unlock() 
  13.  } 
  14.  ... 
  15.  return nil, false 

若 read 中不存在該元素,dirty 不為空,read 與 dirty 不一致(利用 amended 判別),則表明要操作 dirty,上互斥鎖。

再重復進行雙重檢查,若 read 仍然不存在該元素。則調用 delete 方法從 dirty 中標記該元素的刪除。

需要注意,出現頻率較高的 delete 方法:

  1. func (e *entry) delete() (value interface{}, ok bool) { 
  2.  for { 
  3.   p := atomic.LoadPointer(&e.p) 
  4.   if p == nil || p == expunged { 
  5.    return nil, false 
  6.   } 
  7.   if atomic.CompareAndSwapPointer(&e.p, p, nil) { 
  8.    return *(*interface{})(p), true 
  9.   } 
  10.  } 

該方法都是將 entry.p 置為 nil,并且標記為 expunged(刪除狀態),而不是真真正正的刪除。

注:不要誤用 sync.Map,前段時間從字節大佬分享的案例來看,他們將一個連接作為 key 放了進去,于是和這個連接相關的,例如:buffer 的內存就永遠無法釋放了...

總結

通過閱讀本文,我們明確了 sync.Map 和原生 map +互斥鎖/讀寫鎖之間的性能情況。

標準庫 sync.Map 雖說支持并發讀寫 map,但更適用于讀多寫少的場景,因為他寫入的性能比較差,使用時要考慮清楚這一點。

另外我們針對 sync.Map 的性能差異,進行了深入的源碼剖析,了解到了其背后快、慢的原因,實現了知其然知其所以然。

經常看到并發讀寫 map 導致致命錯誤,實在是令人憂心。大家覺得如果本文不錯,歡迎分享給更多的 Go 愛好者 :)

參考

  • Package sync
  • 踩了 Golang sync.Map 的一個坑
  • go19-examples/benchmark-for-map
  • 通過實例深入理解sync.Map的工作原理

 

 

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2020-10-22 12:30:33

MySQL

2021-06-08 22:43:07

IPC方式Qt

2020-03-31 08:12:25

Kafka架構數據庫

2021-03-29 12:22:25

微信iOS蘋果

2024-03-26 09:42:27

分片算法應用

2021-12-06 08:30:49

SpringSpring Bean面試題

2025-05-14 01:55:00

FCMCPAI

2020-04-14 13:32:56

@Transacti失效場景

2023-12-18 23:09:25

開源優化引擎

2020-09-24 09:08:04

分布式系統架構

2024-04-26 09:40:10

項目精度丟失javascrip

2022-05-24 11:50:46

延時消息分布式

2024-01-29 00:29:49

通信技術行業

2020-07-08 07:45:44

OAuth2.0授權

2021-03-01 18:52:39

工具在線瀏覽器

2021-01-04 11:23:21

手機無線電通訊

2020-04-16 12:42:42

附近的人共享單車App

2020-08-12 09:55:07

附近的人數據庫MySQL

2020-10-21 06:39:21

CPU寄存器架構

2025-11-11 08:47:00

點贊
收藏

51CTO技術棧公眾號

在线观看不卡的av| 欧美伦理视频网站| 国产亚洲欧美视频| 人妻激情另类乱人伦人妻| 91porny九色| 牛牛影视久久网| 国产一区二区三区四区在线观看| 亚洲国产小视频在线观看| 天天爱天天做天天操| 中文字幕视频一区二区| 九色成人国产蝌蚪91| 亚洲成人精品一区| 亚洲最大的av网站| 免费看污黄网站在线观看| 91探花在线观看| 午夜精品久久久久99热蜜桃导演 | 免费高清在线观看电视| 午夜日韩成人影院| 2021久久国产精品不只是精品| 色综合久综合久久综合久鬼88 | 三级av在线免费观看| 男人的天堂久久| 制服丝袜中文字幕亚洲| 中文字幕中文字幕在线中心一区 | 1区2区在线观看| 精品一区二区在线播放| 日日摸夜夜添一区| 五月天av在线播放| 麻豆视频免费在线观看| 国内精品伊人久久久久av影院 | 国模私拍视频在线播放| 懂色av一区二区在线播放| 欧美日韩高清区| 美国美女黄色片| www.久久草.com| 一区二区三区在线视频免费 | 伊人久久国产精品| 每日更新成人在线视频| 一本色道久久88精品综合| 日本美女高潮视频| 欧美边添边摸边做边爱免费| 91色视频在线| 国产区精品视频| 中文字幕电影av| 日韩欧美精品一区| 精品久久久影院| 国产精品丝袜久久久久久消防器材| 免费观看成年在线视频网站| 久国产精品韩国三级视频| 日韩美女免费线视频| 女人裸体性做爰全过| 日韩精品一区国产| 欧美日韩国产专区| 亚洲一卡二卡三卡| 不卡视频免费在线观看| 久久精品91| 456国产精品| 亚洲色图27p| 成人香蕉社区| 在线观看亚洲一区| 日本中文字幕在线视频观看 | 在线色欧美三级视频| 成都免费高清电影| 91综合精品国产丝袜长腿久久| 日韩午夜在线影院| 超碰影院在线观看| 色呦呦在线看| 国产精品午夜在线| 好吊妞www.84com只有这里才有精品| 精人妻无码一区二区三区| 日韩激情一二三区| 国语自产在线不卡| 永久免费看片视频教学| 亚洲三级网址| 精品成人一区二区| 色乱码一区二区三区在线| 国产成人久久精品麻豆二区| 午夜精品在线看| 久久久一二三四| 一区二区三区伦理| 婷婷国产在线综合| 国产欧美精品aaaaaa片| 不卡专区在线| 一卡二卡三卡日韩欧美| 五月天国产一区| 亚洲人视频在线观看| 国产乱码精品一区二区三| 国产精品久久久久99| 日本天堂在线视频| 欧美1区2区| 国内精品免费午夜毛片| 亚洲 小说区 图片区| 欧美一级久久| 国产91精品久久久久| 丁香社区五月天| 国产精品久久国产愉拍| 欧美激情精品久久久久久变态| 久久精品国产av一区二区三区| 国产韩国精品一区二区三区| 夜夜嗨av一区二区三区四区| 少妇被躁爽到高潮无码文| 日韩毛片视频| 欧美黑人一级爽快片淫片高清| 91video| 亚洲精品一二| 91精品国产乱码久久久久久久久| 久久视频免费看| 欧美日韩国产欧| 欧美劲爆第一页| 精品亚洲永久免费| 免费看日韩精品| 国产欧美婷婷中文| 色窝窝无码一区二区三区成人网站 | eeuss鲁片一区二区三区| 亚洲视频在线免费看| 人妻丰满熟妇av无码久久洗澡| 欧美黑白配在线| 久久亚洲综合国产精品99麻豆精品福利 | 久久久成人免费视频| 一区二区国产在线观看| 91成人在线播放| 国产乱人乱偷精品视频| 国产激情一区二区三区四区 | 久久精品色播| 亚洲精品日韩在线| 好吊视频在线观看| 影音先锋一区| 日韩av毛片网| www.看毛片| 亚洲欧美日韩国产综合| 丁香花在线影院观看在线播放 | 国产成人中文字幕| 中文字幕 亚洲视频| 91亚洲精华国产精华精华液| 欧美午夜免费| 欧美精品电影| 欧美亚洲综合久久| 宇都宫紫苑在线播放| 最新国产精品精品视频| 日韩电影中文字幕| 永久免费观看片现看| 午夜在线一区| 欧美高清视频一区二区三区在线观看| 成人影院在线播放| 欧美精品一区二| 日本少妇全体裸体洗澡| 成人自拍视频在线观看| 欧美成熟毛茸茸复古| 素人av在线| 午夜精品视频在线观看| 激情小说欧美色图| 欧美精品一区二区三区中文字幕| 久久躁狠狠躁夜夜爽| 国产巨乳在线观看| 亚洲四区在线观看| 少妇高潮喷水久久久久久久久久| 国产精品午夜av| 最近的2019中文字幕免费一页| 欧美亚洲另类小说| 欧美激情一区二区三区在线| 国产精品国三级国产av| 在线综合色站| 97婷婷涩涩精品一区| 在线观看日批视频| 中文字幕一区二区三区色视频 | 日韩av网站免费在线| 91精品入口蜜桃| 日本小视频在线免费观看| 欧美va亚洲va香蕉在线| 青青操免费在线视频| 国产一区二三区| 国产免费一区二区视频| 欧美成人基地| 国产z一区二区三区| 77导航福利在线| 日韩欧美999| 亚洲v在线观看| 99久久精品费精品国产| 91精品婷婷国产综合久久蝌蚪| 国内老司机av在线| 国产亚洲欧美aaaa| 亚洲欧美激情在线观看| 中文字幕在线一区| 苍井空张开腿实干12次| 午夜一区在线| 老司机av福利| 美女网站色精品尤物极品姐弟| 国产精品黄色av| av毛片在线| 国产视频精品xxxx| 国产精品无码天天爽视频| 狠狠久久亚洲欧美专区| 欧美色视频一区二区三区在线观看| 成人午夜视频在线| 日韩爱爱小视频| 精品美女久久久| 操一操视频一区| av网站导航在线观看免费| 日韩大陆毛片av| 国内精品偷拍视频| 亚洲日本在线a| 大又大又粗又硬又爽少妇毛片| 九色|91porny| 日本三级免费网站| 中文字幕日韩一区二区不卡 | 日韩中文字幕一区二区高清99| 日本久久久久久久久| 污污在线观看| 色哟哟亚洲精品一区二区| 性xxxx视频播放免费| 欧美一级欧美一级在线播放| 欧美国产一级片| 天涯成人国产亚洲精品一区av| 久久国产波多野结衣| 欧美激情在线一区二区三区| 中文字幕xxx| 懂色av一区二区在线播放| 日韩精品视频一二三| 先锋影音国产一区| 给我免费播放片在线观看| 欧美在线91| 在线精品日韩| 成人羞羞网站入口免费| 国产综合久久久久久| 黑人巨大亚洲一区二区久| 亚洲女人天堂成人av在线| 久久久久久久亚洲| 天天射综合影视| 国产亚洲精品久久久久久无几年桃| 国产精品久久久久久久久动漫| 色哟哟精品观看| 久久精品国产第一区二区三区| 中国 免费 av| 水蜜桃久久夜色精品一区| 成人看片视频| 国产蜜臀一区二区打屁股调教| 久久精品一偷一偷国产| 女人18毛片一区二区三区| 欧美性xxxx| 欧美一区二区激情视频| 国产精品乱人伦一区二区| 亚洲成人av免费观看| 激情小说亚洲一区| 亚洲天堂av一区二区| 亚洲黄色三级| 超碰成人免费在线| 亚洲激情视频| 国产亚洲综合视频| 亚洲一区二区网站| 成人精品视频一区二区| 丝袜诱惑制服诱惑色一区在线观看| 亚洲日本一区二区三区在线不卡| 国产区精品区| 电影午夜精品一区二区三区 | 久久综合九色| 亚洲国产高清av| 精彩视频一区二区三区| 亚洲综合在线一区二区| 欧美综合国产| 好男人www社区| 好看的日韩av电影| 手机成人在线| 四虎成人av| 男人c女人视频| 日韩不卡一区| 中文字幕一区二区三区有限公司 | 国产免费一区二区三区视频| 蘑菇福利视频一区播放| www.涩涩涩| 国产精品一区三区| 国产制服丝袜在线| 国产拍欧美日韩视频二区| 日本免费网站视频| 亚洲aⅴ怡春院| 波多野结衣绝顶大高潮| 欧美另类videos死尸| 好吊视频一区二区三区| 亚洲视频axxx| 超碰超碰在线| 色系列之999| 曰本三级在线| 国产aⅴ夜夜欢一区二区三区 | 国产成人av一区二区三区| 欧美日韩一区二区三区四区不卡| 日韩一本精品| 精品视频免费在线观看| 亚洲天堂第一区| 91麻豆国产自产在线观看亚洲 | 亚洲免费大片| 婷婷免费在线观看| 成人性色生活片免费看爆迷你毛片| 91成年人网站| 亚洲图片自拍偷拍| 久久久综合久久| 91国内精品野花午夜精品| 美女又爽又黄免费视频| 欧美另类一区二区三区| 色鬼7777久久| 亚洲精品在线不卡| 黄色网页在线免费看| 日韩网站在线观看| 久做在线视频免费观看| 91av免费观看91av精品在线| 亚洲爽爆av| 日韩福利二区| 亚洲视频二区| 午夜视频在线免费看| 国产69精品久久99不卡| 美女100%露胸无遮挡| 精品日本高清在线播放| 国产肥老妇视频| 日韩中文字幕免费视频| 三级成人黄色影院| 国产青春久久久国产毛片| 国产+成+人+亚洲欧洲在线| 亚洲国产精品123| 91成人网在线观看| 污污污污污污www网站免费| 日本系列欧美系列| www.自拍偷拍| 亚洲成人福利片| а√天堂资源在线| 超碰91人人草人人干| 成人在线高清| 色播亚洲视频在线观看| 亚洲欧美清纯在线制服| 日本在线不卡一区二区| 国产亚洲精品超碰| 国产3级在线观看| 欧洲精品中文字幕| 国产在线色视频| 久久精品国产亚洲一区二区| 成人涩涩视频| av一区二区三区免费| 一区二区蜜桃| 久久aaaa片一区二区| 亚洲欧美激情插| 国产精品一区二区三区在线免费观看| 日韩视频中文字幕| 国产一区精品二区| 精品久久中出| 亚洲美女一区| 欧美丰满少妇人妻精品| 精品久久久久久久久久久久| 日本高清视频在线| 97香蕉超级碰碰久久免费软件 | 国产无遮挡免费视频| 欧美精品一区二区久久久| jizzjizz中国精品麻豆| 韩国精品一区二区三区六区色诱| 亚洲在线观看| 国产美女免费无遮挡| 欧洲精品一区二区| 日本在线观看免费| 亚洲字幕一区二区| 一区在线播放| 国产在线观看无码免费视频| 欧美午夜精品伦理| 春暖花开成人亚洲区| 欧美肥老妇视频| 国产精品调教视频| 国产成人久久777777| 国产精品久久久久久亚洲伦| 国产男男gay网站| 国产亚洲人成网站在线观看| 99re久久| 99热这里只有精品免费| 99视频超级精品| 日韩成人短视频| 精品国一区二区三区| 国产精品粉嫩| 亚洲综合激情五月| 成人免费黄色大片| 久久青青草原亚洲av无码麻豆| 色阁综合伊人av| 亚洲一区二区三区日本久久九| 大陆极品少妇内射aaaaa| 国产成人午夜99999| 亚洲国产精品午夜在线观看| 亚洲欧美日韩天堂一区二区| 欧美视频免费看| 污视频在线免费观看一区二区三区| 久久99精品久久久久久国产越南| 欧美精品99久久久| 欧美电影一区二区| 蜜桃视频动漫在线播放| 岛国一区二区三区高清视频| 久久一综合视频| 在线看的片片片免费| 日韩精品免费视频| 亚洲香蕉久久| 国产极品粉嫩福利姬萌白酱 | 久久精品美女视频| 亚洲一区二区精品| 亚洲视频一起| 色婷婷狠狠18| 精品欧美一区二区三区| www在线免费观看视频| 清纯唯美一区二区三区| 丝袜美腿一区二区三区|