午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > Redis基于Bitmap實現用戶簽到功能

Redis基于Bitmap實現用戶簽到功能

熱門標簽:超呼電話機器人 魔獸2青云地圖標注 十堰營銷電銷機器人哪家便宜 日本中國地圖標注 宿遷便宜外呼系統平臺 鄭州人工智能電銷機器人系統 山東外呼銷售系統招商 北京400電話辦理收費標準 貴州電銷卡外呼系統

很多應用上都有用戶簽到的功能,尤其是配合積分系統一起使用。現在有以下需求:

  • 簽到1天得1積分,連續簽到2天得2積分,3天得3積分,3天以上均得3積分等。
  • 如果連續簽到中斷,則重置計數,每月重置計數。
  • 顯示用戶某月的簽到次數和首次簽到時間。
  • 在日歷控件上展示用戶每月簽到,可以切換年月顯示。
  • ...

功能分析

對于用戶簽到數據,如果直接采用數據庫存儲,當出現高并發訪問時,對數據庫壓力會很大,例如雙十一簽到活動。這時候應該采用緩存,以減輕數據庫的壓力,Redis是高性能的內存數據庫,適用于這樣的場景。

如果采用String類型保存,當用戶數量大時,內存開銷就非常大。

如果采用集合類型保存,例如Set、Hash,查詢用戶某個范圍的數據時,查詢效率又不高。

Redis提供的數據類型BitMap(位圖),每個bit位對應0和1兩個狀態。雖然內部還是采用String類型存儲,但Redis提供了一些指令用于直接操作BitMap,可以把它看作一個bit數組,數組的下標就是偏移量。

它的優點是內存開銷小,效率高且操作簡單,很適合用于簽到這類場景。缺點在于位計算和位表示數值的局限。如果要用位來做業務數據記錄,就不要在意value的值。

Redis提供了以下幾個指令用于操作BitMap:

命令 說明 可用版本 時間復雜度
SETBIT 對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)。 >= 2.2.0 O(1)
GETBIT 對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)。 >= 2.2.0 O(1)
BITCOUNT 計算給定字符串中,被設置為 1 的比特位的數量。 >= 2.6.0 O(N)
BITPOS 返回位圖中第一個值為 bit 的二進制位的位置。 >= 2.8.7 O(N)
BITOP 對一個或多個保存二進制位的字符串 key 進行位元操作。 >= 2.6.0 O(N)
BITFIELD BITFIELD 命令可以在一次調用中同時對多個位范圍進行操作。 >= 3.2.0 O(1)

考慮到每月要重置連續簽到次數,最簡單的方式是按用戶每月存一條簽到數據。Key的格式為 u:sign:{uid}:{yyyMM},而Value則采用長度為4個字節的(32位)的BitMap(最大月份只有31天)。BitMap的每一位代表一天的簽到,1表示已簽,0表示未簽。

例如 u:sign:1225:202101 表示ID=1225的用戶在2021年1月的簽到記錄

# 用戶1月6號簽到
SETBIT u:sign:1225:202101 5 1 # 偏移量是從0開始,所以要把6減1

# 檢查1月6號是否簽到
GETBIT u:sign:1225:202101 5 # 偏移量是從0開始,所以要把6減1

# 統計1月份的簽到次數
BITCOUNT u:sign:1225:202101

# 獲取1月份前31天的簽到數據
BITFIELD u:sign:1225:202101 get u31 0

# 獲取1月份首次簽到的日期
BITPOS u:sign:1225:202101 1 # 返回的首次簽到的偏移量,加上1即為當月的某一天

示例代碼

using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;

/**
* 基于Redis Bitmap的用戶簽到功能實現類
* 
* 實現功能:
* 1. 用戶簽到
* 2. 檢查用戶是否簽到
* 3. 獲取當月簽到次數
* 4. 獲取當月連續簽到次數
* 5. 獲取當月首次簽到日期
* 6. 獲取當月簽到情況
*/
public class UserSignDemo
{
    private IDatabase _db;

    public UserSignDemo(IDatabase db)
    {
        _db = db;
    }

    /**
     * 用戶簽到
     *
     * @param uid  用戶ID
     * @param date 日期
     * @return 之前的簽到狀態
     */
    public bool DoSign(int uid, DateTime date)
    {
        int offset = date.Day - 1;
        return _db.StringSetBit(BuildSignKey(uid, date), offset, true);
    }

    /**
     * 檢查用戶是否簽到
     *
     * @param uid  用戶ID
     * @param date 日期
     * @return 當前的簽到狀態
     */
    public bool CheckSign(int uid, DateTime date)
    {
        int offset = date.Day - 1;
        return _db.StringGetBit(BuildSignKey(uid, date), offset);
    }

    /**
     * 獲取用戶簽到次數
     *
     * @param uid  用戶ID
     * @param date 日期
     * @return 當前的簽到次數
     */
    public long GetSignCount(int uid, DateTime date)
    {
        return _db.StringBitCount(BuildSignKey(uid, date));
    }

    /**
     * 獲取當月連續簽到次數
     *
     * @param uid  用戶ID
     * @param date 日期
     * @return 當月連續簽到次數
     */
    public long GetContinuousSignCount(int uid, DateTime date)
    {
        int signCount = 0;
        string type = $"u{date.Day}";   // 取1號到當天的簽到狀態

        RedisResult result = _db.Execute("BITFIELD", (RedisKey)BuildSignKey(uid, date), "GET", type, 0);
        if (!result.IsNull)
        {
            var list = (long[])result;
            if (list.Length > 0)
            {
                // 取低位連續不為0的個數即為連續簽到次數,需考慮當天尚未簽到的情況
                long v = list[0];
                for (int i = 0; i  date.Day; i++)
                {
                    if (v >> 1  1 == v)
                    {
                        // 低位為0且非當天說明連續簽到中斷了
                        if (i > 0) break;
                    }
                    else
                    {
                        signCount += 1;
                    }
                    v >>= 1;
                }
            }
        }
        return signCount;
    }

    /**
     * 獲取當月首次簽到日期
     *
     * @param uid  用戶ID
     * @param date 日期
     * @return 首次簽到日期
     */
    public DateTime? GetFirstSignDate(int uid, DateTime date)
    {
        long pos = _db.StringBitPosition(BuildSignKey(uid, date), true);
        return pos  0 ? null : date.AddDays(date.Day - (int)(pos + 1));
    }

    /**
     * 獲取當月簽到情況
     *
     * @param uid  用戶ID
     * @param date 日期
     * @return Key為簽到日期,Value為簽到狀態的Map
     */
    public Dictionarystring, bool> GetSignInfo(int uid, DateTime date)
    {
        Dictionarystring, bool> signMap = new Dictionarystring, bool>(date.Day);
        string type = $"u{GetDayOfMonth(date)}";
        RedisResult result = _db.Execute("BITFIELD", (RedisKey)BuildSignKey(uid, date), "GET", type, 0);
        if (!result.IsNull)
        {
            var list = (long[])result;
            if (list.Length > 0)
            {
                // 由低位到高位,為0表示未簽,為1表示已簽
                long v = list[0];
                for (int i = GetDayOfMonth(date); i > 0; i--)
                {
                    DateTime d = date.AddDays(i - date.Day);
                    signMap.Add(FormatDate(d, "yyyy-MM-dd"), v >> 1  1 != v);
                    v >>= 1;
                }
            }
        }
        return signMap;
    }

    private static string FormatDate(DateTime date)
    {
        return FormatDate(date, "yyyyMM");
    }

    private static string FormatDate(DateTime date, string pattern)
    {
        return date.ToString(pattern);
    }

    /**
     * 構建簽到Key
     *
     * @param uid  用戶ID
     * @param date 日期
     * @return 簽到Key
     */
    private static string BuildSignKey(int uid, DateTime date)
    {
        return $"u:sign:{uid}:{FormatDate(date)}";
    }

    /**
     * 獲取月份天數
     *
     * @param date 日期
     * @return 天數
     */
    private static int GetDayOfMonth(DateTime date)
    {
        if (date.Month == 2)
        {
            return 28;
        }
        if (new int[] { 1, 3, 5, 7, 8, 10, 12 }.Contains(date.Month))
        {
            return 31;
        }
        return 30;
    }

    static void Main(string[] args)
    {
        ConnectionMultiplexer connection = ConnectionMultiplexer.Connect("192.168.0.104:7001,password=123456");

        UserSignDemo demo = new UserSignDemo(connection.GetDatabase());
        DateTime today = DateTime.Now;
        int uid = 1225;

        { // doSign
            bool signed = demo.DoSign(uid, today);
            if (signed)
            {
                Console.WriteLine("您已簽到:" + FormatDate(today, "yyyy-MM-dd"));
            }
            else
            {
                Console.WriteLine("簽到完成:" + FormatDate(today, "yyyy-MM-dd"));
            }
        }

        { // checkSign
            bool signed = demo.CheckSign(uid, today);
            if (signed)
            {
                Console.WriteLine("您已簽到:" + FormatDate(today, "yyyy-MM-dd"));
            }
            else
            {
                Console.WriteLine("尚未簽到:" + FormatDate(today, "yyyy-MM-dd"));
            }
        }

        { // getSignCount
            long count = demo.GetSignCount(uid, today);
            Console.WriteLine("本月簽到次數:" + count);
        }

        { // getContinuousSignCount
            long count = demo.GetContinuousSignCount(uid, today);
            Console.WriteLine("連續簽到次數:" + count);
        }

        { // getFirstSignDate
            DateTime? date = demo.GetFirstSignDate(uid, today);
            if (date.HasValue)
            {
                Console.WriteLine("本月首次簽到:" + FormatDate(date.Value, "yyyy-MM-dd"));
            }
            else
            {
                Console.WriteLine("本月首次簽到:無");
            }
        }

        { // getSignInfo
            Console.WriteLine("當月簽到情況:");
            Dictionarystring, bool> signInfo = new Dictionarystring, bool>(demo.GetSignInfo(uid, today));
            foreach (var entry in signInfo)
            {
                Console.WriteLine(entry.Key + ": " + (entry.Value ? "√" : "-"));
            }
        }
    }
}

運行結果

 

更多應用場景

  • 統計活躍用戶:把日期作為Key,把用戶ID作為offset,1表示當日活躍,0表示當日不活躍。還能使用位計算得到日活、月活、留存率等數據。
  • 用戶在線狀態:跟統計活躍用戶一樣。

總結

  • 位圖優點是內存開銷小,效率高且操作簡單;缺點是位計算和位表示數值的局限。
  • 位圖適合二元狀態的場景,例如用戶簽到、在線狀態等場景。
  • String類型最大長度為512M。 注意SETBIT時的偏移量,當偏移量很大時,可能會有較大耗時。 位圖不是絕對的好,有時可能更浪費空間。
  • 如果位圖很大,建議分拆鍵。如果要使用BITOP,建議讀取到客戶端再進行位計算。

參考資料

基于Redis位圖實現用戶簽到功能

Redis 深度歷險:核心原理與應用實踐

Redis:Bitmap的setbit,getbit,bitcount,bitop等使用與應用場景

BITFIELD SET command is not working

到此這篇關于Redis基于Bitmap實現用戶簽到功能的文章就介紹到這了,更多相關Redis Bitmap用戶簽到內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 基于Redis位圖實現用戶簽到功能
  • java redis 實現簡單的用戶簽到功能

標簽:大慶 江蘇 臺州 朝陽 果洛 吉安 楊凌 北京

巨人網絡通訊聲明:本文標題《Redis基于Bitmap實現用戶簽到功能》,本文關鍵詞  Redis,基于,Bitmap,實現,用戶,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Redis基于Bitmap實現用戶簽到功能》相關的同類信息!
  • 本頁收集關于Redis基于Bitmap實現用戶簽到功能的相關信息資訊供網民參考!
  • 推薦文章
    亚洲精品久久久久久久久久久| 捆绑调教一区二区三区| 91麻豆精品国产91久久久久久| 国产精品久久久久久免费观看| 91成人福利视频| 亚洲欧美日韩中文播放| 国产欧美日韩中文字幕在线| 性农村xxxxx小树林| 成人自拍视频在线| 69久久夜色精品国产7777| 国产二级一片内射视频播放| 欧美性大战xxxxx久久久| 视频一区视频二区视频| jizz国产在线观看| 337p亚洲精品色噜噜| 免费看日本黄色| 久久激情视频| 在线视频中文亚洲| 国产精品熟女一区二区不卡| 高清在线成人网| 97在线免费视频| 久久婷婷一区二区| 5566中文字幕一区二区电影 | xxxx国产视频| av电影天堂一区二区在线观看| 国产成人精品免高潮在线观看| 少妇av片在线观看| 亚洲成人av在线电影| 亚洲综合网中心| 一卡二卡三卡在线| 正在播放亚洲1区| japanese在线观看| 国产精品久久久久久亚洲毛片| 成人在线观看av| 一本色道久久综合亚洲| 日韩av在线免费播放| 日本不卡一区二区在线观看| 91原创在线视频| 成人免费观看网址| 久久艹免费视频| 亚洲第一天堂av| 日本高清免费观看| 中文字幕亚洲欧美在线不卡| 国产麻豆乱码精品一区二区三区| 国产一区二区三区在线观看 | 日韩在线播放av| 成人手机在线免费视频| 亚洲大片精品永久免费| 色播五月综合| 色呦呦中文字幕| 九九久久综合网站| 日本高清不卡免费| 91精品婷婷国产综合久久竹菊| 韩国中文字幕av| 国产成人免费av在线| 国产精品永久在线| 一本色道久久综合无码人妻| 久久久国产精品视频| 久久成人小视频| 91精品综合久久久久久| 色婷婷激情视频| 一区二区三区精品在线观看| 国产91porn| 99精品1区2区| 色狠狠久久av五月综合| 六月丁香婷婷久久| 3d精品h动漫啪啪一区二区| aaa国产视频| 久久久久久免费精品| 九九热精品视频在线| 一本久久综合亚洲鲁鲁| 成熟的女同志hd| 日韩精品免费在线视频观看| 国产1区2区在线观看| 日韩欧美国产午夜精品| 欧美成人三级伦在线观看| 91国在线观看| 99热这里只有精品2| 一本色道久久综合狠狠躁的推荐| 天天操,天天操| 狠狠躁夜夜躁人人躁婷婷91| 黄色片子免费看| 欧美性受极品xxxx喷水| 国产男男chinese网站| 欧美不卡视频一区| 久艹在线观看视频| 中文字幕一区二区精品| 三级黄色在线视频| 91成人福利在线| 亚洲精品福利网站| 成人免费视频视频在| 国产黄色精品网站| 成人在线免费高清视频| 91免费看`日韩一区二区| 国产精品高清一区二区三区| 国产女无套免费视频| 最近2019好看的中文字幕免费 | 中文字幕乱视频| 欧美成人一二三区| 精品亚洲国产视频| 亚洲激情欧美激情| 丰满熟妇人妻中文字幕| 国产精品手机在线观看| 国产嫩草一区二区三区在线观看| 欧美日韩欧美一区二区| 一区二区 亚洲| 自拍偷拍一区二区三区| 亚洲成人777| av资源免费观看| 国产精品一区二区久久久| 久久久久久久久久久黄色| 人妻体内射精一区二区| 国产成人a亚洲精品| 国产精品一区二区黑丝| 蜜臀久久99精品久久久久久| 日韩国产小视频| 日本中文在线视频| 亚洲欧美日韩视频一区| 日本一区二区不卡在线| 天堂精品视频| 国产人成视频在线观看| 日韩中文字幕在线视频| 国产精品久久久久aaaa| 日本成人超碰在线观看| 国产精品嫩草影视| 亚洲一区高清| 欧美日本黄视频| 久久毛片高清国产| 韩国黄色一级片| 色婷婷综合成人| 99精品国产视频| 激情小说中文字幕| 精品视频在线观看| 欧美日韩精品高清| 亚洲福利在线观看视频| 亚洲精品在线视频播放| 亚洲人成在线观看网站高清| 日本大胆欧美人术艺术动态| 国产黄色大片免费看| 免费在线观看亚洲视频| 国产美女99p| 欧美性猛交xxxx乱大交3| 91精品人妻一区二区三区果冻| 激情网站五月天| 欧美日韩亚洲高清一区二区| www.久久成人| 深田咏美中文字幕| 国产aⅴ夜夜欢一区二区三区| 中文字幕av一区| 3atv在线一区二区三区| 一区二区三区四区亚洲| 丰满白嫩尤物一区二区| 成人午夜精品福利免费| 免费精品在线视频| 在线播放免费视频| 欧美亚洲另类在线一区二区三区| 久久精品影视伊人网| 成人h版在线观看| 亚洲综合久久网| 我要看一级黄色大片| 久久福利视频网| 99精品视频在线观看| 欧美激情精品久久久久久免费| 亚洲欧美日韩综合一区| 国产精品1234| 欧美激情在线观看视频| 国产欧美日韩三区| 国产女人高潮的av毛片| 亚洲乱妇老熟女爽到高潮的片| 久久夜精品va视频免费观看| 国产精品毛片高清在线完整版| 黄色片视频免费| 少妇愉情理伦片bd| 一女被多男玩喷潮视频| 蜜桃传媒视频第一区入口在线看| 国产美女久久久| 国产精品白嫩初高中害羞小美女 | 国产精品一区二区免费不卡| 精品深夜av无码一区二区老年| 天天干天天爽天天射| 国产精品一区=区| 精品久久一区二区三区| 国产成人免费视频 | 手机毛片在线观看| 久久国产精品-国产精品| 亚洲午夜未删减在线观看| 亚洲一区二区av电影| 337p粉嫩大胆色噜噜噜噜亚洲| 免费av中文字幕| 午夜免费福利在线| 91在线短视频| 中文字幕日韩av电影| 久久99精品国产.久久久久久| 国产又黄又猛又粗又爽| 国产香蕉精品视频| 欧美日韩高清在线一区| 亚洲男人天堂久| 欧美一级黄色大片| 精品国产一区二区三区av性色| 欧美电影在线免费观看| 精品视频一区二区不卡| 欧美色手机在线观看| 一本到三区不卡视频| 亚洲综合免费观看高清完整版 | 久久精品国产精品青草| frxxee中国xxx麻豆hd| 久久久久久香蕉| 蜜桃91精品入口| 999久久久| 91精品蜜臀在线一区尤物| 99re这里只有精品首页| 久久久精品毛片| 日韩电影在线观看一区二区| 免费又黄又爽又色的视频| 日批免费观看视频| 日韩欧美国产综合在线| 国产91免费视频| 国产+人+亚洲| 福利一区视频在线观看| 亚洲人成7777| 成人爽a毛片一区二区免费| 亚洲欧美色视频| 国产一区二区视频免费| 日韩av加勒比| 欧美不卡在线一区二区三区| 成人免费福利视频| 久久精品91久久香蕉加勒比| 欧美日韩中文国产| 国产成人免费视频网站高清观看视频| 在线视频 中文字幕| 免费精品在线视频| www.日本精品| 中文字幕永久在线观看| 国产美女激情视频| 欧美一区二区三区粗大| 亚洲欧美激情一区二区三区| 91在线视频导航| 欧美变态凌虐bdsm| 黄色91在线观看| 国产清纯在线一区二区www| 国产无套在线观看| 日本一极黄色片| 久久综合福利| 97精品国产aⅴ7777| 777久久久精品| 中文字幕一区日韩精品欧美| 久久久999| 日本三级欧美三级| 亚洲精品永久视频| 亚洲自拍欧美另类| 欧美另类交人妖| 欧美精品v日韩精品v韩国精品v| 久久久亚洲精品一区二区三区| 亚洲成人久久精品| 麻豆一区二区三区精品视频| 男生和女生一起差差差视频| 亚洲午夜精品久久久久久浪潮| 国产97免费视| 国产一区二区三区久久精品 | 久久久999久久久| 亚洲蜜桃精久久久久久久久久久久| xxxx18hd亚洲hd捆绑| 国产视频在线观看一区| 久久久综合av| 亚洲片在线资源| 欧美色图一区二区三区| 成人欧美一区二区三区在线播放| 国产一区二区三区av电影| 99久久99久久久精品棕色圆| 天堂а√在线中文在线鲁大师| 自拍日韩亚洲一区在线| 久久天堂国产精品| 国产91免费观看| 久久精品国产v日韩v亚洲 | 日本少妇裸体做爰| 亚洲av片不卡无码久久| 国产又大又黄又粗又爽| 一本一本久久a久久精品综合妖精| 成人黄色免费在线观看| 高清视频欧美一级| 日韩视频在线一区| 日韩av在线电影网| 在线播放亚洲一区| 色国产综合视频| 国产精品国产三级国产普通话99 | 日韩在线综合网| 桥本有菜av在线| 欧美日韩在线一二三| 国产精品久久不能| 久久99久久99精品免观看粉嫩| 亚洲高清中文字幕| 国产精品久久久久影院色老大 | www.日本xxxx| 欧美精品一区免费| 特级黄色录像片| 亚洲精品中文字幕乱码三区不卡| 91热精品视频| 成人免费福利在线| 国产男人精品视频| 欧美激情精品久久久久| 亚洲精品456在线播放狼人| 日韩欧美一级二级三级久久久| 欧美性猛交丰臀xxxxx网站| 亚洲精品视频观看| 亚洲欧美在线aaa| 亚洲日本在线观看| 一区二区在线观看免费视频播放| 久久久99久久| 国产午夜精品福利| 欧美国产综合色视频| 91麻豆.com| 欧美激情中文字幕一区二区| 国产丝袜欧美中文另类| 欧美激情一区二区三区全黄| 国产精品免费aⅴ片在线观看| 99re热视频这里只精品 | 久久精品一区蜜桃臀影院| 国产女人18毛片水真多成人如厕| 国产午夜亚洲精品羞羞网站| 国产精品欧美极品| 日本一区二区不卡视频| 国产精品情趣视频| 中文字幕中文乱码欧美一区二区| 成人免费在线播放视频| 亚洲国产一区二区三区| 色狠狠一区二区三区香蕉| 欧美日韩日日摸| 精品国产一区二区三区久久影院| 亚洲精品国产精品久久清纯直播 | 色综合视频在线| 精品一区二区三区在线观看| 激情六月婷婷综合| av福利精品导航| 国产精品久久久久影院| 一区二区久久久久久| 91国内精品野花午夜精品| 欧美日韩国产页| 欧美精品第1页| 亚洲日本欧美中文幕| 欧美精品激情视频| 国产精品自拍网| 国产成人免费观看| 制服诱惑一区| 午夜久久久精品| 青青草福利视频| 日本三级黄色大片| 国内老熟妇对白hdxxxx| 韩国女主播成人在线| 久久午夜电影网| 欧美日韩一二三四五区| 国产网站欧美日韩免费精品在线观看 | 欧美xxxx黑人又粗又长精品| 艳母动漫在线免费观看| 国产欧美精品一二三| 天天看片中文字幕| 亚洲AV无码成人片在线观看| 国产精品1区二区.| 国产精品妹子av| 欧美视频专区一二在线观看| 亚洲成人黄色在线| 欧美在线欧美在线| 日本黑人久久| 亚洲男人天堂2021| 久久久精品少妇| 国产精品爽爽久久| 成人一级片网址| 亚洲国产日日夜夜| 亚洲视频免费一区| 国产精品人成电影在线观看| 一区二区三区欧美成人| 亚欧精品在线视频| www深夜成人a√在线| www国产在线| 99精品国产一区二区三区不卡| 日本韩国精品一区二区在线观看| 亚洲第一视频网站| 国产精品爽黄69天堂a| 亚洲图片欧洲图片日韩av| 成年人看片网站| 日韩欧美亚洲一区二区三区| 麻豆久久久久久| 欧美视频精品一区| 亚洲欧洲日产国产网站| 亚洲永久在线观看| 亚欧在线免费观看| 国产精品 欧美 日韩| 免费观看黄色一级视频| 国产精品成人免费在线| 日韩精品在线第一页| 日本欧美国产在线| 国产成人永久免费视频| 黄色一级片一级片| 免费观看国产精品| 一区二区三区丝袜| 色阁综合伊人av| 欧洲精品久久| 免费污网站在线观看| 五月婷婷六月色| 亚洲黄色小视频| 欧美成人久久久| 咪咪色在线视频| 三级黄色免费观看| 国产在线精品一区二区不卡了| 亚洲高清视频在线| 久久久免费精品| 免费看国产曰批40分钟| 久草成人在线视频| 99这里只有精品| 国产视频欧美视频| 97se亚洲综合|