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

高性能開(kāi)發(fā)的“十大武器”,愛(ài)了愛(ài)了!

開(kāi)發(fā) 架構(gòu) 開(kāi)發(fā)工具
程序員經(jīng)常要面臨的一個(gè)問(wèn)題就是:如何提高程序性能?如果是你,你會(huì)怎么回答這個(gè)問(wèn)題?

程序員經(jīng)常要面臨的一個(gè)問(wèn)題就是:如何提高程序性能?如果是你,你會(huì)怎么回答這個(gè)問(wèn)題?

[[350091]]
圖片來(lái)自 Pexels 

這篇文章,我們循序漸進(jìn),從內(nèi)存、磁盤 I/O、網(wǎng)絡(luò) I/O、CPU、緩存、架構(gòu)、算法等多層次遞進(jìn),串聯(lián)起高性能開(kāi)發(fā)十大必須掌握的核心技術(shù):

  • - I/O優(yōu)化:零拷貝技術(shù)
  • - I/O優(yōu)化:多路復(fù)用技術(shù)
  • - 線程池技術(shù)
  • - 無(wú)鎖編程技術(shù)
  • - 進(jìn)程間通信技術(shù)
  • - RPC&序列化技術(shù)
  • - 數(shù)據(jù)庫(kù)索引技術(shù)
  • - 緩存技術(shù)&布隆過(guò)濾器
  • - 全文搜索技術(shù)
  • - 負(fù)載均衡技術(shù)

準(zhǔn)備好了嗎,坐穩(wěn)了,發(fā)車!首先,我們從最簡(jiǎn)單的模型開(kāi)始。

老板告訴你,開(kāi)發(fā)一個(gè)靜態(tài) Web 服務(wù)器,把磁盤文件(網(wǎng)頁(yè)、圖片)通過(guò)網(wǎng)絡(luò)發(fā)出去,怎么做?

  • 你花了兩天時(shí)間,擼了一個(gè) 1.0 版本:
  • 主線程進(jìn)入一個(gè)循環(huán),等待連接。
  • 來(lái)一個(gè)連接就啟動(dòng)一個(gè)工作線程來(lái)處理。

工作線程中,等待對(duì)方請(qǐng)求,然后從磁盤讀文件、往套接口發(fā)送數(shù)據(jù),完事兒。

上線一天,老板發(fā)現(xiàn)太慢了,大一點(diǎn)的圖片加載都有卡頓感。讓你優(yōu)化,這個(gè)時(shí)候,你需要:零拷貝技術(shù)。

I/O 優(yōu)化:零拷貝技術(shù)

上面的工作線程,從磁盤讀文件、再通過(guò)網(wǎng)絡(luò)發(fā)送數(shù)據(jù),數(shù)據(jù)從磁盤到網(wǎng)絡(luò),兜兜轉(zhuǎn)轉(zhuǎn)需要拷貝四次,其中 CPU 親自搬運(yùn)都需要兩次。

零拷貝技術(shù),解放 CPU,文件數(shù)據(jù)直接從內(nèi)核發(fā)送出去,無(wú)需再拷貝到應(yīng)用程序緩沖區(qū),白白浪費(fèi)資源。

Linux API:

  1. ssize_t sendfile( 
  2.   int out_fd,  
  3.   int in_fd,  
  4.   off_t *offset,  
  5.   size_t count 
  6.   ); 

函數(shù)名字已經(jīng)把函數(shù)的功能解釋的很明顯了:發(fā)送文件。指定要發(fā)送的文件描述符和網(wǎng)絡(luò)套接字描述符,一個(gè)函數(shù)搞定!

用上了零拷貝技術(shù)后開(kāi)發(fā)了 2.0 版本,圖片加載速度明顯有了提升。不過(guò)老板發(fā)現(xiàn)同時(shí)訪問(wèn)的人變多了以后,又變慢了,又讓你繼續(xù)優(yōu)化。這個(gè)時(shí)候,你需要:多路復(fù)用技術(shù)。

I/O 優(yōu)化:多路復(fù)用技術(shù)

前面的版本中,每個(gè)線程都要阻塞在 recv 等待對(duì)方的請(qǐng)求,這來(lái)訪問(wèn)的人多了,線程開(kāi)的就多了,大量線程都在阻塞,系統(tǒng)運(yùn)轉(zhuǎn)速度也隨之下降。

這個(gè)時(shí)候,你需要多路復(fù)用技術(shù),使用select模型,將所有等待(accept、recv)都放在主線程里,工作線程不需要再等待。

過(guò)了一段時(shí)間之后,網(wǎng)站訪問(wèn)的人越來(lái)越多了,就連 select 也開(kāi)始有點(diǎn)應(yīng)接不暇,老板繼續(xù)讓你優(yōu)化性能。這個(gè)時(shí)候,你需要升級(jí)多路復(fù)用模型為 epoll。

  • select 有三弊,epoll 有三優(yōu):
  • select 底層采用數(shù)組來(lái)管理套接字描述符,同時(shí)管理的數(shù)量有上限,一般不超過(guò)幾千個(gè),epoll 使用樹(shù)和鏈表來(lái)管理,同時(shí)管理數(shù)量可以很大。
  • select 不會(huì)告訴你到底哪個(gè)套接字來(lái)了消息,你需要一個(gè)個(gè)去詢問(wèn)。epoll 直接告訴你誰(shuí)來(lái)了消息,不用輪詢。
  • select 進(jìn)行系統(tǒng)調(diào)用時(shí)還需要把套接字列表在用戶空間和內(nèi)核空間來(lái)回拷貝,循環(huán)中調(diào)用 select 時(shí)簡(jiǎn)直浪費(fèi)。epoll 統(tǒng)一在內(nèi)核管理套接字描述符,無(wú)需來(lái)回拷貝。

用上了 epoll 多路復(fù)用技術(shù),開(kāi)發(fā)了 3.0 版本,你的網(wǎng)站能同時(shí)處理很多用戶請(qǐng)求了。

但是貪心的老板還不滿足,不舍得升級(jí)硬件服務(wù)器,卻讓你進(jìn)一步提高服務(wù)器的吞吐量。

你研究后發(fā)現(xiàn),之前的方案中,工作線程總是用到才創(chuàng)建,用完就關(guān)閉,大量請(qǐng)求來(lái)的時(shí)候,線程不斷創(chuàng)建、關(guān)閉、創(chuàng)建、關(guān)閉,開(kāi)銷挺大的。這個(gè)時(shí)候,你需要:線程池技術(shù)。

線程池技術(shù)

我們可以在程序一開(kāi)始啟動(dòng)后就批量啟動(dòng)一波工作線程,而不是在有請(qǐng)求來(lái)的時(shí)候才去創(chuàng)建,使用一個(gè)公共的任務(wù)隊(duì)列,請(qǐng)求來(lái)臨時(shí),向隊(duì)列中投遞任務(wù),各個(gè)工作線程統(tǒng)一從隊(duì)列中不斷取出任務(wù)來(lái)處理,這就是線程池技術(shù)。

多線程技術(shù)的使用一定程度提升了服務(wù)器的并發(fā)能力,但同時(shí),多個(gè)線程之間為了數(shù)據(jù)同步,常常需要使用互斥體、信號(hào)、條件變量等手段來(lái)同步多個(gè)線程。

這些重量級(jí)的同步手段往往會(huì)導(dǎo)致線程在用戶態(tài)/內(nèi)核態(tài)多次切換,系統(tǒng)調(diào)用,線程切換都是不小的開(kāi)銷。

在線程池技術(shù)中,提到了一個(gè)公共的任務(wù)隊(duì)列,各個(gè)工作線程需要從中提取任務(wù)進(jìn)行處理,這里就涉及到多個(gè)工作線程對(duì)這個(gè)公共隊(duì)列的同步操作。

有沒(méi)有一些輕量級(jí)的方案來(lái)實(shí)現(xiàn)多線程安全的訪問(wèn)數(shù)據(jù)呢?這個(gè)時(shí)候,你需要:無(wú)鎖編程技術(shù)。

無(wú)鎖編程技術(shù)

多線程并發(fā)編程中,遇到公共數(shù)據(jù)時(shí)就需要進(jìn)行線程同步。而這里的同步又可以分為阻塞型同步和非阻塞型同步。

阻塞型同步好理解,我們常用的互斥體、信號(hào)、條件變量等這些操作系統(tǒng)提供的機(jī)制都屬于阻塞型同步,其本質(zhì)都是要加“鎖”。

[[350094]]

與之對(duì)應(yīng)的非阻塞型同步就是在無(wú)鎖的情況下實(shí)現(xiàn)同步,目前有三類技術(shù)方案:

  • Wait-free
  • Lock-free
  • Obstruction-free

三類技術(shù)方案都是通過(guò)一定的算法和技術(shù)手段來(lái)實(shí)現(xiàn)不用阻塞等待而實(shí)現(xiàn)同步,這其中又以 Lock-free 最為應(yīng)用廣泛。

Lock-free 能夠廣泛應(yīng)用得益于目前主流的 CPU 都提供了原子級(jí)別的 read-modify-write 原語(yǔ),這就是著名的 CAS(Compare-And-Swap)操作。在 Intel x86 系列處理器上,就是 cmpxchg 系列指令。

  1. // 通過(guò)CAS操作實(shí)現(xiàn)Lock-free 
  2. do { 
  3.   ... 
  4. } while(!CAS(ptr,old_data,new_data )) 

我們常常見(jiàn)到的無(wú)鎖隊(duì)列、無(wú)鎖鏈表、無(wú)鎖 HashMap 等數(shù)據(jù)結(jié)構(gòu),其無(wú)鎖的核心大都來(lái)源于此。

在日常開(kāi)發(fā)中,恰當(dāng)?shù)倪\(yùn)用無(wú)鎖化編程技術(shù),可以有效地降低多線程阻塞和切換帶來(lái)的額外開(kāi)銷,提升性能。

服務(wù)器上線了一段時(shí)間,發(fā)現(xiàn)服務(wù)經(jīng)常崩潰異常,排查發(fā)現(xiàn)是工作線程代碼 Bug,一崩潰整個(gè)服務(wù)都不可用了。

于是你決定把工作線程和主線程拆開(kāi)到不同的進(jìn)程中,工作線程崩潰不能影響整體的服務(wù)。這個(gè)時(shí)候出現(xiàn)了多進(jìn)程,你需要:進(jìn)程間通信技術(shù)。

進(jìn)程間通信技術(shù)

提起進(jìn)程間通信,你能想到的是什么?

  • 管道
  • 命名管道
  • socket
  • 消息隊(duì)列
  • 信號(hào)
  • 信號(hào)量
  • 共享內(nèi)存

對(duì)于本地進(jìn)程間需要高頻次的大量數(shù)據(jù)交互,首推共享內(nèi)存這種方案。

現(xiàn)代操作系統(tǒng)普遍采用了基于虛擬內(nèi)存的管理方案,在這種內(nèi)存管理方式之下,各個(gè)進(jìn)程之間進(jìn)行了強(qiáng)制隔離。

程序代碼中使用的內(nèi)存地址均是一個(gè)虛擬地址,由操作系統(tǒng)的內(nèi)存管理算法提前分配映射到對(duì)應(yīng)的物理內(nèi)存頁(yè)面,CPU 在執(zhí)行代碼指令時(shí),對(duì)訪問(wèn)到的內(nèi)存地址再進(jìn)行實(shí)時(shí)的轉(zhuǎn)換翻譯。

從上圖可以看出,不同進(jìn)程之中,雖然是同一個(gè)內(nèi)存地址,最終在操作系統(tǒng)和 CPU 的配合下,實(shí)際存儲(chǔ)數(shù)據(jù)的內(nèi)存頁(yè)面卻是不同的。

而共享內(nèi)存這種進(jìn)程間通信方案的核心在于:如果讓同一個(gè)物理內(nèi)存頁(yè)面映射到兩個(gè)進(jìn)程地址空間中,雙方不是就可以直接讀寫,而無(wú)需拷貝了嗎?

當(dāng)然,共享內(nèi)存只是最終的數(shù)據(jù)傳輸載體,雙方要實(shí)現(xiàn)通信還得借助信號(hào)、信號(hào)量等其他通知機(jī)制。

用上了高性能的共享內(nèi)存通信機(jī)制,多個(gè)服務(wù)進(jìn)程之間就可以愉快的工作了,即便有工作進(jìn)程出現(xiàn) Crash,整個(gè)服務(wù)也不至于癱瘓。

不久,老板增加需求了,不再滿足于只能提供靜態(tài)網(wǎng)頁(yè)瀏覽了,需要能夠?qū)崿F(xiàn)動(dòng)態(tài)交互。這一次老板還算良心,給你加了一臺(tái)硬件服務(wù)器。

于是你用 Java/PHP/Python 等語(yǔ)言搞了一套 Web 開(kāi)發(fā)框架,單獨(dú)起了一個(gè)服務(wù),用來(lái)提供動(dòng)態(tài)網(wǎng)頁(yè)支持,和原來(lái)等靜態(tài)內(nèi)容服務(wù)器配合工作。

這個(gè)時(shí)候你發(fā)現(xiàn),靜態(tài)服務(wù)和動(dòng)態(tài)服務(wù)之間經(jīng)常需要通信。

一開(kāi)始你用基于 HTTP 的 RESTful 接口在服務(wù)器之間通信,后來(lái)發(fā)現(xiàn)用 JSON 格式傳輸數(shù)據(jù)效率低下,你需要更高效的通信方案。這個(gè)時(shí)候你需要:RPC && 序列化技術(shù)。

RPC&序列化技術(shù)

什么是 RPC 技術(shù)?RPC 全稱Remote Procedure Call,遠(yuǎn)程過(guò)程調(diào)用。我們平時(shí)編程中,隨時(shí)都在調(diào)用函數(shù),這些函數(shù)基本上都位于本地,也就是當(dāng)前進(jìn)程某一個(gè)位置的代碼塊。

但如果要調(diào)用的函數(shù)不在本地,而在網(wǎng)絡(luò)上的某個(gè)服務(wù)器上呢?這就是遠(yuǎn)程過(guò)程調(diào)用的來(lái)源。

從圖中可以看出,通過(guò)網(wǎng)絡(luò)進(jìn)行功能調(diào)用,涉及參數(shù)的打包解包、網(wǎng)絡(luò)的傳輸、結(jié)果的打包解包等工作。而其中對(duì)數(shù)據(jù)進(jìn)行打包和解包就需要依賴序列化技術(shù)來(lái)完成。

什么是序列化技術(shù)?

序列化簡(jiǎn)單來(lái)說(shuō),是將內(nèi)存中的對(duì)象轉(zhuǎn)換成可以傳輸和存儲(chǔ)的數(shù)據(jù),而這個(gè)過(guò)程的逆向操作就是反序列化。序列化 && 反序列化技術(shù)可以實(shí)現(xiàn)將內(nèi)存對(duì)象在本地和遠(yuǎn)程計(jì)算機(jī)上搬運(yùn)。

好比把大象關(guān)進(jìn)冰箱門分三步:

  • 將本地內(nèi)存對(duì)象編碼成數(shù)據(jù)流
  • 通過(guò)網(wǎng)絡(luò)傳輸上述數(shù)據(jù)流
  • 將收到的數(shù)據(jù)流在內(nèi)存中構(gòu)建出對(duì)象

序列化技術(shù)有很多免費(fèi)開(kāi)源的框架,衡量一個(gè)序列化框架的指標(biāo)有這么幾個(gè):

  • 是否支持跨語(yǔ)言使用,能支持哪些語(yǔ)言
  • 是否只是單純的序列化功能,包不包含 RPC 框架
  • 序列化傳輸性能
  • 擴(kuò)展支持能力(數(shù)據(jù)對(duì)象增刪字段后,前后的兼容性)
  • 是否支持動(dòng)態(tài)解析(動(dòng)態(tài)解析是指不需要提前編譯,根據(jù)拿到的數(shù)據(jù)格式定義文件立即就能解析)

下面流行的三大序列化框架 Protobuf、Thrift、Avro 的對(duì)比:

①ProtoBuf

廠商:Google。

支持語(yǔ)言:C++、Java、Python 等。

動(dòng)態(tài)性支持:較差,一般需要提前編譯。

是否包含 RPC:否。

簡(jiǎn)介:ProtoBuf 是谷歌出品的序列化框架,成熟穩(wěn)定,性能強(qiáng)勁,很多大廠都在使用。

自身只是一個(gè)序列化框架,不包含 RPC 功能,不過(guò)可以與同是 Google 出品的 gPRC 框架一起配套使用,作為后端 RPC 服務(wù)開(kāi)發(fā)的黃金搭檔。

[[350098]]

缺點(diǎn)是對(duì)動(dòng)態(tài)性支持較弱,不過(guò)在更新版本中這一現(xiàn)象有待改善。總體來(lái)說(shuō),ProtoBuf 都是一款非常值得推薦的序列化框架。

②Thrift

廠商:Facebook。

支持語(yǔ)言:C++、Java、Python、PHP、C#、Go、JavaScript 等。

動(dòng)態(tài)性支持:差。

是否包含 RPC:是。

簡(jiǎn)介:這是一個(gè)由 Facebook 出品的 RPC 框架,本身內(nèi)含二進(jìn)制序列化方案,但 Thrift 本身的 RPC 和數(shù)據(jù)序列化是解耦的,你甚至可以選擇 XML、JSON 等自定義的數(shù)據(jù)格式。

在國(guó)內(nèi)同樣有一批大廠在使用,性能方面和 ProtoBuf 不分伯仲。缺點(diǎn)和 ProtoBuf 一樣,對(duì)動(dòng)態(tài)解析的支持不太友好。

③Avro

支持語(yǔ)言:C、C++、Java、Python、C# 等。

動(dòng)態(tài)性支持:好。

是否包含 RPC:是。

簡(jiǎn)介:這是一個(gè)源自于 Hadoop 生態(tài)中的序列化框架,自帶 RPC 框架,也可獨(dú)立使用。相比前兩位最大的優(yōu)勢(shì)就是支持動(dòng)態(tài)數(shù)據(jù)解析。

為什么我一直在說(shuō)這個(gè)動(dòng)態(tài)解析功能呢?在之前的一段項(xiàng)目經(jīng)歷中,軒轅就遇到了三種技術(shù)的選型,擺在我們面前的就是這三種方案。需要一個(gè) C++ 開(kāi)發(fā)的服務(wù)和一個(gè) Java 開(kāi)發(fā)的服務(wù)能夠進(jìn)行 RPC。

Protobuf 和 Thrift 都需要通過(guò)“編譯”將對(duì)應(yīng)的數(shù)據(jù)協(xié)議定義文件編譯成對(duì)應(yīng)的 C++/Java 源代碼,然后合入項(xiàng)目中一起編譯,從而進(jìn)行解析。

當(dāng)時(shí),Java 項(xiàng)目組同學(xué)非常強(qiáng)硬的拒絕了這一做法,其理由是這樣編譯出來(lái)的強(qiáng)業(yè)務(wù)型代碼融入他們的業(yè)務(wù)無(wú)關(guān)的框架服務(wù),而業(yè)務(wù)是常變的,這樣做不夠優(yōu)雅。

最后,經(jīng)過(guò)測(cè)試,最終選擇了 AVRO 作為我們的方案。Java 一側(cè)只需要?jiǎng)討B(tài)加載對(duì)應(yīng)的數(shù)據(jù)格式文件,就能對(duì)拿到的數(shù)據(jù)進(jìn)行解析,并且性能上還不錯(cuò)。(當(dāng)然,對(duì)于 C++ 一側(cè)還是選擇了提前編譯的做法)

自從你的網(wǎng)站支持了動(dòng)態(tài)能力,免不了要和數(shù)據(jù)庫(kù)打交道,但隨著用戶的增長(zhǎng),你發(fā)現(xiàn)數(shù)據(jù)庫(kù)的查詢速度越來(lái)越慢。

這個(gè)時(shí)候,你需要:數(shù)據(jù)庫(kù)索引技術(shù)。

數(shù)據(jù)庫(kù)索引技術(shù)

想想你手上有一本數(shù)學(xué)教材,但是目錄被人給撕掉了,現(xiàn)在要你翻到講三角函數(shù)的那一頁(yè),你該怎么辦?

沒(méi)有了目錄,你只有兩種辦法,要么一頁(yè)一頁(yè)的翻,要么隨機(jī)翻,直到找到三角函數(shù)的那一頁(yè)。

對(duì)于數(shù)據(jù)庫(kù)也是一樣的道理,如果我們的數(shù)據(jù)表沒(méi)有“目錄”,那要查詢滿足條件的記錄行,就得全表掃描,那可就惱火了。

所以為了加快查詢速度,得給數(shù)據(jù)表也設(shè)置目錄,在數(shù)據(jù)庫(kù)領(lǐng)域中,這就是索引。

一般情況下,數(shù)據(jù)表都會(huì)有多個(gè)字段,那根據(jù)不同的字段也就可以設(shè)立不同的索引。

索引的分類:

  • 主鍵索引
  • 聚集索引
  • 非聚集索引

主鍵我們都知道,是唯一標(biāo)識(shí)一條數(shù)據(jù)記錄的字段(也存在多個(gè)字段一起來(lái)唯一標(biāo)識(shí)數(shù)據(jù)記錄的聯(lián)合主鍵),那與之對(duì)應(yīng)的就是主鍵索引了。

聚集索引是指索引的邏輯順序與表記錄的物理存儲(chǔ)順序一致的索引,一般情況下主鍵索引就符合這個(gè)定義,所以一般來(lái)說(shuō)主鍵索引也是聚集索引。

但是,這不是絕對(duì)的,在不同的數(shù)據(jù)庫(kù)中,或者在同一個(gè)數(shù)據(jù)庫(kù)下的不同存儲(chǔ)引擎中還是有不同。

聚集索引的葉子節(jié)點(diǎn)直接存儲(chǔ)了數(shù)據(jù),也是數(shù)據(jù)節(jié)點(diǎn),而非聚集索引的葉子節(jié)點(diǎn)沒(méi)有存儲(chǔ)實(shí)際的數(shù)據(jù),需要二次查詢。

索引的實(shí)現(xiàn)主要有三種:

  • B+樹(shù)
  • 哈希表
  • 位圖

其中,B+樹(shù)用的最多,其特點(diǎn)是樹(shù)的節(jié)點(diǎn)眾多,相較于二叉樹(shù),這是一棵多叉樹(shù),是一個(gè)扁平的胖樹(shù),減少樹(shù)的深度有利于減少磁盤 I/O 次數(shù),適宜數(shù)據(jù)庫(kù)的存儲(chǔ)特點(diǎn)。

哈希表實(shí)現(xiàn)的索引也叫散列索引,通過(guò)哈希函數(shù)來(lái)實(shí)現(xiàn)數(shù)據(jù)的定位。哈希算法的特點(diǎn)是速度快,常數(shù)階的時(shí)間復(fù)雜度,但缺點(diǎn)是只適合準(zhǔn)確匹配,不適合模糊匹配和范圍搜索。

位圖索引相對(duì)就少見(jiàn)了。想象這么一個(gè)場(chǎng)景,如果某個(gè)字段的取值只有有限的少數(shù)幾種可能,比如性別、省份、血型等等,針對(duì)這樣的字段如果用 B+樹(shù)作為索引的話會(huì)出現(xiàn)什么情況?

會(huì)出現(xiàn)大量索引值相同的葉子節(jié)點(diǎn),這實(shí)際上是一種存儲(chǔ)浪費(fèi)。位圖索引正是基于這一點(diǎn)進(jìn)行優(yōu)化,針對(duì)字段取值只有少量有限項(xiàng),數(shù)據(jù)表中該列字段出現(xiàn)大量重復(fù)時(shí),就是位圖索引一展身手的時(shí)機(jī)。

所謂位圖,就是 Bitmap,其基本思想是對(duì)該字段每一個(gè)取值建立一個(gè)二進(jìn)制位圖來(lái)標(biāo)記數(shù)據(jù)表的每一條記錄的該列字段是否是對(duì)應(yīng)取值。

索引雖好,但也不可濫用,一方面索引最終是要存儲(chǔ)到磁盤上的,無(wú)疑會(huì)增加存儲(chǔ)開(kāi)銷。另外更重要的是,數(shù)據(jù)表的增刪操作一般會(huì)伴隨對(duì)索引的更新,因此對(duì)數(shù)據(jù)庫(kù)的寫入速度也是會(huì)有一定影響。

你的網(wǎng)站現(xiàn)在訪問(wèn)量越來(lái)越大了,同時(shí)在線人數(shù)大大增長(zhǎng)。然而,大量用戶的請(qǐng)求帶來(lái)了后端程序?qū)?shù)據(jù)庫(kù)大量的訪問(wèn)。

漸漸的,數(shù)據(jù)庫(kù)的瓶頸開(kāi)始出現(xiàn),無(wú)法再支持日益增長(zhǎng)的用戶量。老板再一次給你下達(dá)了性能提升的任務(wù)。

緩存技術(shù)&布隆過(guò)濾器

從物理 CPU 對(duì)內(nèi)存數(shù)據(jù)的緩存到瀏覽器對(duì)網(wǎng)頁(yè)內(nèi)容的緩存,緩存技術(shù)遍布于計(jì)算機(jī)世界的每一個(gè)角落。

面對(duì)當(dāng)前出現(xiàn)的數(shù)據(jù)庫(kù)瓶頸,同樣可以用緩存技術(shù)來(lái)解決。

每次訪問(wèn)數(shù)據(jù)庫(kù)都需要數(shù)據(jù)庫(kù)進(jìn)行查表(當(dāng)然,數(shù)據(jù)庫(kù)自身也有優(yōu)化措施),反映到底層就是進(jìn)行一次或多次的磁盤 I/O,但凡涉及 I/O 的就會(huì)慢下來(lái)。

如果是一些頻繁用到但又不會(huì)經(jīng)常變化的數(shù)據(jù),何不將其緩存在內(nèi)存中,不必每一次都要找數(shù)據(jù)庫(kù)要,從而減輕對(duì)數(shù)據(jù)庫(kù)對(duì)壓力呢?

有需求就有市場(chǎng),有市場(chǎng)就會(huì)有產(chǎn)品,以 Memcached 和 Redis 為代表的內(nèi)存對(duì)象緩存系統(tǒng)應(yīng)運(yùn)而生。

  • 緩存系統(tǒng)有三個(gè)著名的問(wèn)題:
  • 緩存穿透:緩存設(shè)立的目的是為了一定層面上截獲到數(shù)據(jù)庫(kù)存儲(chǔ)層的請(qǐng)求。穿透的意思就在于這個(gè)截獲沒(méi)有成功,請(qǐng)求最終還是去到了數(shù)據(jù)庫(kù),緩存沒(méi)有產(chǎn)生應(yīng)有的價(jià)值。
  • 緩存擊穿:如果把緩存理解成一面擋在數(shù)據(jù)庫(kù)面前的墻壁,為數(shù)據(jù)庫(kù)“抵御”查詢請(qǐng)求,所謂擊穿,就是在這面墻壁上打出了一個(gè)洞。一般發(fā)生在某個(gè)熱點(diǎn)數(shù)據(jù)緩存到期,而此時(shí)針對(duì)該數(shù)據(jù)的大量查詢請(qǐng)求來(lái)臨,大家一股腦的懟到了數(shù)據(jù)庫(kù)。

緩存雪崩:理解了擊穿,那雪崩就更好理解了。俗話說(shuō)得好,擊穿是一個(gè)人的雪崩,雪崩是一群人的擊穿。如果緩存這堵墻上處處都是洞,那這面墻還如何屹立?吃棗藥丸。

有了緩存系統(tǒng),我們就可以在向數(shù)據(jù)庫(kù)請(qǐng)求之前,先詢問(wèn)緩存系統(tǒng)是否有我們需要的數(shù)據(jù),如果有且滿足需要,我們就可以省去一次數(shù)據(jù)庫(kù)的查詢,如果沒(méi)有,我們?cè)傧驍?shù)據(jù)庫(kù)請(qǐng)求。

注意,這里有一個(gè)關(guān)鍵的問(wèn)題,如何判斷我們要的數(shù)據(jù)是不是在緩存系統(tǒng)中呢?

進(jìn)一步,我們把這個(gè)問(wèn)題抽象出來(lái):如何快速判斷一個(gè)數(shù)據(jù)量很大的集合中是否包含我們指定的數(shù)據(jù)?

這個(gè)時(shí)候,就是布隆過(guò)濾器大顯身手的時(shí)候了,它就是為了解決這個(gè)問(wèn)題而誕生的。那布隆過(guò)濾器是如何解決這個(gè)問(wèn)題的呢?

先回到上面的問(wèn)題中來(lái),這其實(shí)是一個(gè)查找問(wèn)題,對(duì)于查找問(wèn)題,最常用的解決方案是搜索樹(shù)和哈希表兩種方案。

因?yàn)檫@個(gè)問(wèn)題有兩個(gè)關(guān)鍵點(diǎn):快速、數(shù)據(jù)量很大。

樹(shù)結(jié)構(gòu)首先得排除,哈希表倒是可以做到常數(shù)階的性能,但數(shù)據(jù)量大了以后,一方面對(duì)哈希表的容量要求巨大,另一方面如何設(shè)計(jì)一個(gè)好的哈希算法能夠做到如此大量數(shù)據(jù)的哈希映射也是一個(gè)難題。

對(duì)于容量的問(wèn)題,考慮到只需要判斷對(duì)象是否存在,而并非拿到對(duì)象,我們可以將哈希表的表項(xiàng)大小設(shè)置為 1 個(gè) bit,1 表示存在,0 表示不存在,這樣大大縮小哈希表的容量。

而對(duì)于哈希算法的問(wèn)題,如果我們對(duì)哈希算法要求低一些,那哈希碰撞的機(jī)率就會(huì)增加。

那一個(gè)哈希算法容易沖突,那就多弄幾個(gè),多個(gè)哈希函數(shù)同時(shí)沖突的概率就小的多。

布隆過(guò)濾器就是基于這樣的設(shè)計(jì)思路:

當(dāng)設(shè)置對(duì)應(yīng)的 key-value 時(shí),按照一組哈希算法的計(jì)算,將對(duì)應(yīng)比特位置 1。

但當(dāng)對(duì)應(yīng)的 key-value 刪除時(shí),卻不能將對(duì)應(yīng)的比特位置 0,因?yàn)楸2粶?zhǔn)其他某個(gè) key 的某個(gè)哈希算法也映射到了同一個(gè)位置。

也正是因?yàn)檫@樣,引出了布隆過(guò)濾器的另外一個(gè)重要特點(diǎn):布隆過(guò)濾器判定存在的實(shí)際上不一定存在,但判定不存在的則一定不存在。

你們公司網(wǎng)站的內(nèi)容越來(lái)越多了,用戶對(duì)于快速全站搜索的需求日益強(qiáng)烈。這個(gè)時(shí)候,你需要:全文搜索技術(shù)。

全文搜索技術(shù)

對(duì)于一些簡(jiǎn)單的查詢需求,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)尚且可以應(yīng)付。但搜索需求一旦變得復(fù)雜起來(lái),比如根據(jù)文章內(nèi)容關(guān)鍵字、多個(gè)搜索條件但邏輯組合等情況下,數(shù)據(jù)庫(kù)就捉襟見(jiàn)肘了,這個(gè)時(shí)候就需要單獨(dú)的索引系統(tǒng)來(lái)進(jìn)行支持。

如今行業(yè)內(nèi)廣泛使用的 ElasticSearch(簡(jiǎn)稱 ES)就是一套強(qiáng)大的搜索引擎。集全文檢索、數(shù)據(jù)分析、分布式部署等優(yōu)點(diǎn)于一身,成為企業(yè)級(jí)搜索技術(shù)的首選。

ES 使用 RESTful 接口,使用 JSON 作為數(shù)據(jù)傳輸格式,支持多種查詢匹配,為各主流語(yǔ)言都提供了 SDK,易于上手。

另外,ES 常常和另外兩個(gè)開(kāi)源軟件 Logstash、Kibana 一起,形成一套日志收集、分析、展示的完整解決方案:ELK 架構(gòu)。

其中,Logstash 負(fù)責(zé)數(shù)據(jù)的收集、解析,ElasticSearch 負(fù)責(zé)搜索,Kibana 負(fù)責(zé)可視化交互,成為不少企業(yè)級(jí)日志分析管理的鐵三角。

無(wú)論我們?cè)趺磧?yōu)化,一臺(tái)服務(wù)器的力量終究是有限的。公司業(yè)務(wù)發(fā)展迅猛,原來(lái)的服務(wù)器已經(jīng)不堪重負(fù),于是公司采購(gòu)了多臺(tái)服務(wù)器,將原有的服務(wù)都部署了多份,以應(yīng)對(duì)日益增長(zhǎng)的業(yè)務(wù)需求。

現(xiàn)在,同一個(gè)服務(wù)有多個(gè)服務(wù)器在提供服務(wù)了,需要將用戶的請(qǐng)求均衡的分?jǐn)偟礁鱾€(gè)服務(wù)器上,這個(gè)時(shí)候,你需要:負(fù)載均衡技術(shù)。

負(fù)載均衡技術(shù)

顧名思義,負(fù)載均衡意為將負(fù)載均勻平衡分配到多個(gè)業(yè)務(wù)節(jié)點(diǎn)上去。

和緩存技術(shù)一樣,負(fù)載均衡技術(shù)同樣存在于計(jì)算機(jī)世界到各個(gè)角落。

按照均衡實(shí)現(xiàn)實(shí)體,可以分為軟件負(fù)載均衡(如 LVS、Nginx、HAProxy)和硬件負(fù)載均衡(如 A10、F5)。

按照網(wǎng)絡(luò)層次,可以分為四層負(fù)載均衡(基于網(wǎng)絡(luò)連接)和七層負(fù)載均衡(基于應(yīng)用內(nèi)容)。

按照均衡策略算法,可以分為輪詢均衡、哈希均衡、權(quán)重均衡、隨機(jī)均衡或者這幾種算法相結(jié)合的均衡。

而對(duì)于現(xiàn)在遇到等問(wèn)題,可以使用 Nginx 來(lái)實(shí)現(xiàn)負(fù)載均衡,Nginx 支持輪詢、權(quán)重、IP 哈希、最少連接數(shù)目、最短響應(yīng)時(shí)間等多種方式的負(fù)載均衡配置。

輪詢:

  1. upstream web-server { 
  2.     server 192.168.1.100; 
  3.     server 192.168.1.101; 

權(quán)重:

  1. upstream web-server { 
  2.     server 192.168.1.100 weight=1; 
  3.     server 192.168.1.101 weight=2; 

IP 哈希值:

  1. upstream web-server { 
  2.     ip_hash; 
  3.     server 192.168.1.100 weight=1; 
  4.     server 192.168.1.101 weight=2; 

最少連接數(shù)目:

  1. upstream web-server { 
  2.     least_conn; 
  3.     server 192.168.1.100 weight=1; 
  4.     server 192.168.1.101 weight=2; 

最短響應(yīng)時(shí)間:

  1. upstream web-server { 
  2.     server 192.168.1.100 weight=1; 
  3.     server 192.168.1.101 weight=2; 
  4.     fair;   

總結(jié)

高性能是一個(gè)永恒的話題,其涉及的技術(shù)和知識(shí)面其實(shí)遠(yuǎn)不止上面列出的這些。

從物理硬件 CPU、內(nèi)存、硬盤、網(wǎng)卡到軟件層面的通信、緩存、算法、架構(gòu)每一個(gè)環(huán)節(jié)的優(yōu)化都是通往高性能的道路。

路漫漫其修遠(yuǎn)兮,吾將上下而求索。

作者:軒轅之風(fēng)

編輯:陶家龍

出處:轉(zhuǎn)載自公眾號(hào)編程技術(shù)宇宙(ID:xuanyuancoding)

 

責(zé)任編輯:武曉燕 來(lái)源: 編程技術(shù)宇宙
相關(guān)推薦

2020-10-15 14:50:24

寄存器CPU部件

2021-04-02 10:07:19

Chrome瀏覽器插件

2021-01-26 00:32:59

chrome插件瀏覽器

2013-07-31 10:17:44

備份災(zāi)備

2013-07-31 09:55:51

高性能備份災(zāi)備

2021-06-17 08:05:59

SpringBoot條件裝配

2020-07-10 06:10:14

Python開(kāi)發(fā)代碼

2009-06-17 10:13:03

提高EJB性能

2024-08-06 16:31:32

2009-07-30 10:28:56

Web高性能開(kāi)發(fā)

2014-10-28 16:11:37

AndroidApp性能優(yōu)化

2013-02-20 13:37:54

Android開(kāi)發(fā)性能

2009-06-29 19:13:54

VMware ESX虛擬化虛擬機(jī)

2013-06-21 14:36:02

JavaEEx性能

2013-07-25 14:56:37

JavaEE 性能

2020-12-29 14:47:01

人工智能機(jī)器學(xué)習(xí)交通

2023-04-10 15:47:42

PythonGUI 庫(kù)開(kāi)發(fā)

2014-12-15 14:59:38

2021-09-26 10:14:16

ITIT領(lǐng)導(dǎo)IT管理

2024-04-18 11:07:30

C++語(yǔ)言
點(diǎn)贊
收藏

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

亚洲字幕一区二区| 在线观看成人黄色| 男人天堂1024| 噜噜噜在线观看播放视频| 老司机精品视频一区二区三区| 日韩中文字幕网址| 中文字幕a在线观看| 高清电影一区| 亚洲视频综合在线| 免费在线观看一区二区| 一二三四区视频| 在线观看不卡| 中文字幕亚洲一区在线观看 | 2021天堂中文幕一二区在线观| 久久久国产精品午夜一区ai换脸| 成人美女av在线直播| 久久草视频在线| 亚洲国产精品综合久久久| 国产午夜精品久久久| 中文字幕第一页在线视频| 亚洲性受xxx喷奶水| 亚洲精品乱码久久久久久黑人| 久久香蕉综合色| 精品久久久免费视频| 久久久久国产一区二区| 欧美激情日韩图片| 国产黄a三级三级| 一本久久青青| 亚洲а∨天堂久久精品9966 | 日本一级黄色大片| 国产精品不卡| 有码中文亚洲精品| 在线观看国产免费视频| 欧美专区一区| 91超碰这里只有精品国产| 能在线观看的av网站| 超碰在线最新网址| 亚洲激情图片一区| 人人妻人人澡人人爽精品欧美一区| 欧洲伦理片一区 二区 三区| 成人性生交大片免费| 亚洲影视中文字幕| 国产麻豆免费观看| 免费av成人在线| 国产成人在线一区| 日本a级c片免费看三区| 一本久道久久综合狠狠爱| 欧美日本精品在线| 欧美成人精品一区二区免费看片| 菠萝蜜一区二区| 亚洲性猛交xxxxwww| 成人午夜福利一区二区| 亚洲春色h网| 日韩精品久久久久久久玫瑰园 | 国产午夜精品福利| 久久婷婷人人澡人人喊人人爽| 噜噜噜久久,亚洲精品国产品| 国产99久久久国产精品潘金| 91视频网页| 亚洲成人一二三区| 国产成人av电影在线播放| 99re视频在线观看| 国产77777| 99久久国产免费看| 欧美18视频| 国产视频第一区| 国产精品视频免费| 伊人久久大香线蕉av一区| 麻豆传媒视频在线观看| 最新不卡av在线| 成人国产一区二区三区| heyzo高清中文字幕在线| 一区二区三区免费看视频| 亚洲色欲久久久综合网东京热| 日本高清在线观看视频| 香蕉影视欧美成人| 欧美视频免费播放| 韩国理伦片久久电影网| 7777精品伊人久久久大香线蕉| 992tv人人草| 国产成人在线中文字幕| 精品亚洲一区二区三区四区五区| www.中文字幕av| 91麻豆国产自产在线观看亚洲| 欧美成人自拍视频| 久久青青草视频| 久久精品99国产精品| 9a蜜桃久久久久久免费| 人妻va精品va欧美va| 国产视频一区不卡| 男人的天堂成人| 国产直播在线| 欧美精品粉嫩高潮一区二区| 无码任你躁久久久久久老妇| 精品国产91乱码一区二区三区四区| 色系列之999| 香蕉免费毛片视频| 久久国产精品区| 国产日韩精品推荐| 国内在线免费高清视频| 亚洲精品精品亚洲| 欧美 激情 在线| 秋霞一区二区| 在线观看国产精品淫| 久久97人妻无码一区二区三区| 奶水喷射视频一区| 成人av男人的天堂| www日韩tube| 香蕉乱码成人久久天堂爱免费| 人人干人人干人人| 国产欧美自拍一区| 久久久97精品| 天堂av免费在线观看| 成人综合婷婷国产精品久久蜜臀 | 69174成人网| 国产在线中文字幕| 亚洲国产精品尤物yw在线观看| 无限资源日本好片| 色爱av综合网| 久久久久久久影院| 国产精品特级毛片一区二区三区| 2024国产精品| 久久人人爽人人爽人人av| 少妇高潮一区二区三区99| 日韩精品在线视频美女| 久久激情免费视频| 国产综合色产在线精品| 涩涩涩999| 亚洲深夜视频| 亚洲精品www久久久久久广东| 亚洲色图综合区| 久久精品国产秦先生| 日本一区二区精品视频| 乡村艳史在线观看| 亚洲成人a**站| 国产在线观看你懂的| 国内精品视频666| 亚洲综合网中心| 97欧美成人| 亚洲人永久免费| 亚洲欧美一区二区三区在线观看| 92国产精品观看| 亚洲 高清 成人 动漫| 另类视频一区二区三区| 免费av一区二区| 国产精品无码在线播放| 中文字幕一区二区三中文字幕| 人人干人人视频| 国产亚洲一区| 91免费观看在线| 在线免费看av不卡| 99精品人妻国产毛片| 99久久国产综合色|国产精品| 国产69精品久久久久久久| 国产精品毛片久久久| 国内免费精品永久在线视频| 天天操天天干天天舔| 精品国产乱码久久久久久天美| 亚洲调教欧美在线| 久久久久久久欧美精品| 日本10禁啪啪无遮挡免费一区二区| 亚洲十八**毛片| 亚洲性69xxxbbb| 91亚洲视频在线观看| 亚洲色图丝袜美腿| www.色.com| 激情亚洲网站| 日本公妇乱淫免费视频一区三区| 2019年精品视频自拍| 久久久精品一区二区| av男人天堂av| 精品国产1区2区| 亚洲精品一区二区三区影院忠贞| 激情文学综合插| 99热久久这里只有精品| 中文有码一区| 91在线观看免费观看| 77thz桃花论族在线观看| 亚洲欧美综合另类中字| 97国产精品久久久| 亚洲最快最全在线视频| 丰满少妇高潮一区二区| 久草这里只有精品视频| 精品无码国模私拍视频| 人人狠狠综合久久亚洲婷婷| 亚洲一区二区在线播放| 在线人成日本视频| 久久精品国产96久久久香蕉| 亚洲精品国产精| 欧洲精品中文字幕| 久视频在线观看| 国产精品美女视频| 中文字幕三级电影| 久久精品国产成人一区二区三区 | 三级久久三级久久| 中日韩在线视频| 国产精品调教| 精品中文字幕视频| 久草在线免费福利资源| 91.com在线观看| 久久久久亚洲av成人毛片韩| 国产精品入口麻豆原神| 国产白袜脚足j棉袜在线观看| 国产精品日韩久久久| 免费成人深夜夜行网站视频| 精品福利网址导航| 国产精品亚洲аv天堂网| 精品国产丝袜高跟鞋| 亚洲国产精品久久久久秋霞蜜臀| 日韩国产成人在线| 一区二区高清视频在线观看| 人成免费在线视频| 成av人片一区二区| 日本免费色视频| 性高湖久久久久久久久| 妞干网视频在线观看| 日韩在线高清| 久热国产精品视频一区二区三区| 日韩制服诱惑| 欧美做爰性生交视频| 国产在线69| 一本一道久久a久久精品逆3p | 亚洲免费影视第一页| 精品久久久久久亚洲综合网站| 91搞黄在线观看| 日韩色图在线观看| 亚洲综合男人的天堂| 国产人与禽zoz0性伦| 不卡的av电影在线观看| 原创真实夫妻啪啪av| 免费成人在线网站| 日韩黄色片视频| 日韩亚洲在线| 国产高清不卡无码视频| 亚洲影视一区| 曰韩不卡视频| 欧美**vk| 精品欧美国产| 亚洲一区 二区| 日本一区二区三区四区视频| 国产精选在线| 欧美精品久久久久久久免费观看 | 中文字幕一区在线| 久久精品无码一区| www.久久精品| 欧美日韩人妻精品一区在线| 国产精品夜夜爽| 国产乱码一区二区三区四区| 国产一区二区三区国产| 在线观看免费不卡av| 免费成人你懂的| 日本特黄a级片| 国产在线精品免费av| 色www免费视频| 男男视频亚洲欧美| 中文字幕国产高清| 黑人精品欧美一区二区蜜桃| 国产精品久久久毛片| 免费视频最近日韩| 能看的毛片网站| 精品一区二区影视| 在线一区二区不卡| 国产综合久久久久久久久久久久| 在线播放黄色av| 狠狠久久亚洲欧美| 亚洲一区二区图片| 国产成人精品综合在线观看| 午夜av免费看| 久久久久国产精品麻豆| 久久丫精品忘忧草西安产品| 亚洲三级在线看| 免费在线黄色片| 亚洲成va人在线观看| 国产 日韩 欧美 成人| 姬川优奈aav一区二区| 六月丁香激情综合| 在线观看国产一区二区| 国产乱码精品一区二区三区精东| 日韩视频免费直播| 日韩在线观看视频一区二区三区| 亚洲石原莉奈一区二区在线观看| 成人福利在线| 久久国产精品久久精品| 第四色日韩影片| 国产精品美女www| 国产精品亚洲欧美日韩一区在线 | 国产一区不卡| 亚洲欧洲精品一区二区三区波多野1战4 | 激情偷拍久久| 人人爽人人av| 国产剧情av麻豆香蕉精品| 久久久久亚洲AV成人网人人小说| 2020国产精品久久精品美国| 亚洲女人毛茸茸高潮| 一区二区三区欧美| 日韩一区二区视频在线| 欧美一卡二卡在线| 五月婷婷丁香网| 最新中文字幕亚洲| 丝袜老师在线| 亚洲永久在线观看| 日韩精品丝袜美腿| 精品无码av无码免费专区| 免费在线欧美黄色| 亚洲国产日韩在线一区| 欧美激情一区二区三区四区| 欧美激情国产精品免费| 色综合色综合色综合| 无码人妻丰满熟妇精品区| 精品国产乱码久久| 岛国最新视频免费在线观看| 欧美黑人巨大xxx极品| 97欧美成人| 精品国产一区二区三区免费| 久久精品播放| 久草在在线视频| 不卡的av在线播放| 国产高清视频免费在线观看| 在线免费观看日本欧美| 亚洲欧美高清视频| 日韩中文字幕免费视频| 悠悠资源网亚洲青| 91日韩久久| 999视频精品| 丁香啪啪综合成人亚洲| 成人免费视频视频| 51精品免费网站| 亚洲高清在线视频| 亚洲高清视频网站| 久久精品国产亚洲| 三上悠亚国产精品一区二区三区| 国产一区免费在线观看| 欧美在线亚洲| 网站一区二区三区| 久久精品在线观看| xxxx.国产| 日韩欧美一卡二卡| 欧美人xxxxx| 精品久久免费视频| 欧美丰满少妇xxxbbb| 91精彩视频在线播放| 欧美一乱一性一交一视频| 日韩三级一区| 亚洲一区在线免费| 日韩电影一二三区| 最近日本中文字幕| 日韩欧美国产成人| 天天综合网天天综合| 九色精品免费永久在线| 91精品导航| 激情五月婷婷六月| 福利视频网站一区二区三区| 国产这里有精品| 日韩三级在线观看| 黄色在线视频网站| 亚洲影影院av| 欧美精品18| 精品国产av色一区二区深夜久久| 午夜影院久久久| 三区在线观看| 国产精品爱久久久久久久| 欧美人与牛zoz0性行为| 日韩欧美在线免费观看视频| 中文字幕+乱码+中文字幕一区| 日本中文字幕在线观看视频| 亚洲欧美www| 日本午夜精品久久久久| 亚洲看片网站| 久久99深爱久久99精品| 欧美手机在线观看| 日韩一级大片在线| 国产色播av在线| 欧美亚洲另类在线一区二区三区| 久久国产精品亚洲77777| 91麻豆精品久久毛片一级| 欧美老肥妇做.爰bbww| 黄色在线免费网站| 久久久久综合一区二区三区| 快she精品国产999| 美女网站视频色| 精品国产不卡一区二区三区| 日韩脚交footjobhdboots| 久久爱av电影| 老司机精品视频导航| 久久久久免费看| 永久免费毛片在线播放不卡| 亚洲人成网站在线在线观看| 妺妺窝人体色www看人体| 久久精品视频一区| 国产精品-色哟哟| 久久久噜久噜久久综合| 日韩成人精品一区| avtt中文字幕| 欧美日韩精品在线视频| 免费在线观看av| 国产亚洲情侣一区二区无| 奇米色一区二区三区四区| 欧美日韩人妻精品一区二区三区 | 免费大片在线观看| 日本一区免费视频|