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

APCu高速共享緩存插件分享,性能超越Redis達10倍!

數據庫 Redis
與Pub/Sub相同,只不過發布消息使用Cache::ChPublish('test', '這是一個測試消息', true);, 當發布消息指定workerId時,可以實現類似Redis-Stream Group的功能。

前言

今年接觸了一個策略類手游相關的項目,后端本身計劃是使用skynet進行開發的,后來結合項目的時間緊急程度和客戶端開發組討論后決定使用PHP進行快速開發,后期再使用其他語言框架進行拆分業務;綜合考慮最后選用了webman作為主要開發框架。

整體項目分為配置服務、HTTP-API服務、websocket服務三大部分,其中配置管理主要是兼容客戶端生成的配置數據進行導入導出轉換加載,底層使用MySQL進行儲存,多服務間使用Redis進行一級緩存,服務進程間使用了基于APCu的共享緩存,后期我將該共享緩存組件化也貢獻給了社區。

【workbunny】共享高速緩存 https://www.workerman.net/plugin/133

Redis

在游戲開發界實際上使用Redis的情況還是比較多的,我們使用Redis主要還是為了將一些數據緩存共享給各個服務器實例:

┌─────┐                                       ┌─────┐
     |  A  | ────────────>  service  <──────────── |  B  |
     └─────┘                                       └─────┘
    /   |   \                                     /   |   \
┌───┐ ┌───┐ ┌───┐                             ┌───┐ ┌───┐ ┌───┐
| a | | b | | c | ───────>  instance <─────── | a | | b | | c |
└───┘ └───┘ └───┘                             └───┘ └───┘ └───┘
  |     |     |                                 |     |     |
 1|2   1|2   1|2 ────────>  process  <──────── 1|2   1|2   1|2
 3|4   3|4   3|4                               3|4   3|4   3|4

如圖所示,我們分為A/B區服,每個區服下可能存在abc不同的服務器實例,他們需要共享相同的區服配置;每個區服各自管理自己的數據庫數據區域/數據庫實例;每個區服下的服務器實例對于數據庫數據的要求是強需求,且為變動較為頻繁的數據內容,與web的微服務有區別,所以我們沒有使用類似Nacos或者其他配置中心進行處理,從而用更適配當前場景的Redis作為緩存服務。

同時Redis也可以作為用戶登錄鑒權相關中的一環,也可以為運營相關功能提供一些輔助,比如使用Redis-Stream作為消息隊列,處理一些事件通知等。

共享內存

在游戲開發中,許多業務都是在內存中進行的計算處理,而我們上述的模式是多進程模式,進程間通訊是一個比較頻繁出現的點;一開始解決這個問題是粗暴的將一些固定業務固定在對應的進程上執行,盡可能避免進程間的通訊問題。

后來隨著業務逐步的擴大,單純限制業務是沒辦法完全實現的,這時候有考慮過使用webman的插件channel;但實際上channel基于socket涉及系統內核態用戶態的拷貝等問題,同時受網絡影響受限,在一些業務的計算處理上會帶來比較高的延遲,包括Redis也同樣是這樣的問題,我們需要實現數據的零拷貝。

后續我們的目標鎖定在了共享內存上,因為共享內存可以輕易的在進程間進行通訊交換,而且不存在深拷貝和網絡等問題,效率、性能非常的高,整體微秒級別的響應滿足我們的需求;于是我基于PHP的拓展APCu封裝了適合我們業務場景的插件包進行使用。

webman-shared-cache

我們的基礎應用實現了定時器來從MySQL數據庫讀取配置信息,定時器的處理器也在讀取數據刷入Redis的同時觸發共享內存的更新事件,上層業務通過更新事件的回調出發會將Redis的數據刷入共享內存中,以便當前區服實例的各個進程能夠使用。

我們使用緩存的場景很多都是MAP數據,所以我在實現插件的時候特別實現了類似Redis-Hash相關的功能:HSet/HGet/HDel/HKeys/HExists。

由于我們需要一些自增自減的運算,所以也實現了以下功能點:HIncr/HDecr 支持浮點運算。由于APCu的特性所以儲存的數據也是支持儲存對象數據的;

webman-shared-cache為何使用鎖?

APCu(Alternative PHP Cache User Cache)是一個開放源代碼的PHP緩存擴展,它提供了一種在PHP應用程序中存儲和檢索數據的快速方法。它是APC(Alternative PHP Cache)的繼任者,專注于用戶數據的緩存,而不是opcode緩存。

之前我有和社區的同學們聊過,他們不是很理解為什么我在實現插件的時候自己使用了鎖,這是因為APCu本身的自行實現了對它自身函數的原子性操作,但我們使用它的時候是在多進程的環境下,每一個進程內存在多次APCu的操作,為了業務的原子性,我們希望這多次的操作要在一個原子性內完成,所以需要一個鎖來進行隔離,以免在多進程的環境下被其他進程的操作污染,整體是類似MySQl的事務的:

protected static function _HIncr(string $key, string|int $hashKey, int|float $hashValue = 1): bool|int|float
{
    $func = __FUNCTION__;
    $result = false;
    $params = func_get_args();
    self::_Atomic($key, function () use (
        $key, $hashKey, $hashValue, $func, $params, &$result
    ) {
        $hash = self::_Get($key, []);
        if (is_numeric($v = ($hash[$hashKey] ?? 0))) {
            $hash[$hashKey] = $result = $v + $hashValue;
            self::_Set($key, $hash);
        }
        return [
            'timestamp' => microtime(true),
            'method'    => $func,
            'params'    => $params,
            'result'    => null
        ];
    }, true);
    return $result;
}

比如上述代碼,就是一個Hash key的自增操作,我們需要在讀取Hash后在寫入,讀取和寫入應為一體的;

原子性執行函數Atomic的實現如下:

/**
     * 原子操作
     *  - 無法對鎖本身進行原子性操作
     *  - 只保證handler是否被原子性觸發,對其邏輯是否拋出異常不負責
     *  - handler盡可能避免超長阻塞
     *  - lockKey會被自動設置特殊前綴#lock#,可以通過Cache::LockInfo進行查詢
     *
     * @param string $lockKey
     * @param Closure $handler
     * @param bool $blocking
     * @return bool
     */
    protected static function _Atomic(string $lockKey, Closure $handler, bool $blocking = false): bool
    {
        $func = __FUNCTION__;
        $result = false;
        if ($blocking) {
            $startTime = time();
            while ($blocking) {
                // 阻塞保險
                if (time() >= $startTime + self::$fuse) {return false;}
                // 創建鎖
                apcu_entry($lock = self::GetLockKey($lockKey), function () use (
                    $lockKey, $handler, $func, &$result, &$blocking
                ) {
                    $res = call_user_func($handler);
                    $result = true;
                    $blocking = false;
                    return [
                        'timestamp' => microtime(true),
                        'method'    => $func,
                        'params'    => [$lockKey, '\Closure'],
                        'result'    => $res
                    ];
                });
            }
        } else {
            // 創建鎖
            apcu_entry($lock = self::GetLockKey($lockKey), function () use (
                $lockKey, $handler, $func, &$result
            ) {
                $res = call_user_func($handler);
                $result = true;
                return [
                    'timestamp' => microtime(true),
                    'method'    => $func,
                    'params'    => [$lockKey, '\Closure'],
                    'result'    => $res
                ];
            });
        }
        if ($result) {
            apcu_delete($lock);
        }
        return $result;
    }

當使用阻塞模式的時候,我們會在當前進程內使用一個while循環來進行阻塞搶占,為了不將當前進程阻塞死,我們還加入了一個保險,由self::$fuse提供;

注意

這里在實踐過程中需要注意的是,Atomic在傳入回調函數時切勿再使用匿名函數作為參數值或者是通過use傳入一個匿名函數,如:

$fuc = function() {
    // do something
}
Cache::Atomic('test', function () use ($fuc) {
    // do anything
})

APCu底層會對函數參數值或引用參數進行序列化儲存,但匿名函數不可以被序列化,所以會拋出一個異常;但你可以通過當前對象的屬性值或者靜態屬性來保存一個匿名函數,然后在Atomic的回調內調用使用。

0.4.x版本

由于目前我使用Webman基于SQLite和共享內存在自行實現一個具備RAFT的輕調度服務插件和服務注冊與發現插件,所以特此為其完善增加了Channel特性;

Channel可以輔助實現類似Redis-List、Redis-stream、Redis-Pub/Sub的功能。

Channel

Channel是個特殊的數據格式,他的格式是固定如下的:

[
    '--default--' => [
        'futureId' => null,
        'value'    => []
    ],
    workerId_1 => [
        'futureId' => 1,
        'value'    => []
    ],
    workerId_2 => [
        'futureId' => 1,
        'value'    => []
    ],
    ......
]

它在共享內存中的鍵默認以**#Channel#**開頭。

  • --default--是默認儲存空間,workerId_1/workerId_2 等是子通道儲存空間,命名是由用戶代碼傳入的,這里建議使用workerman自帶的workerId即可。
  • 默認儲存空間和子通道儲存空間是互斥的,也就是說當存在子通道儲存空間時,是不存在--default--的,反之亦然;子通道儲存空間是當當前通道存在監聽器時生成的,而在監聽器產生前,消息會暫存在--default--空間,當監聽器創建時,--default--的數據value會被同步到子通道儲存空間內,加入value的隊頭。
  • 每一個子通道儲存空間的value都是拷貝的,存在相同的數據,各自監聽器監聽各自的子通道儲存空間;消息的發布支持向所有子通道發布,也可以指定子通道進行發布。
  • 監聽器的底層使用了workerman的定時器,區別與workerman的timer,在event驅動下定時器的間隔是0,也就是一個future,而其他的事件驅動是0.001s為間隔。

實現一個List

由于監聽器創建消費是基于workerId的,我們可以通過不同進程創建相同的workerId的監聽器來對同一個子通道進行監聽:

  1. A進程使用list作為workerId:
Cache::ChCreateListener('test', 'list', function(string $channelKey, string|int $workerId, mixed $message) {
// TODO 你的業務邏輯
});
  1. B進程也同樣創建list的workerId監聽器:
Cache::ChCreateListener('test', 'list', function(string $channelKey, string|int $workerId, mixed $message) {
// TODO 你的業務邏輯
});
  1. 此時Channel test的數據如下:
[
'list' => [
    'futureId' => 1,
    'value'    => []
],
......
]

注意:共享內存中儲存的futureId為最后一個監聽器創建的futureId;當當前進程需要對監聽器進行移除時,請勿使用該數據,對應進程內可以通過Cache::ChCreateListener()的返回值獲取到當前進程創建的futureId用于移除監聽器,不使用共享內存中儲存的futureId即可

  1. 這時任意進程通過Cache::ChPublish('test', '這是一個測試消息', true);發送消息,或者指定workerIdCache::ChPublish('test', '這是一個測試消息', true, 'list');。

實現一個Pub/Sub

  1. A進程使用workerman的workerId作為workerId:
Cache::ChCreateListener('test', $worker->id, function(string $channelKey, string|int $workerId, mixed $message) {
// TODO 你的業務邏輯
});
  1. B進程使用workerman的workerId作為workerId:
Cache::ChCreateListener('test', $worker->id, function(string $channelKey, string|int $workerId, mixed $message) {
// TODO 你的業務邏輯
});
  1. 此時Channel test的數據可能如下:
[
1 => [
    'futureId' => 1,
    'value'    => []
],
2 => [
    'futureId' => 1,
    'value'    => []
]
]
  1. 這時,任意進程通過Cache::ChPublish('test', '這是一個測試消息', false);發送消息即可。

注:發送消息第三個參數使用false時,如發送時還未創建監聽器,消息則不會儲存至Channel,即監聽后才可存在消息

實現類似Redis-stream

與Pub/Sub相同,只不過發布消息使用Cache::ChPublish('test', '這是一個測試消息', true);, 當發布消息指定workerId時,可以實現類似Redis-Stream Group的功能。

注:這里更復雜的功能可能需要對workerId進行變通,不能簡單使用workerman自帶的workerId,只需要自行規劃好即可

責任編輯:武曉燕 來源: 開源技術小棧
相關推薦

2020-07-11 09:25:15

Python編程語言代碼

2011-07-01 10:11:39

2020-05-28 13:20:49

算法谷歌性能

2014-03-26 10:00:06

RailsRails性能

2024-10-29 08:21:05

2024-08-23 11:38:05

2020-03-26 12:38:15

代碼節點數據

2025-05-27 01:55:00

TypeScript開發者項目

2020-07-21 15:40:55

NginxJava服務器

2020-07-22 08:30:02

代碼開發工具

2020-06-29 07:43:12

緩存RedisSpringBoot

2018-08-23 17:45:52

2013-04-01 00:16:41

飛魚星無線云無線AP

2019-09-26 08:33:51

Nginx技術Java

2016-12-15 14:21:52

2014-07-17 14:08:37

阿里云

2023-03-22 13:53:26

芯片英偉達

2020-10-29 09:06:56

開發工具技術

2018-01-19 09:00:37

2024-10-29 10:30:57

點贊
收藏

51CTO技術棧公眾號

国产高中女学生第一次| 天天躁夜夜躁狠狠是什么心态| 在线看女人毛片| www.av精品| 国产精品高潮呻吟久久av野狼| 黄色精品视频在线观看| 精品嫩草影院| 欧美日韩一二三| www.夜夜爱| 北条麻妃在线| 懂色av中文字幕一区二区三区| 日本在线观看天堂男亚洲| 欧洲性xxxx| 精品久久对白| 欧美一二三区精品| 成人精品小视频| 国精一区二区三区| 国产精品久久久久久久久果冻传媒| 亚洲一区二区三区xxx视频| 欧美不卡视频在线观看| 香港欧美日韩三级黄色一级电影网站| 亚洲国产另类久久精品| 国内精品国产三级国产aⅴ久| 英国三级经典在线观看| 亚洲精品福利视频网站| 神马影院午夜我不卡影院| 成人乱码一区二区三区| 精品亚洲国产成人av制服丝袜| 2019中文字幕在线| 久久国产在线观看| 水蜜桃久久夜色精品一区| 亚洲欧美成人精品| 在线中文字日产幕| 成人黄色91| 欧美色区777第一页| 久久综合九色综合88i| 污污网站在线观看| 国产精品超碰97尤物18| 日韩欧美亚洲在线| 先锋av资源站| 成人aaaa免费全部观看| 亚洲a成v人在线观看| 中文字幕日韩三级| 老牛国产精品一区的观看方式| 国产做受高潮69| 国产在线拍揄自揄拍| 欧美 日韩 国产 一区| 色婷婷av一区二区三区在线观看 | 欧美爱爱视频| 在线观看91视频| 97xxxxx| 91九色国产在线播放| 亚洲自拍偷拍九九九| 国产专区在线视频| 在线黄色网页| 亚洲韩国一区二区三区| 91网站在线观看免费| 亚洲淫性视频| 亚洲一区二区三区视频在线 | 99视频在线精品国自产拍免费观看| 久久中文字幕一区| 黄色香蕉视频在线观看| 91亚洲国产| 久久精品影视伊人网| 国精产品久拍自产在线网站| 欧美3p在线观看| 超碰精品一区二区三区乱码| 深夜福利影院在线观看| 国产尤物精品| 57pao成人国产永久免费| 黑人精品无码一区二区三区AV| 亚洲综合二区| 国产精品久久久久久久久免费 | 日韩一级完整毛片| 日韩精品――色哟哟| 国产精品tv| 亚洲美女精品成人在线视频| 日本成人免费视频| 婷婷精品进入| 久久久久国产一区二区三区| 国产污污视频在线观看| 日韩高清在线电影| 成人高h视频在线| 好吊色一区二区三区| 97精品国产露脸对白| 亚洲不卡1区| 老司机精品视频在线观看6| 一区二区三区精品| 97av视频在线观看| 日本欧美在线| 亚洲国产一区二区三区在线观看| 欧美多人猛交狂配| 亚洲精品极品少妇16p| 性色av一区二区三区| 伊人久久中文字幕| 国产不卡在线一区| 日本在线高清视频一区| 成人免费看片| 色久综合一二码| 国产伦精品一区二区三区妓女下载| 韩国女主播一区二区三区| 亚洲欧美视频在线| 久久精品视频久久| 免播放器亚洲一区| 国产一区自拍视频| 欧美性天天影视| 欧美日韩午夜激情| 91蝌蚪视频在线| 久久av资源| 欧美精品在线免费播放| 超碰在线观看91| 丁香婷婷综合激情五月色| 亚洲精品高清视频| 中文av在线全新| 欧美一区二区美女| 黄色片网站免费| 亚洲啪啪91| 成人91视频| 日本在线免费| 色一区在线观看| 99re这里只有| 午夜国产一区| 成人激情免费在线| 岛国视频免费在线观看| 婷婷中文字幕综合| 人妻换人妻仑乱| 91视频综合| 国产精品久久久久久久一区探花| 神马电影在线观看| 国产精品久久三区| 不要播放器的av网站| 理论片一区二区在线| 欧美大片在线看| 国产特级aaaaaa大片| 中国av一区二区三区| 超碰网在线观看| 一本色道久久综合亚洲精品酒店 | 国产高清视频一区二区| 中文字幕亚洲欧美日韩高清| www五月天com| www国产精品av| 欧美黑人经典片免费观看| 91成人在线精品视频| 久久成人人人人精品欧| 国产裸体永久免费无遮挡| 国产精品久久久久7777按摩| 一区二区xxx| 高清精品视频| 亚洲三级影院| 麻豆乱码国产一区二区三区| 国产精品久久久久久久一区二区| 国产精品网友自拍| 国产wwwxx| 成人婷婷网色偷偷亚洲男人的天堂| 欧美在线视频免费| 青青草在线免费视频| 欧美性生交xxxxx久久久| 37p粉嫩大胆色噜噜噜| 免费在线欧美黄色| 日韩欧美一区二区在线观看| 成人黄页网站视频| 日韩视频欧美视频| 国产免费不卡av| 一区二区三区免费网站| 亚洲精品第二页| 国产精品亚洲综合久久| 青青草久久网络| 婷婷久久综合九色综合99蜜桃| www.日韩欧美| 午夜精品小视频| 午夜一区二区三区在线观看| 亚洲成人网在线播放| 日本系列欧美系列| 最新国产精品久久| 一区二区日韩| 欧美最猛性xxxx| 成人av一区| 日韩一区二区影院| 日本午夜视频在线观看| 国产精品视频yy9299一区| 日韩成人av免费| 亚洲国产综合在线看不卡| 蜜桃91精品入口| 福利视频一区| 午夜免费日韩视频| av在线电影院| 精品粉嫩aⅴ一区二区三区四区| 草久视频在线观看| 国产精品免费av| 亚洲av成人片无码| 麻豆精品在线观看| 精品无码国模私拍视频| 日韩欧美电影| 国产三区精品| 亚洲国产天堂| 欧美中文在线免费| gogogogo高清视频在线| 亚洲男人天堂2023| 国产女同91疯狂高潮互磨| 欧美日韩另类视频| 波多野结衣在线网址| 久久久久久久久久久黄色| 日本一本在线视频| 爽好多水快深点欧美视频| 做爰高潮hd色即是空| 免费av一区二区三区四区| 91免费看网站| 日本另类视频| 性欧美视频videos6一9| 18av在线视频| 在线亚洲午夜片av大片| 天天av天天翘| 日韩欧美国产一区二区三区| 中文字幕人成人乱码亚洲电影| 亚洲成a人v欧美综合天堂| 成人自拍小视频| 国产片一区二区| www.免费av| 成人精品鲁一区一区二区| 天天摸天天舔天天操| 久久久夜夜夜| 国模无码视频一区二区三区| 欧美日韩国产色综合一二三四| 欧美一级性视频| 成人动漫精品一区二区| 在线观看国产一级片| 国产亚洲网站| 成人免费毛片在线观看| 最新精品国产| 一级黄色录像免费看| 欧美亚洲国产精品久久| 俄罗斯精品一区二区三区| 亚洲一区二区小说| 国产精品啪视频| 色成人免费网站| 日韩免费不卡av| 香蕉伊大人中文在线观看| 欧美激情欧美激情| 污污片在线免费视频| 欧美猛交ⅹxxx乱大交视频| 日本在线观看网站| 中文字幕一区二区精品| www黄在线观看| 宅男66日本亚洲欧美视频| 成人免费在线电影| 视频在线观看一区二区| av网在线观看| www.99久久热国产日韩欧美.com| 98在线视频| 爽爽爽爽爽爽爽成人免费观看| 日本中文字幕在线视频| 日韩视频第一页| 国产秀色在线www免费观看| 久久精品精品电影网| а天堂中文在线官网| 久久色精品视频| 操你啦在线视频| 色综合男人天堂| 日本片在线看| 91精品国产色综合| 欧美精品日日操| 国产欧美一区二区三区视频 | 国产中文字幕一区二区三区| 日本视频精品一区| 日韩一区二区在线| 可以免费看的黄色网址| 黄色综合网站| 免费在线激情视频| 日韩成人免费在线| 国产精欧美一区二区三区白种人| 国产乱码精品1区2区3区| 日本少妇一级片| 2021中文字幕一区亚洲| 亚洲av毛片基地| 亚洲欧美偷拍三级| 日本在线视频中文字幕| 在线精品观看国产| 国产乱码一区二区| 亚洲精品按摩视频| 91啦中文在线| 欧美丰满老妇厨房牲生活| 成人短视频app| 国产日韩欧美成人| 久久a级毛片毛片免费观看| 日本一区二区三区四区高清视频| 天天色综合色| 久久久999视频| 精品一区二区av| 人妻少妇精品视频一区二区三区| 国产欧美日韩在线视频| 欧美黑吊大战白妞| 色婷婷激情一区二区三区| 国产黄色高清视频| 国产亚洲欧洲黄色| 精品精品导航| 国产精品免费久久久| 国产精品久久久久av蜜臀 | 欧美日韩三级电影在线| 日日摸日日碰夜夜爽av| 国产精品一区2区| 西西444www无码大胆| 一区二区三区毛片| 最近中文字幕av| 日韩av一区二区在线| 黄网页免费在线观看| 茄子视频成人在线| 成人性生交大片免费看96| 亚洲日本无吗高清不卡| 国产精品毛片在线看| 中文字幕第10页| 国产精品三级视频| 久久青青草原亚洲av无码麻豆 | 日韩美女在线观看一区| 久久99成人| 亚洲精品自在在线观看| 在线亚洲免费| 国产精品无码自拍| 亚洲欧洲av另类| 中文字幕日本视频| 日韩精品在线观看视频| 日本电影在线观看| 91久久久久久国产精品| 精品一区二区三区在线| 日韩av综合在线观看| 国产成人99久久亚洲综合精品| 国产在线观看免费视频软件| 欧美在线999| 久久久久久女乱国产| 97成人在线视频| 激情视频极品美女日韩| 97中文字幕在线| 国产成人在线免费| 欧美精品videos极品| 91精品婷婷国产综合久久竹菊| 99riav在线| 国产精品综合久久久| 成人av动漫在线观看| 天天碰免费视频| 国产偷v国产偷v亚洲高清| 欧美日韩一二三四区| 日韩经典中文字幕在线观看| 国产美女精品写真福利视频| 国产高清一区视频| 黄色成人在线网站| www.四虎精品| 五月天欧美精品| 少妇高潮一区二区三区99小说 | 色8久久影院午夜场| 久久综合九色99| 久久亚洲风情| 极品蜜桃臀肥臀-x88av| 欧美日韩的一区二区| 麻豆av免费在线观看| 亚洲一区二区三区四区视频| 欧美精品观看| 美女黄色一级视频| 天天射综合影视| 欧美日韩在线中文字幕| 国产suv精品一区二区| 成人精品电影| 在线看免费毛片| 悠悠色在线精品| 人妻与黑人一区二区三区| 91精品国产99| 精品久久久久久久久久久下田| 男操女免费网站| 亚洲三级理论片| 日韩一级在线播放| 日本韩国欧美精品大片卡二| 国产在线观看91一区二区三区| 九色porny自拍| 亚洲在线视频网站| 深夜福利在线观看直播| 国产精品久久久亚洲| 亚洲一区二区三区无吗| 波多野结衣一二三区| 91久久精品国产91性色tv| 91se在线| 波多野结衣一区二区三区在线观看| 亚洲免费激情| 9.1片黄在线观看| 精品国产污网站| 日韩电影大全网站| 亚洲最新免费视频| 成人av电影在线| 亚洲一区在线观| 久久免费少妇高潮久久精品99| 国产剧情在线观看一区| 亚洲在线观看网站| 色综合久久88色综合天天免费| 婷婷在线视频观看| 国产日本一区二区三区| 奇米影视一区二区三区小说| 久久久久成人精品无码| 亚洲欧美一区二区精品久久久| 国产精久久一区二区| 亚洲精品中文字幕无码蜜桃| 一区二区三区在线视频免费观看 | 国产成人福利av| 小泽玛利亚视频在线观看|