久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【大厂面试】面试官看了赞不绝口的Redis笔记

發布時間:2023/12/8 数据库 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【大厂面试】面试官看了赞不绝口的Redis笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、Redis簡介
  • 二、Redis API的使用和理解
    • (一)通用命令
    • (二)單線程架構
    • (三)數據結構和內部編碼
    • (四)字符串
    • (五)hash (字典)
    • (六)列表
    • (七)Set集合
    • (八)zset (有序集合)
  • 三、Redis 客戶端操作
  • 說明

一、Redis簡介

Redis(Remote Dictionary Server)是一個使用ANSI C編寫的開源、支持網絡、基于內存、可選持久性的鍵值對存儲數據庫,也是于開發或者運維都是必須要掌握的非關系型數據庫。

Redis可作為高性能 Key-Value服務器,擁有多種數據結構,并提供豐富的功能以及對高可用分布式的支持。

Redis的具有以下:1. 速度快;2. 功能豐富;3. 可持久化;4. 簡單;5. 多種數據結構;6. 主從復制;7. 支持多種編輯語言;8. 高可用、分布式等。

二、Redis API的使用和理解

下面我們會依次詳細探討常用的Redis 的API。

再說之前,給大家推薦一個網站,用于查閱Redis API: http://redisdoc.com/index.html

文中的部分演示結果來源于該網站

傳送門:Redis 命令參考

(一)通用命令

因為通用命令會涉及Redis的數據結構操作,而Redis的數據結構操作也會涉及到通用命令,所以這兩部分要結合著看。

不同數據結構的操作內容在下面

1. KEYS

通用命令KEYS pattern(pattern 為正則表達式)
功能描述查找所有符合給定模式 pattern 的 key
時間復雜度O(N), N 為數據庫中 key 的數量。

功能描述方面舉例:

  • KEYS * 匹配數據庫中所有 key 。
  • KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
  • KEYS h*llo 匹配 hllo 和 heeeeello 等。
  • KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。

特殊符號用 \ 隔開。

示例

redis> MSET one 1 two 2 three 3 four 4 # 一次設置 4 個 key OKredis> KEYS *o* 1) "four" 2) "two" 3) "one"redis> KEYS t?? 1) "two"redis> KEYS t[w]* 1) "two"redis> KEYS * # 匹配數據庫內所有 key 1) "four" 2) "three" 3) "two" 4) "one"

在生產環境中,使用keys命令取出所有key并沒有什么意義,而且Redis是單線程應用,如果Redis中存的key很多,使用keys命令會阻塞其他命令執行,所以keys命令一般不在生產環境中使用

2. DBSIZE

通用命令DBSIZE
功能描述返回當前數據庫的 key 的數量。
時間復雜度時間復雜度: O(1)

示例

redis> DBSIZE (integer) 5redis> SET new_key "hello_moto" # 增加一個 key 試試 OKredis> DBSIZE (integer) 6

Redis內置一個計數器,可以實時更新Redis中key的總數,因此dbsize的時間復雜度為O(1),可以在線上使用。

3. EXISTS

通用命令EXISTS key
功能描述檢查給定 key 是否存在。若 key 存在,返回 1 ,否則返回 0 。
時間復雜度O(1)
redis> SET db "redis" OKredis> EXISTS db (integer) 1redis> DEL db (integer) 1redis> EXISTS db (integer) 0

4. DEL

通用命令DEL key [key …]
功能描述刪除給定的一個或多個 key 。不存在的 key 會被忽略。返回值是被刪除 key 的數量。
時間復雜度O(N), N 為被刪除的 key 的數量,其中刪除單個字符串類型的 key ,時間復雜度為O(1);刪除單個列表、集合、有序集合或哈希表類型的 key ,時間復雜度為O(M), M 為以上數據結構內的元素數量。
# 刪除單個 key redis> SET name huangz OKredis> DEL name (integer) 1# 刪除一個不存在的 key redis> EXISTS phone (integer) 0redis> DEL phone # 失敗,沒有 key 被刪除 (integer) 0# 同時刪除多個 key redis> SET name "redis" OKredis> SET type "key-value store" OKredis> SET website "redis.com" OKredis> DEL name type website (integer) 3

5. EXPIRE

通用命令EXPIRE key seconds
功能描述為給定 key 設置生存時間,當 key 過期時(生存時間為 0 ),它會被自動刪除。設置成功返回 1 。 當 key 不存在或者不能為 key 設置生存時間時(比如在低于 2.1.3 版本的 Redis 中你嘗試更新 key 的生存時間),返回 0 。
時間復雜度O(1)
redis> SET cache_page "www.google.com" OKredis> EXPIRE cache_page 30 # 設置過期時間為 30 秒 (integer) 1redis> TTL cache_page # 查看剩余生存時間 (integer) 23redis> EXPIRE cache_page 30000 # 更新過期時間 (integer) 1redis> TTL cache_page (integer) 29996

6. TTL

通用命令TTL key
功能描述以秒為單位,返回給定 key 的剩余生存時間(TTL, time to live)。
時間復雜度O(1)
redis> FLUSHDB OKredis> TTL key (integer) -2# key 存在,但沒有設置剩余生存時間 redis> SET key value OKredis> TTL key (integer) -1# 有剩余生存時間的 key redis> EXPIRE key 10086 (integer) 1redis> TTL key (integer) 10084

7. PERSIST

通用命令PERSIST key
功能描述移除給定 key 的生存時間,將這個 key 從“易失的”(帶生存時間 key )轉換成“持久的”(一個不帶生存時間、永不過期的 key )。當生存時間移除成功時,返回 1 . 如果 key 不存在或 key 沒有設置生存時間,返回 0 。
時間復雜度O(1)
redis> SET mykey "Hello" OKredis> EXPIRE mykey 10 # 為 key 設置生存時間 (integer) 1redis> TTL mykey (integer) 10redis> PERSIST mykey # 移除 key 的生存時間 (integer) 1redis> TTL mykey (integer) -1

8. TYPE

通用命令TYPE key
功能描述返回 key 所儲存的值的類型。
時間復雜度O(1)

值的類型有:

  • none (key不存在)
  • string (字符串)
  • list (列表)
  • set (集合)
  • zset (有序集)
  • hash (哈希表)
  • stream (流)
# 字符串 redis> SET weather "sunny" OKredis> TYPE weather string# 列表 redis> LPUSH book_list "programming in scala" (integer) 1redis> TYPE book_list list# 集合 redis> SADD pat "dog" (integer) 1redis> TYPE pat set

8. del

通用命令DEL key [key …]
功能描述刪除給定的一個或多個 key 。不存在的 key 會被忽略。返回值是被刪除 key 的數量。
時間復雜度O(N), N 為被刪除的 key 的數量,其中刪除單個字符串類型的 key ,時間復雜度為O(1);刪除單個列表、集合、有序集合或哈希表類型的 key ,時間復雜度為O(M), M 為以上數據結構內的元素數量。
# 刪除單個 key redis> SET name huangz OKredis> DEL name (integer) 1# 刪除一個不存在的 key redis> EXISTS phone (integer) 0redis> DEL phone # 失敗,沒有 key 被刪除 (integer) 0# 同時刪除多個 key redis> SET name "redis" OKredis> SET type "key-value store" OKredis> SET website "redis.com" OKredis> DEL name type website (integer) 3

9. scan

通用命令SCAN cursor [MATCH pattern] [LIMT count]
功能描述查找(limit個)(符合給定模式 pattern )的 key ,返回值是符合 條件的key
時間復雜度增量式迭代命令每次執行的復雜度為 O(1) , 對數據集進行一次完整迭代的復雜度為 O(N) , 其中 N 為數據集中的元素數量。

剛開始我們已經介紹過了keys,它的缺點非常明顯:

  • ?次性查出所有滿?條件的 key,萬?Redis中有?百 w 個 key 滿?條件,滿屏都是輸出的結果,眼花繚亂。
  • keys由于走的是遍歷算法,復雜度是 O(n),如果Redis中有千萬級以上的 key,這個指令就會導致 Redis 服務卡頓,所有讀寫Redis 的其它的指令都會被延后甚?會超時報錯,因為 Redis是單線程程序,順序執?所有指令,其它指令必須等到當前的keys 指令執?完了才可以繼續。
  • 為了解決這個問題, 2.8 版本中的Redis加?了scan。

    scan 相? keys 具備有以下特點:

  • 復雜度雖然也是 O(n),但是它是通過游標(cursor,相當于位置)分步進?的,不會阻塞線程;
  • 提供 limit 參數(可選),可以控制每次返回結果的最?條數(實際上是遍歷的key的數量);
  • 它也提供模式匹配功能;
  • 服務器不需要為游標(cursor)保存狀態,游標(cursor)的唯?狀態就是 scan 返回給客戶端的游標整數;
  • 返回的結果可能會有重復,需要客戶端去重復(重要);
  • 遍歷的過程中如果有數據修改,改動后的數據能不能遍歷到是不確定的;
  • 單次返回的結果是空的并不意味著遍歷結束,?要看返回的游標值是否為零;
  • scan 參數提供了三個參數,第?個是 cursor 整數值,第?個是key 的正則模式,第三個是遍歷的limit。第?次遍歷時,cursor 值為 0,然后將返回結果中第?個整數值作為下?次遍歷的cursor。?直遍歷到返回的 cursor 值為 0 時結束。

    127.0.0.1:6379> scan 0 match key99* count 1000 1) "13976" 2) 1) "key9911"2) "key9974"3) "key9994"4) "key9910"5) "key9907"6) "key9989"7) "key9971"8) "key99" 127.0.0.1:6379> scan 13976 match key99* count 1000 1) "1996" 2) 1) "key9982"2) "key9997" 3) "key9963"4) "key996"5) "key9912"6) "key9999"7) "key9921"8) "key994"9) "key9956"10) "key9919" 127.0.0.1:6379> scan 1996 match key99* count 1000 1) "12594" 2) 1) "key9939"2) "key9941"3) "key9967"4) "key9938"5) "key9906"6) "key999"7) "key9909"... 127.0.0.1:6379> scan 11687 match key99* count 1000 1) "0" 2) 1) "key9969"2) "key998"3) "key9986"4) "key9968"5) "key9965"6) "key9990"7) "key9915"8) "key9928"9) "key9908"

    剛才也強調了,limit是遍歷的key的個數,從上?的過程可以看到雖然提供的 limit 是 1000,但是返回的結果,有的只有 10 個。

    scan 指令返回的游標就是第?維數組的位置索引,我們將這個位置索引稱為槽 (slot)。如果不考慮字典的擴容縮容,直接按數組下標挨個遍歷就?了。limit 參數就表示需要遍歷的槽位數,之所以返回的結果可能多可能少,是因為不是所有的槽位上都會掛接鏈表,有些槽位可能是空的,還有些槽位上掛接的鏈表上的元素可能會有多個。每?次遍歷都會將 limit 數量的槽位上掛接的所有鏈表元素進?模式匹配過濾后,?次性返回給客戶端。

    scan除了可以遍歷所有的 key 之外,還可以對指定的容器集合進?遍歷。
    ?如 zscan 遍歷 zset 集合元素,hscan遍歷 hash 字典的元素、sscan 遍歷 set 集合的元素。

    常用的通用命令已經介紹完了,下面我們探討一個Redis總要面臨的問題:

    在 Redis 中有可能會形成很?的對象,?如?個?個很?的 zset。

    這樣的對象對 Redis 的集群數據遷移帶來了挑戰,在集群環境下,如果某個 key 太?,可能會導致數據遷移卡頓。另外在內存分配上,如果 key 太?,那么當它需要擴容時,會?次性申請更?的?塊內存,這也可能會導致卡頓。如果這個? key 被刪除,內存會?次性回收,卡頓現象也有可能再產?。

    在平時的開發中,盡量避免? key 的產?。如果遇到 Redis 的內存?起?落的現象,有可能是因為? key 導致的,這時候你就需要定位這個大 key,進?步定位出具體的業務來源,然后再改進相關業務代碼設計。

    關于大key的尋找,可以通過 scan 指令,對于掃描出來的每?個 key,使? type 指令獲得 key 的類型,然后使?相應數據結構的 size 或者 len ?法來得到它的??,對于每?種類型,保留??的前 N 名作為掃描結果展示出來。(需要編寫腳本)

    除此之外, Redis 官?在redis-cli 指令中提供了這樣的掃描功能

    redis-cli -h 127.0.0.1 -p 7001 –-bigkeys

    如果你擔?這個指令會?幅抬升 Redis 的 ops ,還可以增加?個休眠參數。

    redis-cli -h 127.0.0.1 -p 7001 –-bigkeys -i 0.1 # 每隔 100 條 scan 指令就會休眠 0.1s,ops 就不會劇烈抬升,但是掃描的時間會變?。

    redis中的OPS 即operation per second 每秒操作次數。意味著每秒對Redis的持久化操作

    (二)單線程架構

    Redis內部使用單線程架構。Redis一個瞬間只能執行一條命令,不能執行兩條命令

    Redis單線程速度這么快的原因可大致歸結三個:
    1.純內存

    Redis把所有的數據都保存在內存中,而內存的響應速度是非??斓?/p>

    2.非阻塞IO

    Redis使用epoll異步非阻塞模型 ,Redis自身實現了事件處理

    3.避免線程切換和競態消耗

    在使用多線程編程中,線程之間的切換也會消耗一部分CPU資源,如果不合理的實現多線程編程,可能比單線程還要慢

    主要原因是 純內存。

    不過第二條和第三條倒是面試中經常會問到,尤其是第二條。為了便于大家,理解更深刻,我們這里探討一下操作系統的IO

    用戶程序進行IO的讀寫,依賴于底層的IO讀寫,基本上會用到底層的read&write兩大系統調用。

    read系統調用,并不是直接從物理設備把數據讀取到內存中;write系統調用,也不是直接把數據寫入到物理設備。上層應用無論是調用操作系統的read,還是調用操作系統的write,都會涉及緩沖區。具體來說,調用操作系統的read,是把數據從內核緩沖區復制到進程緩沖區;而write系統調用,是把數據從進程緩沖區復制到內核緩沖區。

    緩沖區的目的,是為了減少頻繁地與設備之間的物理交換。外部設備的直接讀寫,涉及操作系統的中斷。發生系統中斷時,需要保存之前的進程數據和狀態等信息,而結束中斷之后,還需要恢復之前的進程數據和狀態等信息。為了減少這種底層系統的時間損耗、性能損耗,于是出現了內存緩沖區。

    有了內存緩沖區,上層應用使用read系統調用時,僅僅把數據從內核緩沖區復制到上層應用的緩沖區(進程緩沖區);上層應用使用write系統調用時,僅僅把數據從進程緩沖區復制到內核緩沖區中。底層操作會對內核緩沖區進行監控,等待緩沖區達到一定數量的時候,再進行IO設備的中斷處理,集中執行物理設備的實際IO操作,這種機制提升了系統的性能。至于什么時候中斷(讀中斷、寫中斷),由操作系統的內核來決定,用戶程序則不需要關心。

    從數量上來說,在Linux系統中,操作系統內核只有一個內核緩沖區。而每個用戶程序(進程),有自己獨立的緩沖區,叫作進程緩沖區。所以,用戶程序的IO讀寫程序,在大多數情況下,并沒有進行實際的IO操作,而是在進程緩沖區和內核緩沖區之間直接進行數據的交換。

    有了對操作系統IO的基本認識之后,還要提一下操作系統四種主要的IO模型

  • 同步阻塞IO(Blocking IO)
  • 同步非阻塞IO(Non-blocking IO)
  • IO多路復用(IO Multiplexing)
  • 異步IO(Asynchronous IO)
  • Redis的IO模型是IO多路復用,有意思的是Java 的NIO模型,也是IO多路復用(不是同步非阻塞IO)

    有興趣的可以查閱相關的資料,或者不著急的 可以等我接下來的博文(過段日子會有網絡編程詳解的博文,對IO作深入探究)

    這里還要強調一下,由于Redis單線程一次只運行一條命令,我們要拒絕長(慢)命令

    keys flushallflushdbslow lua scriptmutil/execoperate

    (三)數據結構和內部編碼

    Redis每種數據結構及對應的內部編碼如下圖所示

    你會發現 數據結構 內部編碼方式有不同的方式,其實這是時間換空間 空間換時間的做法,選擇何種內部編碼要結合實際情況。

    (四)字符串

    字符串 string 是 Redis 最簡單的數據結構。Redis 所有的數據結構都是以唯?的 key 字符串作為名稱,然后通過這個唯? key 值來獲取相應的 value 數據。不同類型的數據結構的差異就在于 value 的結構不?樣。

    字符串的value值類型有三種:1. 字符串;2. 整型;3.二進制。

    Redis 的字符串是動態字符串,是可以修改的字符串,內部結構實現上類似于 Java 的 ArrayList,采?預分配冗余空間的?式來減少內存的頻繁分配,當字符串?度?于 1M時,擴容都是加倍現有的空間,如果超過 1M,擴容時?次只會多擴1M 的空間。需要注意的是字符串最??度為 512M。

    我們看一下它的常用API

    1. GET

    命令GET key
    功能描述返回與鍵 key 相關聯的字符串值。 如果鍵 key 不存在, 那么返回特殊值 nil ; 否則, 返回鍵 key 的值。如果鍵 key 的值并非字符串類型, 那么返回一個錯誤, 因為 GET 命令只能用于字符串值。
    時間復雜度O(1)

    示例
    對不存在的鍵 key 或是字符串類型的鍵 key 執行 GET 命令:

    redis> GET db (nil)redis> SET db redis OKredis> GET db "redis"

    對不是字符串類型的鍵 key 執行 GET 命令:

    redis> DEL db (integer) 1redis> LPUSH db redis mongodb mysql (integer) 3redis> GET db (error) ERR Operation against a key holding the wrong kind of value

    2. set

    命令SET key value [EX seconds] [PX milliseconds] [NX|XX]
    功能描述將字符串值 value 關聯到 key 。如果 key 已經持有其他值, SET 就覆寫舊值, 無視類型。當 SET 命令對一個帶有生存時間(TTL)的鍵進行設置之后, 該鍵原有的 TTL 將被清除。
    時間復雜度O(1)

    可選參數
    從 Redis 2.6.12 版本開始, SET 命令的行為可以通過一系列參數來修改:

    • EX seconds : 將鍵的過期時間設置為 seconds 秒。 執行 SET key value EX seconds 的效果等同于執行 SETEX key seconds value 。
    • PX milliseconds : 將鍵的過期時間設置為 milliseconds 毫秒。 執行 SET key value PX milliseconds 的效果等同于執行 PSETEX key milliseconds value 。
    • NX : 只在鍵不存在時, 才對鍵進行設置操作。 執行 SET key value NX 的效果等同于執行 SETNX key value 。
    • XX : 只在鍵已經存在時, 才對鍵進行設置操作。

    關于返回值

    • 在 Redis 2.6.12 版本以前, SET 命令總是返回 OK 。
    • 從 Redis 2.6.12 版本開始, SET 命令只在設置操作成功完成時才返回 OK ; 如果命令使用了 NX 或者 XX 選項, 但是因為條件沒達到而造成設置操作未執行, 那么命令將返回空批量回復(NULL Bulk Reply)。

    3. INCR

    命令INCR key
    功能描述為鍵 key 儲存的數字值加上一。如果鍵 key 不存在, 那么它的值會先被初始化為 0 , 然后再執行 INCR 命令。如果鍵 key 儲存的值不能被解釋為數字, 那么 INCR 命令將返回一個錯誤。本操作的值限制在 64 位(bit)有符號數字表示之內。返回值是DECR 命令會返回鍵 key 在執行減一操作之后的值。
    時間復雜度O(1)

    對儲存數字值的鍵 key 執行 DECR 命令:

    redis> SET page_view 20 OKredis> INCR page_view (integer) 21redis> GET page_view # 數字值在 Redis 中以字符串的形式保存 "21"

    對不存在的鍵執行 DECR 命令:

    redis> EXISTS count (integer) 0redis> DECR count (integer) -1

    4. DECR

    命令DECRBY key decrement
    功能描述將鍵 key 儲存的整數值減去減量 decrement 。如果鍵 key 不存在, 那么鍵 key 的值會先被初始化為 0 , 然后再執行 DECRBY 命令。如果鍵 key 儲存的值不能被解釋為數字, 那么 DECRBY 命令將返回一個錯誤。本操作的值限制在 64 位(bit)有符號數字表示之內。返回值是DECRBY 命令會返回鍵在執行減法操作之后的值。
    時間復雜度O(1)

    對已經存在的鍵執行 DECRBY 命令:

    redis> SET count 100 OKredis> DECRBY count 20 (integer) 80

    對不存在的鍵執行 DECRBY 命令:

    redis> EXISTS pages (integer) 0redis> DECRBY pages 10 (integer) -10

    5. INCRBY

    命令INCRBY key increment
    功能描述為鍵 key 儲存的數字值加上增量 increment 。如果鍵 key 不存在, 那么鍵 key 的值會先被初始化為 0 , 然后再執行 INCRBY 命令。如果鍵 key 儲存的值不能被解釋為數字, 那么 INCRBY 命令將返回一個錯誤。本操作的值限制在 64 位(bit)有符號數字表示之內。返回值為在加上增量 increment 之后, 鍵 key 當前的值。
    時間復雜度O(1)

    示例演示與上面類似

    6. DECRBY

    命令DECRBY key decrement
    功能描述將鍵 key 儲存的整數值減去減量 decrement 。如果鍵 key 不存在, 那么鍵 key 的值會先被初始化為 0 , 然后再執行 DECRBY 命令。如果鍵 key 儲存的值不能被解釋為數字, 那么 DECRBY 命令將返回一個錯誤。本操作的值限制在 64 位(bit)有符號數字表示之內。 返回值DECRBY 命令會返回鍵在執行減法操作之后的值。
    時間復雜度O(1)

    示例演示與上面類似

    使用上面這一些命令,其實我們就可以做一些事情了。

    應用

    1.比如說記錄每個用戶博文的訪問量

    incr userid:pageview(單線程:無競爭)


    2.緩存用戶的基本信息(數據源在 MySQL中),信息被序列化存放在value中。

    一般而言,需要通過我們自定義規則的key,從Redis獲取value,如果key存在的話,則直接獲取value使用;如果不存在的話,從Mysql中讀取使用,然后存在Redis中。
    主要的命令是 get 和 set

    3.分布式id生成器
    如果集群規模和運算不太復雜的話,可以用Redis生成分布式id,因為Redis單線程的特點,一次只執行一條指令,保證了id值的唯一。
    主要的命令還是incr

    7. SETNX

    命令SETNX key value
    功能描述只在鍵 key 不存在的情況下, 將鍵 key 的值設置為 value 。若鍵 key 已經存在, 則 SETNX 命令不做任何動作。命令在設置成功時返回 1 , 設置失敗時返回 0 。
    時間復雜度O(1)
    redis> EXISTS job # job 不存在 (integer) 0redis> SETNX job "programmer" # job 設置成功 (integer) 1redis> SETNX job "code-farmer" # 嘗試覆蓋 job ,失敗 (integer) 0redis> GET job # 沒有被覆蓋 "programmer"

    8. SETEX

    命令SETNX key value
    功能描述將鍵 key 的值設置為 value , 并將鍵 key 的生存時間設置為 seconds 秒鐘。如果鍵 key 已經存在, 那么 SETEX 命令將覆蓋已有的值。命令在設置成功時返回 OK 。 當 seconds 參數不合法時, 命令將返回一個錯誤。
    時間復雜度O(1)

    SETEX 命令的效果和以下兩個命令的效果類似:

    SET key value EXPIRE key seconds # 設置生存時間

    SETEX 和這兩個命令的不同之處在于 SETEX 是一個原子(atomic)操作, 它可以在同一時間內完成設置值和設置過期時間這兩個操作, 因此 SETEX 命令在儲存緩存的時候非常實用。

    這兩個命令的典型應用就是分布式鎖了。

    ?如?個操作要修改?戶的狀態,修改狀態需要先讀出?戶的狀態,在內存?進?修改,改完了再存回去。如果這樣的操作同時進?了,就會出現并發問題。這個時候就要使?到分布式鎖來限制程序的并發執?。Redis 分布式鎖使??常?泛,必須要掌握。

    分布式鎖本質上要實現的?標就是在 Redis ??占?個“位置”,當別的進程也要來占時,發現“位置”被占了,就只好放棄或者稍后
    再試。

    占位置?般是使? setnx(set if not exists) 指令,只允許被?個客戶端占據。先來先占,?完了,再調? del 指令釋放位置。

    如果邏輯執?到中間出現異常了,可能會導致 del指令沒有被調?,這樣就會陷?死鎖,鎖永遠得不到釋放。于是我們在拿到鎖之后,再給鎖加上?個過期時間。

    但如果在 setnx 和 expire 之間服務器進程突然掛掉了,可能是因為機器掉電或者是被?為殺掉的,就會導致expire 得不到執?,也會造成死鎖。

    原因是 setnx 和 expire 是兩條指令?不能保證都一定成功執行。如果這兩條指令可以?起執?就不會出現問題(要么成功,要么失敗)。所以說setex是最佳的方案

    上面就是分布式鎖的基本思想。但是在真正投入使用的時候,還會面臨一個常見的問題:超時問題

    Redis 的分布式鎖不能解決超時問題,如果在加鎖和釋放鎖之間的邏輯執?的時間太?,超出了鎖的超時限制,就會出現問題。這時候第?個線程持有的鎖過期了,臨界區的邏輯沒有執?完,而第?個線程就提前重新持有了這把鎖,導致臨界區代碼不能嚴格地串?執?。

    為了避免這個問題,Redis 分布式鎖不要?于較?時間的任務。

    我們會在下篇文章,也就是分布式章節繼續探討分布式鎖。

    9. MSET

    命令MSET key value [key value …]
    功能描述同時為多個鍵設置值。如果某個給定鍵已經存在, 那么 MSET 將使用新值去覆蓋舊值, 如果這不是你所希望的效果, 請考慮使用 MSETNX 命令, 這個命令只會在所有給定鍵都不存在的情況下進行設置。MSET 是一個原子性(atomic)操作, 所有給定鍵都會在同一時間內被設置, 不會出現某些鍵被設置了但是另一些鍵沒有被設置的情況。MSET 命令總是返回 OK 。
    時間復雜度O(N),其中 N 為被設置的鍵數量。

    同時對多個鍵進行設置:

    redis> MSET date "2012.3.30" time "11:00 a.m." weather "sunny" OKredis> MGET date time weather 1) "2012.3.30" 2) "11:00 a.m." 3) "sunny"

    覆蓋已有的值:

    redis> MGET k1 k2 1) "hello" 2) "world"redis> MSET k1 "good" k2 "bye" OKredis> MGET k1 k2 1) "good" 2) "bye"

    10 . MGET

    命令MGET key [key …]
    功能描述返回給定的一個或多個字符串鍵的值。如果給定的字符串鍵里面, 有某個鍵不存在, 那么這個鍵的值將以特殊值 nil 表示。MGET 命令將返回一個列表, 列表中包含了所有給定鍵的值。
    時間復雜度O(N),其中 N 為被設置的鍵數量。
    redis> SET redis redis.com OKredis> SET mongodb mongodb.org OKredis> MGET redis mongodb 1) "redis.com" 2) "mongodb.org"redis> MGET redis mongodb mysql # 不存在的 mysql 返回 nil 1) "redis.com" 2) "mongodb.org" 3) (nil)

    下面說說mset和mget的好處
    不使用mget和mset::

    客戶端和服務器端可能不在同一個地方
    n次get/set=n次網絡時間+n次命令時間

    一次mget/mset:

    1次mget/mset=1次網絡時間+n次命令時間

    隨著n的增大,差距一下子就體現出來了。

    下面的命令不太常用,大體過一下:

    10. GETSET
    GETSET key value
    將鍵 key 的值設為 value , 并返回鍵 key 在被設置之前的舊值。

    11. STRLEN
    STRLEN key
    返回鍵 key 儲存的字符串值的長度

    12. APPEND
    APPEND key value
    如果鍵 key 已經存在并且它的值是一個字符串, APPEND 命令將把 value 追加到鍵 key 現有值的末尾。

    13. INCRBYFLOAT
    INCRBYFLOAT key increment
    為鍵 key 儲存的值加上浮點數增量 increment 。
    如果鍵 key 不存在, 那么 INCRBYFLOAT 會先將鍵 key 的值設為 0 , 然后再執行加法操作。
    如果命令執行成功, 那么鍵 key 的值會被更新為執行加法計算之后的新值, 并且新值會以字符串的形式返回給調用者。
    無論是鍵 key 的值還是增量 increment , 都可以使用像 2.0e7 、 3e5 、 90e-2 那樣的指數符號(exponential notation)來表示, 但是, 執行 INCRBYFLOAT 命令之后的值總是以同樣的形式儲存, 也即是, 它們總是由一個數字, 一個(可選的)小數點和一個任意長度的小數部分組成(比如 3.14 、 69.768 ,諸如此類), 小數部分尾隨的 0 會被移除, 如果可能的話, 命令還會將浮點數轉換為整數(比如 3.0 會被保存成 3 )。
    此外, 無論加法計算所得的浮點數的實際精度有多長, INCRBYFLOAT 命令的計算結果最多只保留小數點的后十七位。
    當以下任意一個條件發生時, 命令返回一個錯誤:

    • 鍵 key 的值不是字符串類型(因為 Redis 中的數字和浮點數都以字符串的形式保存,所以它們都屬于字符串類型);
    • 鍵 key 當前的值或者給定的增量 increment 不能被解釋(parse)為雙精度浮點數。

    14. GETRANGE
    GETRANGE key start end
    返回鍵 key 儲存的字符串值的指定部分, 字符串的截取范圍由 start 和 end 兩個偏移量決定 (包括 start 和 end 在內)。
    負數偏移量表示從字符串的末尾開始計數, -1 表示最后一個字符, -2 表示倒數第二個字符, 以此類推。
    GETRANGE 通過保證子字符串的值域(range)不超過實際字符串的值域來處理超出范圍的值域請求。

    15. SETRANGE
    SETRANGE key offset value
    從偏移量 offset 開始, 用 value 參數覆寫(overwrite)鍵 key 儲存的字符串值。
    不存在的鍵 key 當作空白字符串處理。
    SETRANGE 命令會確保字符串足夠長以便將 value 設置到指定的偏移量上, 如果鍵 key 原來儲存的字符串長度比偏移量小(比如字符串只有 5 個字符長,但你設置的 offset 是 10 ), 那么原字符和偏移量之間的空白將用零字節(zerobytes, “\x00” )進行填充。
    因為 Redis 字符串的大小被限制在 512 兆(megabytes)以內, 所以用戶能夠使用的最大偏移量為 2^29-1(536870911) , 如果你需要使用比這更大的空間, 請使用多個 key 。


    在對字符串類型有了整體的了解之后,我們看看它具體的結構

    Redis 的字符串名字是SDS(Simple Dynamic String)。它的結構是?個帶?度信息的字節數組。

    struct SDS<T> {T capacity; // 數組容量T len; // 數組?度byte flags; // 特殊標識位,不理睬它byte[] content; // 數組內容 }

    capacity 表示所分配數組的?度,len 表示字符串的實際?度。前?API提到?持 append操作(字符串是可修改的)。如果數組沒有冗余空間,那么追加操作必然涉及到分配新數組,然后將舊內容復制過來,再 append 新內容。如果字符串的?
    度?常?,這樣的內存分配和復制開銷就會?常?。

    /* Append the specified binary-safe string pointed by 't' of 'len' bytes to the * end of the specified sds string 's' . * * After the call, the passed sds string is no longer valid and all the * references must be substituted with the new pointer returned by the call. */ sds sdscatlen(sds s, const void *t, size_t len) {size_t curlen = sdslen(s); // 原字符串?度// 按需調整空間,如果 capacity 不夠容納追加的內容,就會重新分配字節數組并復制原字符串的內容到新數組中s = sdsMakeRoomFor(s,len);if (s == NULL) return NULL; // 內存不?memcpy(s+curlen, t, len); // 追加?標字符串的內容到字節數組中sdssetlen(s, curlen+len); // 設置追加后的?度值s[curlen+len] ='\0'; // 讓字符串以\0 結尾,便于調試打印,還可以直接使? glibc 的字符串函數進?操作return s; }

    上?的 SDS 結構使?了范型 T,這是Redis 對內存做出的優化,不同?度的字符串使?不同的結構體來表示,字符串?較短時,len 和 capacity 可以使? byte 和 short來表示。

    Redis 規定字符串的?度不得超過 512M 字節。創建字符串時 len和 capacity ?樣?,不會多分配冗余空間,這是因為絕?多數場景下我們不會使? append 操作來修改字符串。

    (五)hash (字典)

    Redis 的字典結構為數組 +鏈表?維結構。第?維 hash 的數組位置碰撞時,就會將碰撞的元素使?鏈表串接起來。Redis 的字典的值只能是字符串。當字典很大的時候,會進行rehash,Redis 為了?性能,不能堵塞服務,采?了漸進式 rehash 策略。

    漸進式 rehash 保留新舊兩個 hash 結構,查詢時會同時查詢兩個 hash 結構,然后在后續的定時任務中以及hash 操作指令中,循序漸進地將舊 hash 的內容?點點遷移到新的hash 結構中。當搬遷完成了,就會使?新的hash結構取?代之。當 hash 移除了最后?個元素之后,該數據結構?動被刪除,內存被回收。


    下面我們看一下它的API, 所有hash的命令都是h開頭
    1. HSET hash field value

    時間復雜度: O(1)

    將哈希表 hash 中域 field 的值設置為 value 。如果給定的哈希表并不存在, 那么一個新的哈希表將被創建并執行 HSET 操作。如果域 field 已經存在于哈希表中, 那么它的舊值將被新值 value 覆蓋。當 HSET 命令在哈希表中新創建 field 域并成功為它設置值時, 命令返回 1 ; 如果域 field 已經存在于哈希表, 并且 HSET 命令成功使用新值覆蓋了它的舊值, 那么命令返回 0 。

    設置一個新域:

    redis> HSET website google "www.g.cn" (integer) 1redis> HGET website google "www.g.cn"

    對一個已存在的域進行更新:

    redis> HSET website google "www.google.com" (integer) 0redis> HGET website google "www.google.com"

    2.HGET hash field
    時間復雜度: O(1)

    返回哈希表中給定域的值。HGET 命令在默認情況下返回給定域的值。如果給定域不存在于哈希表中, 又或者給定的哈希表并不存在, 那么命令返回 nil 。

    域存在的情況:

    redis> HSET homepage redis redis.com (integer) 1redis> HGET homepage redis "redis.com"

    域不存在的情況:

    redis> HGET site mysql (nil)

    3.HDEL
    HDEL key field [field …]
    O(N), N 為要刪除的域的數量。
    刪除哈希表 key 中的一個或多個指定域,不存在的域將被忽略。返回值為被成功移除的域的數量,不包括被忽略的域。

    # 測試數據 redis> HGETALL abbr 1) "a" 2) "apple" 3) "b" 4) "banana" 5) "c" 6) "cat" 7) "d" 8) "dog"# 刪除單個域 redis> HDEL abbr a (integer) 1# 刪除不存在的域 redis> HDEL abbr not-exists-field (integer) 0# 刪除多個域 redis> HDEL abbr b c (integer) 2redis> HGETALL abbr 1) "d" 2) "dog"

    4. HSETNX hash field value
    時間復雜度: O(1)
    當且僅當域 field 尚未存在于哈希表的情況下, 將它的值設置為 value 。如果給定域已經存在于哈希表當中, 那么命令將放棄執行設置操作。如果哈希表 hash 不存在, 那么一個新的哈希表將被創建并執行 HSETNX 命令。HSETNX 命令在設置成功時返回 1 , 在給定域已經存在而放棄執行設置操作時返回 0 。

    域尚未存在, 設置成功:

    redis> HSETNX database key-value-store Redis (integer) 1redis> HGET database key-value-store "Redis"

    域已經存在, 設置未成功, 域原有的值未被改變:

    redis> HSETNX database key-value-store Riak (integer) 0redis> HGET database key-value-store "Redis"

    5. HLEN
    時間復雜度:O(1)

    返回哈希表 key 中域的數量。當 key 不存在時,返回 0 。

    redis> HSET db redis redis.com (integer) 1redis> HSET db mysql mysql.com (integer) 1redis> HLEN db (integer) 2redis> HSET db mongodb mongodb.org (integer) 1redis> HLEN db (integer) 3

    6.HMSET
    HMSET key field value [field value …]
    時間復雜度:O(N), N 為 field-value 對的數量。

    同時將多個 field-value (域-值)對設置到哈希表 key 中。此命令會覆蓋哈希表中已存在的域。如果 key 不存在,一個空哈希表被創建并執行 HMSET 操作。如果命令執行成功,返回 OK 。當 key 不是哈希表(hash)類型時,返回一個錯誤。

    redis> HMSET website google www.google.com yahoo www.yahoo.com OKredis> HGET website google "www.google.com"redis> HGET website yahoo "www.yahoo.com"

    7. HMGET
    HMGET key field [field …]
    時間復雜度:O(N), N 為給定域的數量。

    返回哈希表 key 中,一個或多個給定域的值。
    如果給定的域不存在于哈希表,那么返回一個 nil 值。因為不存在的 key 被當作一個空哈希表來處理,所以對一個不存在的 key 進行 HMGET 操作將返回一個只帶有 nil 值的表。具體返回一個包含多個給定域的關聯值的表,表值的排列順序和給定域參數的請求順序一樣。

    redis> HMSET pet dog "doudou" cat "nounou" # 一次設置多個域 OKredis> HMGET pet dog cat fake_pet # 返回值的順序和傳入參數的順序一樣 1) "doudou" 2) "nounou" 3) (nil) # 不存在的域返回nil值

    8.HINCRBY
    HINCRBY key field increment
    時間復雜度:O(1)
    為哈希表 key 中的域 field 的值加上增量 increment 。增量也可以為負數,相當于對給定域進行減法操作。如果 key 不存在,一個新的哈希表被創建并執行 HINCRBY 命令。如果域 field 不存在,那么在執行命令前,域的值被初始化為 0 。對一個儲存字符串值的域 field 執行 HINCRBY 命令將造成一個錯誤。本操作的值被限制在 64 位(bit)有符號數字表示之內。執行 HINCRBY 命令之后,返回值哈希表 key 中域 field 的值。

    # increment 為正數 redis> HEXISTS counter page_view # 對空域進行設置 (integer) 0redis> HINCRBY counter page_view 200 (integer) 200redis> HGET counter page_view "200"# increment 為負數 redis> HGET counter page_view "200"redis> HINCRBY counter page_view -50 (integer) 150redis> HGET counter page_view "150"# 嘗試對字符串值的域執行HINCRBY命令 redis> HSET myhash string hello,world # 設定一個字符串值 (integer) 1redis> HGET myhash string "hello,world"redis> HINCRBY myhash string 1 # 命令執行失敗,錯誤。 (error) ERR hash value is not an integerredis> HGET myhash string # 原值不變 "hello,world"

    9. HKEYS
    時間復雜度:O(N), N 為哈希表的大小。

    返回哈希表 key 中的所有域。即一個包含哈希表中所有域的表。當 key 不存在時,返回一個空表。

    # 哈希表非空 redis> HMSET website google www.google.com yahoo www.yahoo.com OKredis> HKEYS website 1) "google" 2) "yahoo"# 空哈希表/key不存在 redis> EXISTS fake_key (integer) 0redis> HKEYS fake_key (empty list or set)

    10.HVALS
    HVALS key
    時間復雜度:O(N), N 為哈希表的大小。
    返回哈希表 key 中所有域的值。即一個包含哈希表中所有值的表。當 key 不存在時,返回一個空表。

    # 非空哈希表 redis> HMSET website google www.google.com yahoo www.yahoo.com OKredis> HVALS website 1) "www.google.com" 2) "www.yahoo.com"# 空哈希表/不存在的key redis> EXISTS not_exists (integer) 0redis> HVALS not_exists (empty list or set)

    11.HGETALL
    時間復雜度:O(N), N 為哈希表的大小。
    HGETALL key
    返回哈希表 key 中,所有的域和值。在返回值里,緊跟每個域名(field name)之后是域的值(value),所以返回值的長度是哈希表大小的兩倍。返回值以列表形式返回哈希表的域和域的值。若 key 不存在,返回空列表。

    redis> HSET people jack "Jack Sparrow" (integer) 1redis> HSET people gump "Forrest Gump" (integer) 1redis> HGETALL people 1) "jack" # 域 2) "Jack Sparrow" # 值 3) "gump" 4) "Forrest Gump"

    小心單線程 數據量大的話 會比較慢

    12. hsetnx
    時間復雜度: O(1)

    當且僅當域 field 尚未存在于哈希表的情況下, 將它的值設置為 value 。如果給定域已經存在于哈希表當中, 那么命令將放棄執行設置操作。如果哈希表 hash 不存在, 那么一個新的哈希表將被創建并執行 HSETNX 命令。HSETNX 命令在設置成功時返回 1 , 在給定域已經存在而放棄執行設置操作時返回 0 。

    域尚未存在, 設置成功:

    redis> HSETNX database key-value-store Redis (integer) 1redis> HGET database key-value-store "Redis"

    域已經存在, 設置未成功, 域原有的值未被改變:

    redis> HSETNX database key-value-store Riak (integer) 0redis> HGET database key-value-store "Redis"

    13. hincrbyfloat
    HINCRBYFLOAT key field increment
    時間復雜度:O(1)
    為哈希表 key 中的域 field 加上浮點數增量 increment 。如果哈希表中沒有域 field ,那么 HINCRBYFLOAT 會先將域 field 的值設為 0 ,然后再執行加法操作。如果鍵 key 不存在,那么 HINCRBYFLOAT 會先創建一個哈希表,再創建域 field ,最后再執行加法操作。當以下任意一個條件發生時,返回一個錯誤:

    • 域 field 的值不是字符串類型(因為 redis 中的數字和浮點數都以字符串的形式保存,所以它們都屬于字符串類型)
    • 域 field 當前的值或給定的增量 increment 不能解釋(parse)為雙精度浮點數(double precision floating point number)
      返回值為返回值:執行加法操作之后 field 域的值。
    # 值和增量都是普通小數 redis> HSET mykey field 10.50 (integer) 1 redis> HINCRBYFLOAT mykey field 0.1 "10.6"# 值和增量都是指數符號 redis> HSET mykey field 5.0e3 (integer) 0 redis> HINCRBYFLOAT mykey field 2.0e2 "5200"# 對不存在的鍵執行 HINCRBYFLOAT redis> EXISTS price (integer) 0 redis> HINCRBYFLOAT price milk 3.5 "3.5" redis> HGETALL price 1) "milk" 2) "3.5"# 對不存在的域進行 HINCRBYFLOAT redis> HGETALL price 1) "milk" 2) "3.5" redis> HINCRBYFLOAT price coffee 4.5 # 新增 coffee 域 "4.5" redis> HGETALL price 1) "milk" 2) "3.5" 3) "coffee" 4) "4.5"

    知道上面的命令后,就可以做一些事情了。

    應用
    類似于字符串,我們可以記錄網站每個用戶個人主頁的訪問量

    hincrby user chenxiao pageviewCount

    當然還有緩存用戶信息。

    對于記錄個人主頁的訪問量,自然字符串要比hash更好點。

    但是對于緩存用戶新信息這種邏輯要好好斟酌一下

    字符串Key:Value的結構:(第一種方案 String-v1)

    key: 'user:userId' value: {"name": "chenxiao","age":100,"pageview": 8000000 }

    value是序列化的結果

    字符串Key:Value的結構:(第二種方案 String-v2)

    key: user:userId:name value: chenxiaokey: user:userId:age value: 100key: user:userId:pageView value: 800000

    相比上面的方案更新屬性更方便 只需要一條

    再看看hash形式的方案(hash)

    key:user:userIdfield:name value:chenxiaofield:age value:100field:pageView vale:80000

    3種方案比較:

    方案優點缺點
    String v1編程簡單,可能節約內存1.序列化開銷 2.設置屬性要操作整個數據。
    String v2直觀,可以部分更新1.內存占用較大 2.key較為分散
    hash直觀 節省空間 可以部分更新1.編程稍微復雜 2.ttl不好控制

    (六)列表

    Redis 的列表相當于 Java 語???的 LinkedList,數據結構形式為鏈表,插?和刪除操作????#xff0c;時間復雜度為O(1),但是索引定位很慢,時間復雜度為 O(n)。

    當列表彈出了最后?個元素之后,該數據結構?動被刪除,內存被回收。

    插入元素后,各元素的相對位置確定,遍歷的結果也與之保持一致。鏈表元素可以重復。下面我們看看它的API

    1.LPUSH
    LPUSH key value [value …]
    時間復雜度: O(1)

    將一個或多個值 value 插入到列表 key 的表頭。如果有多個 value 值,那么各個 value 值按從左到右的順序依次插入到表頭: 比如說,對空列表 mylist 執行命令 LPUSH mylist a b c ,列表的值將是 c b a ,這等同于原子性地執行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三個命令。如果 key 不存在,一個空列表會被創建并執行 LPUSH 操作。當 key 存在但不是列表類型時,返回一個錯誤。正常返回列表的長度。

    # 加入單個元素 redis> LPUSH languages python (integer) 1# 加入重復元素 redis> LPUSH languages python (integer) 2redis> LRANGE languages 0 -1 # 列表允許重復元素 1) "python" 2) "python"# 加入多個元素 redis> LPUSH mylist a b c (integer) 3redis> LRANGE mylist 0 -1 1) "c" 2) "b" 3) "a"

    2.RPUSH
    RPUSH key value [value …]
    時間復雜度: O(1)

    將一個或多個值 value 插入到列表 key 的表尾(最右邊)。如果有多個 value 值,那么各個 value 值按從左到右的順序依次插入到表尾:比如對一個空列表 mylist 執行 RPUSH mylist a b c ,得出的結果列表為 a b c ,等同于執行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。如果 key 不存在,一個空列表會被創建并執行 RPUSH 操作。當 key 存在但不是列表類型時,返回一個錯誤。正常返回列表的長度。

    # 添加單個元素 redis> RPUSH languages c (integer) 1# 添加重復元素 redis> RPUSH languages c (integer) 2redis> LRANGE languages 0 -1 # 列表允許重復元素 1) "c" 2) "c"# 添加多個元素 redis> RPUSH mylist a b c (integer) 3redis> LRANGE mylist 0 -1 1) "a" 2) "b" 3) "c"

    3.LINSERT
    LINSERT key BEFORE|AFTER pivot value
    時間復雜度: O(N), N 為尋找 pivot 過程中經過的元素數量。

    將值 value 插入到列表 key 當中,位于值 pivot 之前或之后。當 pivot 不存在于列表 key 時,不執行任何操作。當 key 不存在時, key 被視為空列表,不執行任何操作。如果 key 不是列表類型,返回一個錯誤。如果命令執行成功,返回插入操作完成之后,列表的長度。 如果沒有找到 pivot ,返回 -1 。 如果 key 不存在或為空列表,返回 0 。

    redis> RPUSH mylist "Hello" (integer) 1redis> RPUSH mylist "World" (integer) 2redis> LINSERT mylist BEFORE "World" "There" (integer) 3redis> LRANGE mylist 0 -1 1) "Hello" 2) "There" 3) "World"# 對一個非空列表插入,查找一個不存在的 pivot redis> LINSERT mylist BEFORE "go" "let's" (integer) -1 # 失敗# 對一個空列表執行 LINSERT 命令 redis> EXISTS fake_list (integer) 0redis> LINSERT fake_list BEFORE "nono" "gogogog" (integer) 0 # 失敗

    4.LPOP
    LPOP key
    時間復雜度: O(1)

    移除并返回列表 key 的頭元素。返回列表的頭元素。 當 key 不存在時,返回 nil 。

    redis> LLEN course (integer) 0redis> RPUSH course algorithm001 (integer) 1redis> RPUSH course c++101 (integer) 2redis> LPOP course # 移除頭元素 "algorithm001"

    5.RPOP
    RPOP key
    時間復雜度: O(1)

    移除并返回列表 key 的尾元素。返回列表的尾元素。 當 key 不存在時,返回 nil 。

    redis> RPUSH mylist "one" (integer) 1redis> RPUSH mylist "two" (integer) 2redis> RPUSH mylist "three" (integer) 3redis> RPOP mylist # 返回被彈出的元素 "three"redis> LRANGE mylist 0 -1 # 列表剩下的元素 1) "one" 2) "two"

    6.LREM
    LREM key count value

    時間復雜度: O(N), N 為列表的長度。
    根據參數 count 的值,移除列表中與參數 value 相等的元素。

    count 的值可以是以下幾種:

    • count > 0 : 從表頭開始向表尾搜索,移除與 value 相等的元素,數量為 count 。
    • count < 0 : 從表尾開始向表頭搜索,移除與 value 相等的元素,數量為 count 的絕對值。
    • count = 0 : 移除表中所有與 value 相等的值。

    返回值被移除元素的數量。 因為不存在的 key 被視作空表(empty list),所以當 key 不存在時, LREM 命令總是返回 0 。

    # 先創建一個表,內容排列是 # morning hello morning helllo morningredis> LPUSH greet "morning" (integer) 1 redis> LPUSH greet "hello" (integer) 2 redis> LPUSH greet "morning" (integer) 3 redis> LPUSH greet "hello" (integer) 4 redis> LPUSH greet "morning" (integer) 5redis> LRANGE greet 0 4 # 查看所有元素 1) "morning" 2) "hello" 3) "morning" 4) "hello" 5) "morning"redis> LREM greet 2 morning # 移除從表頭到表尾,最先發現的兩個 morning (integer) 2 # 兩個元素被移除redis> LLEN greet # 還剩 3 個元素 (integer) 3redis> LRANGE greet 0 2 1) "hello" 2) "hello" 3) "morning"redis> LREM greet -1 morning # 移除從表尾到表頭,第一個 morning (integer) 1redis> LLEN greet # 剩下兩個元素 (integer) 2redis> LRANGE greet 0 1 1) "hello" 2) "hello"redis> LREM greet 0 hello # 移除表中所有 hello (integer) 2 # 兩個 hello 被移除redis> LLEN greet (integer) 0

    7.LTRIM
    LTRIM key start stop
    時間復雜度: O(N), N 為被移除的元素的數量。
    對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。

    這個從字面意思不容易理解 ,我們圖解一下:


    運行命令

    Itrim listkey 1 4

    結果

    上面的圖能一下子讓你看懂,它是做什么的了,下面演示一下

    # 情況 1: 常見情況, start 和 stop 都在列表的索引范圍之內 redis> LRANGE alpha 0 -1 # alpha 是一個包含 5 個字符串的列表 1) "h" 2) "e" 3) "l" 4) "l" 5) "o"redis> LTRIM alpha 1 -1 # 刪除 alpha 列表索引為 0 的元素 OKredis> LRANGE alpha 0 -1 # "h" 被刪除了 1) "e" 2) "l" 3) "l" 4) "o"# 情況 2: stop 比列表的最大下標還要大 redis> LTRIM alpha 1 10086 # 保留 alpha 列表索引 1 至索引 10086 上的元素 OKredis> LRANGE alpha 0 -1 # 只有索引 0 上的元素 "e" 被刪除了,其他元素還在 1) "l" 2) "l" 3) "o"# 情況 3: start 和 stop 都比列表的最大下標要大,并且 start < stop redis> LTRIM alpha 10086 123321 OKredis> LRANGE alpha 0 -1 # 列表被清空 (empty list or set)# 情況 4: start 和 stop 都比列表的最大下標要大,并且 start > stop redis> RPUSH new-alpha "h" "e" "l" "l" "o" # 重新建立一個新列表 (integer) 5redis> LRANGE new-alpha 0 -1 1) "h" 2) "e" 3) "l" 4) "l" 5) "o"redis> LTRIM new-alpha 123321 10086 # 執行 LTRIM OKredis> LRANGE new-alpha 0 -1 # 同樣被清空 (empty list or set)

    8.LINDEX
    LINDEX key index
    時間復雜度:O(N), N 為到達下標 index 過程中經過的元素數量。因此,對列表的頭元素和尾元素執行 LINDEX 命令,復雜度為O(1)。

    返回列表 key 中,下標為 index 的元素。下標(index)參數 start 和 stop 都以 0 為底,也就是說,以 0 表示列表的第一個元素,以 1 表示列表的第二個元素,以此類推。你也可以使用負數下標,以 -1 表示列表的最后一個元素, -2 表示列表的倒數第二個元素,以此類推。如果 key 不是列表類型,返回一個錯誤。返回列表中下標為 index 的元素。 如果 index 參數的值不在列表的區間范圍內(out of range),返回 nil 。

    redis> LPUSH mylist "World" (integer) 1redis> LPUSH mylist "Hello" (integer) 2redis> LINDEX mylist 0 "Hello"redis> LINDEX mylist -1 "World"redis> LINDEX mylist 3 # index不在 mylist 的區間范圍內 (nil)

    9.LLEN
    LLEN key
    時間復雜度: O(1)

    返回列表 key 的長度。如果 key 不存在,則 key 被解釋為一個空列表,返回 0 .如果 key 不是列表類型,返回一個錯誤。

    # 空列表 redis> LLEN job (integer) 0# 非空列表 redis> LPUSH job "cook food" (integer) 1redis> LPUSH job "have lunch" (integer) 2redis> LLEN job (integer) 2

    10.LSET
    LSET key index value
    時間復雜度:對頭元素或尾元素進行 LSET 操作,復雜度為 O(1)。其他情況下,為 O(N), N 為列表的長度。

    將列表 key 下標為 index 的元素的值設置為 value 。當 index 參數超出范圍,或對一個空列表( key 不存在)進行 LSET 時,返回一個錯誤。操作成功返回 ok ,否則返回錯誤信息。

    # 對空列表(key 不存在)進行 LSETredis> EXISTS list (integer) 0redis> LSET list 0 item (error) ERR no such key# 對非空列表進行 LSETredis> LPUSH job "cook food" (integer) 1redis> LRANGE job 0 0 1) "cook food"redis> LSET job 0 "play game" OKredis> LRANGE job 0 0 1) "play game"# index 超出范圍redis> LLEN list # 列表長度為 1 (integer) 1redis> LSET list 3 'out of range' (error) ERR index out of range

    下面我們看一下它的應用:

    最典型的就是時間軸。

    以CSDN APP的bink推薦為例,

    當有一個bink發表的時候,要將這個blink插入時間軸第一個位置??梢允荓PUSH的操作。這樣子每次你就能從列表中,看到最新的blink,越往下時間越遠。

    11. BLPOP
    BLPOP key [key …] timeout
    時間復雜度: O(1)

    BLPOP 是列表的阻塞式(blocking)彈出原語。它是 LPOP key 命令的阻塞版本,當給定列表內沒有任何元素可供彈出的時候,連接將被 BLPOP 命令阻塞,直到等待超時或發現可彈出元素為止。當給定多個 key 參數時,按參數 key 的先后順序依次檢查各個列表,彈出第一個非空列表的頭元素。

    12.BRPOP
    BRPOP key [key …] timeout
    時間復雜度: O(1)

    BRPOP 是列表的阻塞式(blocking)彈出原語。它是 RPOP key 命令的阻塞版本,當給定列表內沒有任何元素可供彈出的時候,連接將被 BRPOP 命令阻塞,直到等待超時或發現可彈出元素為止。當給定多個 key 參數時,按參數 key 的先后順序依次檢查各個列表,彈出第一個非空列表的尾部元素。

    下面再看一個Redis的應用:簡易的消息隊列

    Redis 的簡易的消息隊列不是專業的消息隊列,它沒有?常多的?級特性,沒有 ack 保證,如果對消息的可靠性有著極致的追求,那么它就不適合使?。但是對于那些只有?組消費者的消息隊列,使? Redis 就可以?常輕松的搞定。

    后面會談到Redis的高級特性–發布訂閱。這個也是消息隊列

    異步消息隊列
    Redis 的 list(列表) 數據結構常?來作為異步消息隊列使?,使?rpush/lpush操作?隊列,使?lpop 和 rpop來出隊列。

    客戶端是通過隊列的 pop 操作來獲取消息,然后進?處理。處理完了再接著獲取消息,再進?處理。如此循環往復。

    但是如果隊列空了,客戶端就會陷? pop 的死循環,不停地 pop。這樣不但拉?了客戶端的 CPU,redis 的 QPS(每秒執行次數) 也會被拉?,如果這樣不斷輪詢的客戶端有??來個,資源被大量無效占用。通常我們使? sleep 來解決這個問題,讓線程睡?會,睡個 1s 鐘就可以了。不但客戶端的 CPU 能降下來,Redis 的 QPS 也降下來了。不過這樣也并不是很好的手段,

    延時隊列
    運用blpop/brpop構建延時隊列是一個非常好的方式。這兩個指令的前綴字符b代表的是blocking,也就是阻塞讀。

    阻塞讀在隊列沒有數據的時候,會?即進?休眠狀態,?旦數據到來,則?刻醒過來。消息的延遲?乎為零。不過這也帶來一個問題:空閑連接。如果線程?直阻塞在哪?,Redis 的客戶端連接就成了閑置連接,閑置過久,服務器?般會主動斷開連接,減少閑置資源占?。這個時候blpop/brpop會拋出異常來。編寫客戶端消費者的時候要??,注意捕獲異常,還要重試。

    在上面簡單說明分布式鎖的時候,沒有提到客戶端在處理請求時加鎖沒加成功怎么辦。
    對于這種情況,有 3 種策略來處理加鎖失敗:

  • 直接拋出異常,通知?戶稍后重試;
  • sleep ?會再重試;
  • 將請求轉移?延時隊列,過?會再試;
  • (七)Set集合

    Redis 的集合相當于 Java 語???的 HashSet,它內部的鍵值對是?序的唯?的。它的內部實現相當于?個特殊的字典,字典中所有的value 都是?個值NULL。當集合中最后?個元素移除之后,數據結構?動刪除,內存被回收。

    插入之后,元素的先后位置是不固定的,遍歷的時候無序。

    下面我們看一下它的API

    1.SADD
    SADD key member [member …]
    時間復雜度: O(N), N 是被添加的元素的數量。

    將一個或多個 member 元素加入到集合 key 當中,已經存在于集合的 member 元素將被忽略。假如 key 不存在,則創建一個只包含 member 元素作成員的集合。當 key 不是集合類型時,返回一個錯誤。正常返回被添加到集合中的新元素的數量,不包括被忽略的元素。

    # 添加單個元素 redis> SADD bbs "discuz.net" (integer) 1# 添加重復元素 redis> SADD bbs "discuz.net" (integer) 0# 添加多個元素 redis> SADD bbs "tianya.cn" "groups.google.com" (integer) 2redis> SMEMBERS bbs 1) "discuz.net" 2) "groups.google.com" 3) "tianya.cn"

    2.SCARD
    SCARD key
    時間復雜度: O(1)
    返回集合 key 的基數(集合中元素的數量)。當 key 不存在時,返回 0 。

    redis> SADD tool pc printer phone (integer) 3redis> SCARD tool # 非空集合 (integer) 3redis> DEL tool (integer) 1redis> SCARD tool # 空集合 (integer) 0

    3.SMEMBERS
    SMEMBERS key
    時間復雜度: O(N), N 為集合的基數。返回集合 key 中的所有成員。不存在的 key 被視為空集合。

    # key 不存在或集合為空redis> EXISTS not_exists_key (integer) 0redis> SMEMBERS not_exists_key (empty list or set)# 非空集合redis> SADD language Ruby Python Clojure (integer) 3redis> SMEMBERS language 1) "Python" 2) "Ruby" 3) "Clojure"

    可以看出來,插入順序,與返回順序不同。要小心使用

    4.srandmember和spop
    SRANDMEMBER key [count]
    時間復雜度: 只提供 key 參數時為 O(1) 。如果提供了 count 參數,那么為 O(N) ,N 為返回數組的元素個數。

    如果命令執行時,只提供了 key 參數,那么返回集合中的一個隨機元素。
    從 Redis 2.6 版本開始, SRANDMEMBER 命令接受可選的 count 參數:

    • 如果 count 為正數,且小于集合基數,那么命令返回一個包含 count 個元素的數組,數組中的元素各不相同。如果 count 大于等于集合基數,那么返回整個集合。
    • 如果 count 為負數,那么命令返回一個數組,數組中的元素可能會重復出現多次,而數組的長度為 count 的絕對值。
    # 添加元素 redis> SADD fruit apple banana cherry (integer) 3# 只給定 key 參數,返回一個隨機元素 redis> SRANDMEMBER fruit "cherry"redis> SRANDMEMBER fruit "apple"# 給定 3 為 count 參數,返回 3 個隨機元素 # 每個隨機元素都不相同 redis> SRANDMEMBER fruit 3 1) "apple" 2) "banana" 3) "cherry"# 給定 -3 為 count 參數,返回 3 個隨機元素 # 元素可能會重復出現多次 redis> SRANDMEMBER fruit -3 1) "banana" 2) "cherry" 3) "apple"redis> SRANDMEMBER fruit -3 1) "apple" 2) "apple" 3) "cherry"# 如果 count 是整數,且大于等于集合基數,那么返回整個集合 redis> SRANDMEMBER fruit 10 1) "apple" 2) "banana" 3) "cherry"# 如果 count 是負數,且 count 的絕對值大于集合的基數 # 那么返回的數組的長度為 count 的絕對值 redis> SRANDMEMBER fruit -10 1) "banana" 2) "apple" 3) "banana" 4) "cherry" 5) "apple" 6) "apple" 7) "cherry" 8) "apple" 9) "apple" 10) "banana"# SRANDMEMBER 并不會修改集合內容 redis> SMEMBERS fruit 1) "apple" 2) "cherry" 3) "banana"# 集合為空時返回 nil 或者空數組 redis> SRANDMEMBER not-exists (nil)redis> SRANDMEMBER not-eixsts 10 (empty list or set) 討論

    SPOP key
    時間復雜度: O(1)
    移除并返回集合中的一個隨機元素。如果只想獲取一個隨機元素,但不想該元素從集合中被移除的話,可以使用 SRANDMEMBER key [count] 命令。

    redis> SMEMBERS db 1) "MySQL" 2) "MongoDB" 3) "Redis"redis> SPOP db "Redis"redis> SMEMBERS db 1) "MySQL" 2) "MongoDB"redis> SPOP db "MySQL"redis> SMEMBERS db 1) "MongoDB"

    spop從集合彈出 srandmembe不會破壞集合

    下面我們看看應用:
    CSDN的點贊狀態就可以用set集合進行處理。類似于點贊、踩這種場景,狀態不重復,就可以set集合。


    還有CSDN發表博文的時候,給文章打標簽,標簽就可以存儲在set集合中

    除此之外,set 結構可以?來存儲活動中獎的?戶 ID,因為有去重功能,可以保證同?個?戶不會中獎兩次。

    下面看看集合間的API

    5.sdiff sinter sunion

    分別是差集 交集 并集。

    這個玩法就比較多了。

    比如微信上,將每個人擁有的群id都存儲在每個人的set集合中

    我們只要對兩個人的集合取交集,就可以得出 我和他的公共群聊的個數。

    (八)zset (有序集合)

    zset 類似于 Java 的 SortedSet 和HashMap的結合體,

    ???它是?個 set,保證了內部 value 的唯?性,另???它可以給每個 value 賦予?個 score,代表這個 value 的排序權重。它的內部實現?的是?種叫做「跳躍列表」的數據結構。zset 中最后?個 value 被移除后,數據結構?動刪除,內存被回收。

    有序集合結構:
    key: user

    scorevalue
    1tom
    91jerry
    102jeffery

    集合 VS 有序集合
    集合:無重復元素、無序、element
    有序集合 : 無重復元素、有序、element + score
    有序集合相比集合時間復雜度較高

    1.ZADD
    ZADD key score member [[score member] [score member] …]
    時間復雜度: O(M*log(N)), N 是有序集的基數, M 為成功添加的新成員的數量。

    將一個或多個 member 元素及其 score 值加入到有序集 key 當中。如果某個 member 已經是有序集的成員,那么更新這個 member 的 score 值,并通過重新插入這個 member 元素,來保證該 member 在正確的位置上。score 值可以是整數值或雙精度浮點數。如果 key 不存在,則創建一個空的有序集并執行 ZADD 操作。當 key 存在但不是有序集類型時,返回一個錯誤。正常返回被成功添加的新成員的數量,不包括那些被更新的、已經存在的成員。

    # 添加單個元素 redis> ZADD page_rank 10 google.com (integer) 1# 添加多個元素 redis> ZADD page_rank 9 baidu.com 8 bing.com (integer) 2redis> ZRANGE page_rank 0 -1 WITHSCORES 1) "bing.com" 2) "8" 3) "baidu.com" 4) "9" 5) "google.com" 6) "10"# 添加已存在元素,且 score 值不變 redis> ZADD page_rank 10 google.com (integer) 0redis> ZRANGE page_rank 0 -1 WITHSCORES # 沒有改變 1) "bing.com" 2) "8" 3) "baidu.com" 4) "9" 5) "google.com" 6) "10"# 添加已存在元素,但是改變 score 值 redis> ZADD page_rank 6 bing.com (integer) 0redis> ZRANGE page_rank 0 -1 WITHSCORES # bing.com 元素的 score 值被改變 1) "bing.com" 2) "6" 3) "baidu.com" 4) "9" 5) "google.com" 6) "10"

    2.ZREM
    ZREM key member [member …]
    時間復雜度: O(M*log(N)), N 為有序集的基數, M 為被成功移除的成員的數量。

    移除有序集 key 中的一個或多個成員,不存在的成員將被忽略。當 key 存在但不是有序集類型時,返回一個錯誤。正常返回值
    被成功移除的成員的數量,不包括被忽略的成員。

    # 測試數據 redis> ZRANGE page_rank 0 -1 WITHSCORES 1) "bing.com" 2) "8" 3) "baidu.com" 4) "9" 5) "google.com" 6) "10"# 移除單個元素 redis> ZREM page_rank google.com (integer) 1redis> ZRANGE page_rank 0 -1 WITHSCORES 1) "bing.com" 2) "8" 3) "baidu.com" 4) "9"# 移除多個元素 redis> ZREM page_rank baidu.com bing.com (integer) 2redis> ZRANGE page_rank 0 -1 WITHSCORES (empty list or set)# 移除不存在元素 redis> ZREM page_rank non-exists-element (integer) 0

    3.zscore
    ZSCORE key member
    時間復雜度: O(1)

    返回有序集 key 中,成員 member 的 score 值(member 成員的 score 值,以字符串形式表示)。如果 member 元素不是有序集 key 的成員,或 key 不存在,返回 nil 。

    1) "tom" 2) "2000" 3) "peter" 4) "3500" 5) "jack" 6) "5000"redis> ZSCORE salary peter # 注意返回值是字符串 "3500"

    4.ZINCRBY
    ZINCRBY key increment member
    時間復雜度: O(log(N))

    為有序集 key 的成員 member 的 score 值加上增量 increment 。可以通過傳遞一個負數值 increment ,讓 score 減去相應的值,比如 ZINCRBY key -5 member ,就是讓 member 的 score 值減去 5 。當 key 不存在,或 member 不是 key 的成員時, ZINCRBY key increment member 等同于 ZADD key increment member 。當 key 不是有序集類型時,返回一個錯誤。score 值可以是整數值或雙精度浮點數。正常返回值為member 成員的新 score 值,以字符串形式表示。

    redis> ZSCORE salary tom "2000"redis> ZINCRBY salary 2000 tom # tom 加薪啦! "4000"

    5.zcard
    ZCARD key
    時間復雜度: O(1)
    當 key 存在且是有序集類型時,返回有序集的基數。 當 key 不存在時,返回 0 。

    redis > ZADD salary 2000 tom # 添加一個成員 (integer) 1redis > ZCARD salary (integer) 1redis > ZADD salary 5000 jack # 再添加一個成員 (integer) 1redis > ZCARD salary (integer) 2redis > EXISTS non_exists_key # 對不存在的 key 進行 ZCARD 操作 (integer) 0redis > ZCARD non_exists_key (integer) 0

    6.ZRANGE
    ZRANGE key start stop [WITHSCORES]
    時間復雜度: O(log(N)+M), N 為有序集的基數,而 M 為結果集的基數。

    返回有序集 key 中,指定區間內的成員。其中成員的位置按 score 值遞增(從小到大)來排序。具有相同 score 值的成員按字典序(lexicographical order )來排列。如果你需要成員按 score 值遞減(從大到小)來排列,請使用 ZREVRANGE key start stop [WITHSCORES] 命令。下標參數 start 和 stop 都以 0 為底,也就是說,以 0 表示有序集第一個成員,以 1 表示有序集第二個成員,以此類推。 你也可以使用負數下標,以 -1 表示最后一個成員, -2 表示倒數第二個成員,以此類推。超出范圍的下標并不會引起錯誤。 比如說,當 start 的值比有序集的最大下標還要大,或是 start > stop 時, ZRANGE 命令只是簡單地返回一個空列表。 另一方面,假如 stop 參數的值比有序集的最大下標還要大,那么 Redis 將 stop 當作最大下標來處理??梢酝ㄟ^使用 WITHSCORES 選項,來讓成員和它的 score 值一并返回,返回列表以 value1,score1, …, valueN,scoreN 的格式表示。 客戶端庫可能會返回一些更復雜的數據類型,比如數組、元組等。返回為指定區間內,帶有 score 值(可選)的有序集成員的列表。

    redis > ZRANGE salary 0 -1 WITHSCORES # 顯示整個有序集成員 1) "jack" 2) "3500" 3) "tom" 4) "5000" 5) "boss" 6) "10086"redis > ZRANGE salary 1 2 WITHSCORES # 顯示有序集下標區間 1 至 2 的成員 1) "tom" 2) "5000" 3) "boss" 4) "10086"redis > ZRANGE salary 0 200000 WITHSCORES # 測試 end 下標超出最大下標時的情況 1) "jack" 2) "3500" 3) "tom" 4) "5000" 5) "boss" 6) "10086"redis > ZRANGE salary 200000 3000000 WITHSCORES # 測試當給定區間不存在于有序集時的情況 (empty list or set)

    7.ZRANGEBYSCOR
    ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

    時間復雜度: O(log(N)+M), N 為有序集的基數, M 為被結果集的基數。

    返回有序集 key 中,所有 score 值介于 min 和 max 之間(包括等于 min 或 max )的成員。有序集成員按 score 值遞增(從小到大)次序排列。具有相同 score 值的成員按字典序(lexicographical order)來排列(該屬性是有序集提供的,不需要額外的計算)。

    可選的 LIMIT 參數指定返回結果的數量及區間(就像SQL中的 SELECT LIMIT offset, count ),注意當 offset 很大時,定位 offset 的操作可能需要遍歷整個有序集,此過程最壞復雜度為 O(N) 時間。

    可選的 WITHSCORES 參數決定結果集是單單返回有序集的成員,還是將有序集成員及其 score 值一起返回。 該選項自 Redis 2.0 版本起可用。

    區間及無限
    min 和 max 可以是 -inf 和 +inf ,這樣一來,你就可以在不知道有序集的最低和最高 score 值的情況下,使用ZRANGEBYSCORE 這類命令。默認情況下,區間的取值使用閉區間 (小于等于或大于等于),你也可以通過給參數前增加 ( 符號來使用可選的開區間 (小于或大于)。

    (integer) 0 redis> ZADD salary 5000 tom (integer) 0 redis> ZADD salary 12000 peter (integer) 0redis> ZRANGEBYSCORE salary -inf +inf # 顯示整個有序集 1) "jack" 2) "tom" 3) "peter"redis> ZRANGEBYSCORE salary -inf +inf WITHSCORES # 顯示整個有序集及成員的 score 值 1) "jack" 2) "2500" 3) "tom" 4) "5000" 5) "peter" 6) "12000"redis> ZRANGEBYSCORE salary -inf 5000 WITHSCORES # 顯示工資 <=5000 的所有成員 1) "jack" 2) "2500" 3) "tom" 4) "5000"redis> ZRANGEBYSCORE salary (5000 400000 # 顯示工資大于 5000 小于等于 400000 的成員 1) "peter"

    8.zcount
    ZCOUNT key min max

    時間復雜度: O(log(N)), N 為有序集的基數。
    返回有序集 key 中, score 值在 min 和 max 之間(默認包括 score 值等于 min 或 max )的成員的數量。關于參數 min 和 max 的詳細使用方法,請參考 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 命令。返回值為score 值在 min 和 max 之間的成員的數量。

    redis> ZRANGE salary 0 -1 WITHSCORES # 測試數據 1) "jack" 2) "2000" 3) "peter" 4) "3500" 5) "tom" 6) "5000"redis> ZCOUNT salary 2000 5000 # 計算薪水在 2000-5000 之間的人數 (integer) 3redis> ZCOUNT salary 3000 5000 # 計算薪水在 3000-5000 之間的人數 (integer) 2

    9.zremrangebyrank
    ZREMRANGEBYRANK key start stop
    時間復雜度: O(log(N)+M), N 為有序集的基數,而 M 為被移除成員的數量。

    移除有序集 key 中,指定排名(rank)區間內的所有成員。區間分別以下標參數 start 和 stop 指出,包含 start 和 stop 在內。

    下標參數 start 和 stop 都以 0 為底,也就是說,以 0 表示有序集第一個成員,以 1 表示有序集第二個成員,以此類推。 你也可以使用負數下標,以 -1 表示最后一個成員, -2 表示倒數第二個成員,以此類推。返回值為被移除成員的數量。

    redis> ZADD salary 2000 jack (integer) 1 redis> ZADD salary 5000 tom (integer) 1 redis> ZADD salary 3500 peter (integer) 1redis> ZREMRANGEBYRANK salary 0 1 # 移除下標 0 至 1 區間內的成員 (integer) 2redis> ZRANGE salary 0 -1 WITHSCORES # 有序集只剩下一個成員 1) "tom" 2) "5000"

    10.zremrangebyscore
    ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

    時間復雜度: O(log(N)+M), N 為有序集的基數, M 為結果集的基數。

    返回有序集 key 中, score 值介于 max 和 min 之間(默認包括等于 max 或 min )的所有的成員。有序集成員按 score 值遞減(從大到小)的次序排列。具有相同 score 值的成員按字典序的逆序(reverse lexicographical order )排列。
    除了成員按 score 值遞減的次序排列這一點外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 命令一樣。
    返回值為指定區間內,帶有 score 值(可選)的有序集成員的列表。

    redis > ZADD salary 10086 jack (integer) 1 redis > ZADD salary 5000 tom (integer) 1 redis > ZADD salary 7500 peter (integer) 1 redis > ZADD salary 3500 joe (integer) 1redis > ZREVRANGEBYSCORE salary +inf -inf # 逆序排列所有成員 1) "jack" 2) "peter" 3) "tom" 4) "joe"redis > ZREVRANGEBYSCORE salary 10000 2000 # 逆序排列薪水介于 10000 和 2000 之間的成員 1) "peter" 2) "tom" 3) "joe"

    我們看一下它具體的應用:
    首先最容易想到的就是排行榜了。
    (博主在long long ago 也曾第一過)

    類似的,zset 還可以?來存儲學?的成績,value 值是學?的 ID,score 是他的考試成績。我們可以對成績按分數進?排序就可以得到他的名次。
    除此之外,zset 可以?來存粉絲列表,value 值是粉絲的?戶 ID,score 是關注時間。我們可以對粉絲列表按關注時間進?排序。

    不太常見API有這些,文章上面已經給大家推薦查看API的網站了,用到的時候查一查哈
    ◆ zrevrank
    ◆ zrevrange
    ◆ zrevrangebyscore
    ◆ interstore
    ◆ zunionstore

    上面的API可以分成這三類

    三、Redis 客戶端操作

    帶大家過一遍Redis 的API之后,這部分非常非常簡單了。

    所有語言的操作,其實都是對Redis API的封裝,封裝前的東西你都知道了,封裝后的不是易如反掌?

    以Java為例吧,基于Java語言的客戶端比較熱的是Jedis

    在連接方面有兩種方式,一種是直連、一種是線程池(一般都要用到線程池)

    直連方式

    // 1.生成一個 Jedis對象,這個對象負責和指定Reds節點進行通信 Jedis jedis = new Jedis("localhost", 6379); // Sting set get 操作 jedis.set("Jedis", "hello jedis!"); jedis.get("Jedis"); // 對結果進行自增 jedis.incr("counter")

    構造方法最多有四個參數

    hash操作

    jedis hset("myhash",f1",v1); jedis hset("myhash",f2,v2); // 輸出結果:{1=v1,f2=V2} jedis.hgetAll(myhash");

    是不是很熟悉,其他的類似。

    Jedis連接池
    直連的弊端很明顯:消耗資源。如果在不同方面,頻繁用到Redis,編寫程序也很麻煩。

    所以,連接池是非常重要的的。

    方案對比

    方案優點 缺點
    直連簡單方便;適用于少量長期連接的場景1.存在每次新建/關閉TCP開銷;2.資源無法控制,存在連接泄露的可能;3.Jedis對象線程不安全
    連接池Jedis預先生成,降低開銷使用連接池的形式保護和控制資源的使用相對于直連,使用相對麻煩尤其在資源的管理上需要很多參數來保證,一旦規劃不合理也會出現問題。
    // 初始化 Jedis連接池,通常來講 Jedis Pool是單例的。GenericObjectPoolConf poolConfig new GenericObjectPoolConfigO Jedis Pool jedis Pool new JedisPool(poolConfig, 127.0.0. 1",6379;

    簡單使用:

    Jedis jedis = null; try{//1.從連接池獲取 jedis對象jedis = jedisPool.getResource();//2.執行操作jedis set(hello","world");} catch(Exception e){eprintStackTrace();}finally {if (jedis != null)//如果使用 JedisPool,cose操作不是關閉連接,代表歸還連接池jedis closedjedis.close();} }

    說明

    唉,寫得太長了,CSDN編輯器不允許我在一篇文章上繼續發揮了。

    這是下一篇文章。

    傳送門:【大廠面試】面試官看了贊不絕口的Redis筆記(二)

    目錄:

    這五個專題串過之后,你會對Redis單體,有著非常好的理解了,后面再走就是看源碼了。相信你到這一步已經可以獨當一面了。

    我再往下面寫,就是Redis分布式領域相關的東西了,比如說Redis的主從復制、哨兵機制、 Redis cluster特性等。

    傳送門: 【大廠面試】面試官看了贊不絕口的Redis筆記(三)分布式篇

    目錄:

    最后還有一些拓展的內容需要補充。


    對了,兄dei,如果你覺得這篇文章可以的話,給俺點個贊再走,管不管?這樣可以讓更多的人看到這篇文章,對我來說也是一種激勵。

    如果你有什么問題的話,歡迎留言或者CSDN APP直接與我交流。

    總結

    以上是生活随笔為你收集整理的【大厂面试】面试官看了赞不绝口的Redis笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    日日碰狠狠丁香久燥 | 男女爱爱好爽视频免费看 | 国产偷国产偷精品高清尤物 | 成人无码视频免费播放 | 亚洲区欧美区综合区自拍区 | 曰本女人与公拘交酡免费视频 | 麻豆av传媒蜜桃天美传媒 | 精品无码一区二区三区爱欲 | 亚洲人成影院在线无码按摩店 | 亚洲狠狠色丁香婷婷综合 | 99久久人妻精品免费二区 | 国产精品无码一区二区三区不卡 | 无码纯肉视频在线观看 | 88国产精品欧美一区二区三区 | 亚洲成av人影院在线观看 | 国产av无码专区亚洲a∨毛片 | 久久视频在线观看精品 | 欧美国产日韩久久mv | 色欲av亚洲一区无码少妇 | 国产精品久久久一区二区三区 | 无码av中文字幕免费放 | 日韩精品久久久肉伦网站 | 亚洲成在人网站无码天堂 | 色爱情人网站 | 蜜臀av无码人妻精品 | 国产综合色产在线精品 | 无码福利日韩神码福利片 | 国产又粗又硬又大爽黄老大爷视 | 三上悠亚人妻中文字幕在线 | 四虎永久在线精品免费网址 | 亚洲s色大片在线观看 | 亚洲无人区一区二区三区 | 午夜嘿嘿嘿影院 | 亚洲人成无码网www | 国内精品久久毛片一区二区 | 野狼第一精品社区 | 亚洲一区二区三区含羞草 | 国产后入清纯学生妹 | 国产欧美亚洲精品a | 亚洲色欲久久久综合网东京热 | 国产精品无码一区二区桃花视频 | 国产va免费精品观看 | 亚洲男人av天堂午夜在 | 国产无遮挡吃胸膜奶免费看 | 国产97色在线 | 免 | 亚洲小说春色综合另类 | 无码成人精品区在线观看 | 国产97色在线 | 免 | 99久久久无码国产aaa精品 | 色一情一乱一伦一视频免费看 | 男女性色大片免费网站 | 日本熟妇人妻xxxxx人hd | 18禁止看的免费污网站 | 日本精品久久久久中文字幕 | 久久www免费人成人片 | 久久人人爽人人爽人人片av高清 | 永久黄网站色视频免费直播 | 成人片黄网站色大片免费观看 | 色狠狠av一区二区三区 | 久久亚洲中文字幕无码 | 熟女俱乐部五十路六十路av | 日本xxxx色视频在线观看免费 | 国产无套内射久久久国产 | 窝窝午夜理论片影院 | 嫩b人妻精品一区二区三区 | 久久综合九色综合欧美狠狠 | 99在线 | 亚洲 | 亚洲成色www久久网站 | 国产精品沙发午睡系列 | 色婷婷香蕉在线一区二区 | 男人的天堂2018无码 | 未满小14洗澡无码视频网站 | 亚洲国产高清在线观看视频 | 乌克兰少妇性做爰 | 一个人看的www免费视频在线观看 | 一本色道久久综合亚洲精品不卡 | 久久97精品久久久久久久不卡 | 熟妇激情内射com | 波多野结衣高清一区二区三区 | 蜜桃视频插满18在线观看 | 亚洲高清偷拍一区二区三区 | 无码人妻少妇伦在线电影 | 亚洲国产精品一区二区美利坚 | 亚洲国产一区二区三区在线观看 | 国产精品美女久久久久av爽李琼 | 午夜精品一区二区三区的区别 | 国产三级久久久精品麻豆三级 | 国产精品va在线观看无码 | 成年女人永久免费看片 | 日本精品人妻无码77777 天堂一区人妻无码 | 97久久精品无码一区二区 | 国产熟妇另类久久久久 | 曰韩少妇内射免费播放 | 人妻插b视频一区二区三区 | 久久人妻内射无码一区三区 | 中文久久乱码一区二区 | 宝宝好涨水快流出来免费视频 | 亚洲欧美日韩成人高清在线一区 | 波多野结衣av在线观看 | 丰满妇女强制高潮18xxxx | 内射后入在线观看一区 | 日韩视频 中文字幕 视频一区 | 5858s亚洲色大成网站www | 国产xxx69麻豆国语对白 | 国产精品丝袜黑色高跟鞋 | 美女毛片一区二区三区四区 | 丝袜 中出 制服 人妻 美腿 | 国产精品久久久久7777 | 扒开双腿吃奶呻吟做受视频 | 国产人成高清在线视频99最全资源 | 六月丁香婷婷色狠狠久久 | 激情综合激情五月俺也去 | 国产肉丝袜在线观看 | 秋霞特色aa大片 | 国产一区二区三区日韩精品 | 欧美一区二区三区视频在线观看 | 帮老师解开蕾丝奶罩吸乳网站 | 国产精品久久久久9999小说 | 午夜性刺激在线视频免费 | 中文字幕乱码中文乱码51精品 | 天天躁夜夜躁狠狠是什么心态 | 熟妇人妻无码xxx视频 | 青青青爽视频在线观看 | 国产精品99爱免费视频 | 精品少妇爆乳无码av无码专区 | 久久久中文久久久无码 | 激情内射日本一区二区三区 | 亚洲精品中文字幕久久久久 | 玩弄少妇高潮ⅹxxxyw | 欧美丰满熟妇xxxx性ppx人交 | 最近的中文字幕在线看视频 | 亚洲色偷偷男人的天堂 | 国产成人综合在线女婷五月99播放 | 性史性农村dvd毛片 | 国产精品理论片在线观看 | 成人无码视频在线观看网站 | 久久这里只有精品视频9 | 精品无码国产一区二区三区av | 成人无码影片精品久久久 | 国产精品二区一区二区aⅴ污介绍 | 亚洲爆乳精品无码一区二区三区 | 久久久中文久久久无码 | 午夜精品久久久久久久 | 国产精品久久久久久亚洲影视内衣 | 麻花豆传媒剧国产免费mv在线 | v一区无码内射国产 | 亚洲娇小与黑人巨大交 | 中文精品久久久久人妻不卡 | 啦啦啦www在线观看免费视频 | 妺妺窝人体色www婷婷 | 妺妺窝人体色www在线小说 | 思思久久99热只有频精品66 | 亚洲 欧美 激情 小说 另类 | 无码人妻精品一区二区三区不卡 | 精品国精品国产自在久国产87 | 亚洲男女内射在线播放 | 国产午夜精品一区二区三区嫩草 | 又大又黄又粗又爽的免费视频 | 国产精品久久久 | 日日碰狠狠丁香久燥 | 夜夜高潮次次欢爽av女 | 中文字幕av日韩精品一区二区 | 东京热无码av男人的天堂 | 亚洲第一无码av无码专区 | 一二三四社区在线中文视频 | 成熟女人特级毛片www免费 | 成人性做爰aaa片免费看 | 日本饥渴人妻欲求不满 | 一本色道久久综合狠狠躁 | 人人妻人人澡人人爽欧美精品 | 婷婷色婷婷开心五月四房播播 | 国产亚av手机在线观看 | 一本大道伊人av久久综合 | 国产成人无码专区 | 76少妇精品导航 | 国产精品亚洲lv粉色 | 51国偷自产一区二区三区 | 久久久久人妻一区精品色欧美 | 国产成人精品无码播放 | 欧洲欧美人成视频在线 | 中文字幕人妻无码一区二区三区 | 国产三级精品三级男人的天堂 | 中文字幕无线码免费人妻 | 久久伊人色av天堂九九小黄鸭 | 国产偷抇久久精品a片69 | 久久久久av无码免费网 | 丁香啪啪综合成人亚洲 | a片在线免费观看 | 黑人巨大精品欧美一区二区 | 精品久久久久久亚洲精品 | 大胆欧美熟妇xx | 中文字幕 亚洲精品 第1页 | 欧美日韩在线亚洲综合国产人 | 曰韩无码二三区中文字幕 | 无码av免费一区二区三区试看 | 中文字幕日韩精品一区二区三区 | 国产精品理论片在线观看 | 国产精品无码成人午夜电影 | 真人与拘做受免费视频一 | 毛片内射-百度 | 国产免费久久精品国产传媒 | 少妇高潮喷潮久久久影院 | 久久人人爽人人人人片 | 国产高清av在线播放 | 狠狠躁日日躁夜夜躁2020 | 天天躁日日躁狠狠躁免费麻豆 | 国产极品视觉盛宴 | 一本久道久久综合婷婷五月 | 国产猛烈高潮尖叫视频免费 | 伦伦影院午夜理论片 | 精品人妻中文字幕有码在线 | 久久久久免费精品国产 | 国产国语老龄妇女a片 | 无遮挡啪啪摇乳动态图 | 亚洲欧洲日本无在线码 | 18无码粉嫩小泬无套在线观看 | 在教室伦流澡到高潮hnp视频 | 欧美freesex黑人又粗又大 | 亚洲欧美国产精品专区久久 | 亚洲中文字幕无码中文字在线 | 婷婷色婷婷开心五月四房播播 | 国产真实乱对白精彩久久 | 亚洲码国产精品高潮在线 | 日日橹狠狠爱欧美视频 | 国产熟妇高潮叫床视频播放 | 亚洲精品一区三区三区在线观看 | 国产黄在线观看免费观看不卡 | 麻豆蜜桃av蜜臀av色欲av | 99久久久无码国产aaa精品 | 亚洲一区二区三区国产精华液 | 欧美老人巨大xxxx做受 | 国产热a欧美热a在线视频 | 色婷婷综合中文久久一本 | 中文字幕人妻无码一区二区三区 | 97色伦图片97综合影院 | 国产热a欧美热a在线视频 | 无码人妻精品一区二区三区不卡 | 无码福利日韩神码福利片 | 又色又爽又黄的美女裸体网站 | 国模大胆一区二区三区 | 国语自产偷拍精品视频偷 | 国产小呦泬泬99精品 | 久久久av男人的天堂 | 成人欧美一区二区三区黑人免费 | 水蜜桃av无码 | 无码国模国产在线观看 | 国产又爽又猛又粗的视频a片 | 少妇人妻av毛片在线看 | 国产又粗又硬又大爽黄老大爷视 | 狠狠综合久久久久综合网 | 1000部啪啪未满十八勿入下载 | 色综合久久久无码网中文 | av人摸人人人澡人人超碰下载 | 国産精品久久久久久久 | 蜜臀aⅴ国产精品久久久国产老师 | 色噜噜亚洲男人的天堂 | 人妻中文无码久热丝袜 | 日韩人妻无码中文字幕视频 | 国产在线精品一区二区高清不卡 | 久久熟妇人妻午夜寂寞影院 | 国产精品久久国产精品99 | 婷婷丁香六月激情综合啪 | 少妇愉情理伦片bd | 婷婷五月综合缴情在线视频 | 乱码午夜-极国产极内射 | 精品无码成人片一区二区98 | 无码人妻丰满熟妇区毛片18 | 亚洲国产精品成人久久蜜臀 | 荫蒂被男人添的好舒服爽免费视频 | 国模大胆一区二区三区 | 综合人妻久久一区二区精品 | 在线观看国产一区二区三区 | 国语自产偷拍精品视频偷 | 激情爆乳一区二区三区 | 亚洲自偷自偷在线制服 | 欧美日本精品一区二区三区 | 国产精品美女久久久网av | 亚洲精品国产a久久久久久 | 亚洲成av人片天堂网无码】 | 人妻有码中文字幕在线 | 中文无码伦av中文字幕 | 国产又爽又黄又刺激的视频 | 精品乱码久久久久久久 | 久久久久久a亚洲欧洲av冫 | 国内精品人妻无码久久久影院蜜桃 | 色综合久久久久综合一本到桃花网 | 99久久久无码国产精品免费 | 色五月五月丁香亚洲综合网 | 一二三四在线观看免费视频 | 国产精品人妻一区二区三区四 | 超碰97人人做人人爱少妇 | 国产av久久久久精东av | 精品久久久无码人妻字幂 | 亚洲精品综合一区二区三区在线 | av在线亚洲欧洲日产一区二区 | 亚洲中文字幕乱码av波多ji | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产精品第一国产精品 | 学生妹亚洲一区二区 | av无码不卡在线观看免费 | 无码人妻黑人中文字幕 | 成人一区二区免费视频 | 国产午夜无码精品免费看 | 又湿又紧又大又爽a视频国产 | 无码av岛国片在线播放 | 99久久99久久免费精品蜜桃 | 亚洲爆乳大丰满无码专区 | 亚洲日韩精品欧美一区二区 | 日韩精品a片一区二区三区妖精 | 亚洲中文字幕无码一久久区 | 亚洲欧美国产精品久久 | 亚洲精品久久久久avwww潮水 | 夜先锋av资源网站 | 欧美freesex黑人又粗又大 | 亚洲熟妇色xxxxx欧美老妇 | 欧美老妇与禽交 | 亚洲一区二区三区四区 | 丰满人妻被黑人猛烈进入 | 久久综合狠狠综合久久综合88 | 亚洲自偷精品视频自拍 | 影音先锋中文字幕无码 | 亚洲熟妇色xxxxx亚洲 | 国产无套粉嫩白浆在线 | 波多野结衣高清一区二区三区 | 免费中文字幕日韩欧美 | 激情亚洲一区国产精品 | 日日干夜夜干 | 精品 日韩 国产 欧美 视频 | 亚洲综合另类小说色区 | 国产乱人伦偷精品视频 | а天堂中文在线官网 | 日韩在线不卡免费视频一区 | 大肉大捧一进一出好爽视频 | 激情综合激情五月俺也去 | 久久久久se色偷偷亚洲精品av | 国产人妻久久精品二区三区老狼 | 亚洲一区二区三区含羞草 | 欧美精品一区二区精品久久 | 一个人免费观看的www视频 | 巨爆乳无码视频在线观看 | 欧美日韩综合一区二区三区 | 色综合久久88色综合天天 | 日产精品99久久久久久 | av在线亚洲欧洲日产一区二区 | 亚洲日韩av片在线观看 | 日本成熟视频免费视频 | 久久亚洲中文字幕精品一区 | 久久aⅴ免费观看 | 白嫩日本少妇做爰 | 成人无码精品一区二区三区 | 日韩亚洲欧美精品综合 | 国产在线精品一区二区三区直播 | 高清国产亚洲精品自在久久 | 欧美兽交xxxx×视频 | 少妇激情av一区二区 | 全球成人中文在线 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 玩弄中年熟妇正在播放 | 欧美xxxx黑人又粗又长 | 国产内射爽爽大片视频社区在线 | 日韩精品无码免费一区二区三区 | 欧美 日韩 人妻 高清 中文 | 一个人免费观看的www视频 | 天海翼激烈高潮到腰振不止 | 四虎国产精品免费久久 | 天天摸天天透天天添 | 成 人 网 站国产免费观看 | 欧美人与禽zoz0性伦交 | 亚洲中文字幕无码一久久区 | 亚洲成a人片在线观看无码3d | 中文字幕色婷婷在线视频 | 欧美日韩视频无码一区二区三 | 久久97精品久久久久久久不卡 | 鲁鲁鲁爽爽爽在线视频观看 | 中文字幕av无码一区二区三区电影 | 内射后入在线观看一区 | 人人爽人人澡人人高潮 | 自拍偷自拍亚洲精品被多人伦好爽 | 欧美乱妇无乱码大黄a片 | 久久天天躁夜夜躁狠狠 | 午夜成人1000部免费视频 | 在教室伦流澡到高潮hnp视频 | 正在播放东北夫妻内射 | 久久97精品久久久久久久不卡 | 久久99精品久久久久婷婷 | а√天堂www在线天堂小说 | 欧美日韩色另类综合 | 午夜男女很黄的视频 | 欧美35页视频在线观看 | 亚洲人成影院在线无码按摩店 | 乱人伦中文视频在线观看 | 亚洲最大成人网站 | 免费观看黄网站 | 久久国产精品精品国产色婷婷 | 性欧美牲交在线视频 | 久精品国产欧美亚洲色aⅴ大片 | 久精品国产欧美亚洲色aⅴ大片 | 免费国产成人高清在线观看网站 | 亚洲欧美国产精品专区久久 | 欧美日韩视频无码一区二区三 | 丰满少妇熟乱xxxxx视频 | 亚洲中文字幕久久无码 | 欧美兽交xxxx×视频 | 国产99久久精品一区二区 | 亚洲小说春色综合另类 | 荫蒂被男人添的好舒服爽免费视频 | 一本久道高清无码视频 | 亚洲一区二区三区无码久久 | 免费播放一区二区三区 | 精品久久久久香蕉网 | 蜜桃视频韩日免费播放 | 国内精品一区二区三区不卡 | 久久综合久久自在自线精品自 | 亚洲国产一区二区三区在线观看 | 东北女人啪啪对白 | 真人与拘做受免费视频 | 中文字幕无码av激情不卡 | 日日橹狠狠爱欧美视频 | 99精品久久毛片a片 | 麻豆国产人妻欲求不满谁演的 | 对白脏话肉麻粗话av | 亚洲精品午夜无码电影网 | 国产精品久久久久影院嫩草 | 国产精品久久久久久亚洲影视内衣 | 日日碰狠狠丁香久燥 | 亚洲国产一区二区三区在线观看 | 无码国产乱人伦偷精品视频 | 国产精品va在线观看无码 | 草草网站影院白丝内射 | 国产精品久久久 | 国产精品igao视频网 | 精品国产麻豆免费人成网站 | 亚洲色www成人永久网址 | 国内精品九九久久久精品 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲欧美日韩成人高清在线一区 | 日本护士毛茸茸高潮 | 国内少妇偷人精品视频 | 国内精品一区二区三区不卡 | 激情五月综合色婷婷一区二区 | 天天拍夜夜添久久精品大 | 日韩av无码一区二区三区 | 人妻与老人中文字幕 | 强开小婷嫩苞又嫩又紧视频 | 亚洲一区二区三区在线观看网站 | 青青草原综合久久大伊人精品 | 国产亚洲精品久久久ai换 | 强辱丰满人妻hd中文字幕 | 18禁黄网站男男禁片免费观看 | 国内综合精品午夜久久资源 | 蜜臀aⅴ国产精品久久久国产老师 | 人妻aⅴ无码一区二区三区 | 强开小婷嫩苞又嫩又紧视频 | 国产成人精品视频ⅴa片软件竹菊 | 国产午夜无码视频在线观看 | 网友自拍区视频精品 | 自拍偷自拍亚洲精品被多人伦好爽 | 香港三级日本三级妇三级 | 亚洲国产成人av在线观看 | 亚洲无人区午夜福利码高清完整版 | 亚洲熟妇自偷自拍另类 | 日韩人妻无码一区二区三区久久99 | 久久久久久av无码免费看大片 | 欧洲精品码一区二区三区免费看 | 奇米影视7777久久精品人人爽 | 色综合久久久久综合一本到桃花网 | 中文字幕无码av波多野吉衣 | 亚洲精品中文字幕久久久久 | 亚洲色在线无码国产精品不卡 | 99精品视频在线观看免费 | 国产激情无码一区二区 | 青草青草久热国产精品 | a国产一区二区免费入口 | 亚洲综合色区中文字幕 | 成人精品一区二区三区中文字幕 | 免费无码的av片在线观看 | 丰满妇女强制高潮18xxxx | 久久精品国产一区二区三区 | 思思久久99热只有频精品66 | 日韩亚洲欧美中文高清在线 | 无码任你躁久久久久久久 | 丰满少妇人妻久久久久久 | 天天躁日日躁狠狠躁免费麻豆 | 亚洲综合久久一区二区 | 少妇愉情理伦片bd | 国产熟女一区二区三区四区五区 | 亚洲va欧美va天堂v国产综合 | 纯爱无遮挡h肉动漫在线播放 | 在线а√天堂中文官网 | 午夜熟女插插xx免费视频 | 国产农村乱对白刺激视频 | 在线精品亚洲一区二区 | 国产精品无码一区二区三区不卡 | 亚洲午夜福利在线观看 | 色欲久久久天天天综合网精品 | 国产成人久久精品流白浆 | 人人妻人人澡人人爽欧美一区九九 | 色诱久久久久综合网ywww | 久久久久99精品国产片 | 精品水蜜桃久久久久久久 | 久久人人爽人人爽人人片av高清 | 日本免费一区二区三区最新 | 人人妻人人澡人人爽欧美一区九九 | 99在线 | 亚洲 | 无遮挡啪啪摇乳动态图 | 久久这里只有精品视频9 | 理论片87福利理论电影 | 久久久久久国产精品无码下载 | 欧美精品免费观看二区 | 久久久久99精品国产片 | 综合激情五月综合激情五月激情1 | 麻豆国产97在线 | 欧洲 | 亚洲欧美色中文字幕在线 | 久久国产精品偷任你爽任你 | 婷婷丁香五月天综合东京热 | 性色av无码免费一区二区三区 | 色五月五月丁香亚洲综合网 | 国产亚洲tv在线观看 | 97精品人妻一区二区三区香蕉 | 成人免费无码大片a毛片 | 成人欧美一区二区三区 | yw尤物av无码国产在线观看 | 乱码av麻豆丝袜熟女系列 | 牲欲强的熟妇农村老妇女视频 | 97久久精品无码一区二区 | 亚洲成熟女人毛毛耸耸多 | 蜜桃视频插满18在线观看 | 久久久久国色av免费观看性色 | yw尤物av无码国产在线观看 | 国产在线无码精品电影网 | 牲欲强的熟妇农村老妇女视频 | 日韩精品无码一区二区中文字幕 | 亚洲国产精品一区二区第一页 | 日日碰狠狠丁香久燥 | 激情五月综合色婷婷一区二区 | 麻豆国产人妻欲求不满谁演的 | 日日躁夜夜躁狠狠躁 | 久激情内射婷内射蜜桃人妖 | av无码不卡在线观看免费 | 无码人妻丰满熟妇区毛片18 | 乌克兰少妇xxxx做受 | 国产精品丝袜黑色高跟鞋 | 人人超人人超碰超国产 | 免费无码一区二区三区蜜桃大 | 国产欧美熟妇另类久久久 | 国产欧美精品一区二区三区 | 人妻体内射精一区二区三四 | 日韩欧美中文字幕公布 | 国产精品久免费的黄网站 | 色狠狠av一区二区三区 | 99精品无人区乱码1区2区3区 | 国产综合在线观看 | 性欧美牲交xxxxx视频 | 国产成人精品三级麻豆 | www一区二区www免费 | 久久精品人妻少妇一区二区三区 | 无码乱肉视频免费大全合集 | 国产成人无码a区在线观看视频app | 色爱情人网站 | 性欧美videos高清精品 | 色噜噜亚洲男人的天堂 | √8天堂资源地址中文在线 | 中国女人内谢69xxxxxa片 | 国产激情无码一区二区app | 伦伦影院午夜理论片 | 欧美zoozzooz性欧美 | 久久久精品成人免费观看 | 中文字幕亚洲情99在线 | 国产成人精品久久亚洲高清不卡 | a在线观看免费网站大全 | 日日碰狠狠躁久久躁蜜桃 | 牲欲强的熟妇农村老妇女 | 亚洲午夜福利在线观看 | 欧美三级a做爰在线观看 | 天堂无码人妻精品一区二区三区 | 亚洲s码欧洲m码国产av | 国产小呦泬泬99精品 | 国产人妖乱国产精品人妖 | 国产av久久久久精东av | 亚洲中文字幕无码中文字在线 | 亚洲中文字幕乱码av波多ji | 精品人妻人人做人人爽 | 亚洲一区二区三区香蕉 | 欧美高清在线精品一区 | 国产成人av免费观看 | 狠狠色丁香久久婷婷综合五月 | 日韩人妻少妇一区二区三区 | 成人免费视频视频在线观看 免费 | 成人av无码一区二区三区 | а√资源新版在线天堂 | 成 人 网 站国产免费观看 | 亚洲综合无码久久精品综合 | 国产午夜无码精品免费看 | 色妞www精品免费视频 | 久久精品人妻少妇一区二区三区 | 大乳丰满人妻中文字幕日本 | 亚洲精品无码人妻无码 | 在教室伦流澡到高潮hnp视频 | 国产三级久久久精品麻豆三级 | 精品无码成人片一区二区98 | 大地资源中文第3页 | 亚拍精品一区二区三区探花 | 永久免费精品精品永久-夜色 | 99久久亚洲精品无码毛片 | 亚洲日韩av一区二区三区四区 | 激情爆乳一区二区三区 | 性做久久久久久久免费看 | 色综合天天综合狠狠爱 | 国産精品久久久久久久 | 无遮挡国产高潮视频免费观看 | 国产精品无码一区二区三区不卡 | 欧洲熟妇精品视频 | 女人被男人躁得好爽免费视频 | 天天摸天天碰天天添 | 亚洲区欧美区综合区自拍区 | 午夜福利不卡在线视频 | www国产亚洲精品久久久日本 | 亚洲小说图区综合在线 | 亚洲综合在线一区二区三区 | 无码国产色欲xxxxx视频 | 六十路熟妇乱子伦 | 少妇被粗大的猛进出69影院 | 国产精品办公室沙发 | 亚洲一区二区三区在线观看网站 | 露脸叫床粗话东北少妇 | 无码av岛国片在线播放 | 波多野结衣高清一区二区三区 | 激情五月综合色婷婷一区二区 | 一二三四在线观看免费视频 | 亚洲中文字幕av在天堂 | 国产乱码精品一品二品 | 成人aaa片一区国产精品 | 亚洲码国产精品高潮在线 | 国产欧美精品一区二区三区 | 伊在人天堂亚洲香蕉精品区 | 精品久久久无码中文字幕 | 国内精品久久久久久中文字幕 | 波多野42部无码喷潮在线 | 无遮挡啪啪摇乳动态图 | aa片在线观看视频在线播放 | 精品国产一区av天美传媒 | 中国女人内谢69xxxxxa片 | 国产精品美女久久久久av爽李琼 | 水蜜桃亚洲一二三四在线 | 少女韩国电视剧在线观看完整 | 自拍偷自拍亚洲精品10p | 日韩成人一区二区三区在线观看 | aa片在线观看视频在线播放 | 丰满人妻一区二区三区免费视频 | 久久久亚洲欧洲日产国码αv | 国产精品办公室沙发 | 欧美日本精品一区二区三区 | 亚洲国产精品久久久久久 | 少妇被粗大的猛进出69影院 | 中文字幕无码乱人伦 | 国产色在线 | 国产 | 国产欧美亚洲精品a | 日本免费一区二区三区最新 | 亚洲日韩av片在线观看 | 欧美zoozzooz性欧美 | 日日麻批免费40分钟无码 | 久久久精品人妻久久影视 | aⅴ亚洲 日韩 色 图网站 播放 | 亚洲日本一区二区三区在线 | 国产电影无码午夜在线播放 | 在线播放亚洲第一字幕 | 久久aⅴ免费观看 | 国产成人无码专区 | 蜜臀aⅴ国产精品久久久国产老师 | 国产精品99爱免费视频 | 熟妇人妻无乱码中文字幕 | 免费看少妇作爱视频 | 国产精品久久久久9999小说 | 又大又硬又爽免费视频 | 18精品久久久无码午夜福利 | 国产美女极度色诱视频www | 国产又粗又硬又大爽黄老大爷视 | 欧美阿v高清资源不卡在线播放 | 日本在线高清不卡免费播放 | 国产农村妇女高潮大叫 | 在线观看欧美一区二区三区 | 免费国产成人高清在线观看网站 | 性啪啪chinese东北女人 | 精品少妇爆乳无码av无码专区 | 久久精品中文字幕大胸 | 我要看www免费看插插视频 | 日欧一片内射va在线影院 | 人妻体内射精一区二区三四 | 少妇久久久久久人妻无码 | 亚洲a无码综合a国产av中文 | 麻豆精品国产精华精华液好用吗 | 亚洲日本在线电影 | 欧洲熟妇精品视频 | 荡女精品导航 | 久久亚洲中文字幕无码 | 欧美激情一区二区三区成人 | 亚洲 a v无 码免 费 成 人 a v | 午夜理论片yy44880影院 | 久久精品人人做人人综合 | 荫蒂添的好舒服视频囗交 | 日本丰满护士爆乳xxxx | 日本精品人妻无码免费大全 | 丰满人妻精品国产99aⅴ | 日韩av无码中文无码电影 | 中文字幕人妻丝袜二区 | 国产精品99爱免费视频 | 国产精品手机免费 | 国产日产欧产精品精品app | 日本一本二本三区免费 | 少妇性荡欲午夜性开放视频剧场 | 亚洲一区二区三区无码久久 | 精品无人国产偷自产在线 | 欧美人与禽zoz0性伦交 | 综合激情五月综合激情五月激情1 | 欧美老人巨大xxxx做受 | 麻花豆传媒剧国产免费mv在线 | 久久久久久av无码免费看大片 | 国产在线精品一区二区高清不卡 | 精品乱子伦一区二区三区 | 激情国产av做激情国产爱 | 日韩精品一区二区av在线 | 成人一区二区免费视频 | 国产精品久久久久久亚洲影视内衣 | 国产人妻人伦精品 | 久久国产精品偷任你爽任你 | 一本久道高清无码视频 | aⅴ在线视频男人的天堂 | 亚洲欧洲无卡二区视頻 | 国产精品免费大片 | 东北女人啪啪对白 | 久久国内精品自在自线 | 欧美 亚洲 国产 另类 | 97精品人妻一区二区三区香蕉 | 成人欧美一区二区三区黑人免费 | 亚洲色偷偷男人的天堂 | 青春草在线视频免费观看 | 欧美成人午夜精品久久久 | 国产免费观看黄av片 | 久久97精品久久久久久久不卡 | 国产做国产爱免费视频 | 乱人伦人妻中文字幕无码久久网 | 国产乱码精品一品二品 | 国产精品手机免费 | 亚洲国产欧美在线成人 | 88国产精品欧美一区二区三区 | 国产精品自产拍在线观看 | 国产精品无码永久免费888 | 中国大陆精品视频xxxx | 亚洲 激情 小说 另类 欧美 | 久久精品国产精品国产精品污 | 成人免费视频视频在线观看 免费 | 中文字幕乱妇无码av在线 | 日本饥渴人妻欲求不满 | 疯狂三人交性欧美 | 夜夜影院未满十八勿进 | 国产成人精品必看 | 国产精品毛片一区二区 | 国产精品久久久久久久9999 | 亚洲 激情 小说 另类 欧美 | 成人女人看片免费视频放人 | 午夜熟女插插xx免费视频 | 理论片87福利理论电影 | 无码一区二区三区在线 | 精品无码国产一区二区三区av | 精品无码国产一区二区三区av | 国产成人精品无码播放 | 天下第一社区视频www日本 | 日本丰满护士爆乳xxxx | 亚洲色欲色欲欲www在线 | 一本久久a久久精品亚洲 | 国产亚洲精品久久久闺蜜 | 国产精华av午夜在线观看 | 最近的中文字幕在线看视频 | 婷婷五月综合激情中文字幕 | 在教室伦流澡到高潮hnp视频 | 女人被男人爽到呻吟的视频 | 亚洲成色在线综合网站 | 中文字幕无码乱人伦 | 人人妻人人澡人人爽欧美精品 | 亚洲午夜福利在线观看 | 波多野结衣aⅴ在线 | 无码人妻精品一区二区三区不卡 | 欧美丰满少妇xxxx性 | 性开放的女人aaa片 | 久久精品女人天堂av免费观看 | 日本熟妇乱子伦xxxx | 国产成人无码专区 | 中文精品无码中文字幕无码专区 | 男女下面进入的视频免费午夜 | 亚洲综合在线一区二区三区 | 国产精品.xx视频.xxtv | 午夜免费福利小电影 | 国产网红无码精品视频 | 国产亚av手机在线观看 | 自拍偷自拍亚洲精品10p | 色爱情人网站 | 99久久精品无码一区二区毛片 | aa片在线观看视频在线播放 | 未满成年国产在线观看 | 男女爱爱好爽视频免费看 | 宝宝好涨水快流出来免费视频 | 国产乱人伦偷精品视频 | 国产午夜亚洲精品不卡 | 性色欲网站人妻丰满中文久久不卡 | 午夜福利不卡在线视频 | 人人妻人人澡人人爽精品欧美 | 国产片av国语在线观看 | 国产99久久精品一区二区 | 老司机亚洲精品影院无码 | 国产精品亚洲lv粉色 | 嫩b人妻精品一区二区三区 | 一区二区三区高清视频一 | 97资源共享在线视频 | 噜噜噜亚洲色成人网站 | 国产人妻精品午夜福利免费 | 亚洲精品久久久久avwww潮水 | 亚无码乱人伦一区二区 | 九九久久精品国产免费看小说 | 中文字幕乱妇无码av在线 | 激情综合激情五月俺也去 | 国产卡一卡二卡三 | 国产电影无码午夜在线播放 | 亚洲精品国产精品乱码视色 | 国产精品资源一区二区 | 在线 国产 欧美 亚洲 天堂 | 无码福利日韩神码福利片 | 99久久精品国产一区二区蜜芽 | 青春草在线视频免费观看 | 欧美黑人巨大xxxxx | 无码成人精品区在线观看 | 少妇无套内谢久久久久 | 国产九九九九九九九a片 | 精品人妻人人做人人爽 | 亚洲国产精华液网站w | 无码国产激情在线观看 | 久久精品人人做人人综合试看 | 九九在线中文字幕无码 | 亚洲中文字幕va福利 | 六十路熟妇乱子伦 | 色综合久久久无码中文字幕 | 国产av久久久久精东av | 奇米影视7777久久精品 | 日本一区二区三区免费高清 | 亚洲综合伊人久久大杳蕉 | 欧美精品无码一区二区三区 | 国产九九九九九九九a片 | 国产人妖乱国产精品人妖 | 亚洲综合精品香蕉久久网 | 300部国产真实乱 | 成人一在线视频日韩国产 | av人摸人人人澡人人超碰下载 | 亚洲男人av香蕉爽爽爽爽 | 黑人巨大精品欧美黑寡妇 | 丰满人妻一区二区三区免费视频 | 日本一卡二卡不卡视频查询 | 色综合久久久无码网中文 | 亚洲 欧美 激情 小说 另类 | 亲嘴扒胸摸屁股激烈网站 | 久久综合九色综合欧美狠狠 | 樱花草在线播放免费中文 | 男女猛烈xx00免费视频试看 | 国产69精品久久久久app下载 | 亚洲一区二区三区国产精华液 | 欧美野外疯狂做受xxxx高潮 | 精品久久久无码中文字幕 | 色一情一乱一伦一视频免费看 | 宝宝好涨水快流出来免费视频 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲国产综合无码一区 | 久久久精品456亚洲影院 | 色狠狠av一区二区三区 | 午夜精品久久久内射近拍高清 | 亚洲欧美国产精品久久 | 激情爆乳一区二区三区 | 亚洲熟妇色xxxxx亚洲 | 综合人妻久久一区二区精品 | 久久天天躁夜夜躁狠狠 | 国产人妻人伦精品 | 国产乱码精品一品二品 | 丰满妇女强制高潮18xxxx | 黑人玩弄人妻中文在线 | 亚洲中文字幕va福利 | 领导边摸边吃奶边做爽在线观看 | 东京无码熟妇人妻av在线网址 | 国产在线aaa片一区二区99 | 中文字幕精品av一区二区五区 | 亚洲成av人片在线观看无码不卡 | 免费乱码人妻系列无码专区 | 色诱久久久久综合网ywww | 亚洲一区av无码专区在线观看 | 最近的中文字幕在线看视频 | 偷窥日本少妇撒尿chinese | 色综合久久久无码网中文 | 国产午夜视频在线观看 | 亚洲乱码中文字幕在线 | 国产综合色产在线精品 | 国产成人无码av一区二区 | 色综合久久中文娱乐网 | 亚洲男人av香蕉爽爽爽爽 | 少妇被粗大的猛进出69影院 | 久久精品一区二区三区四区 | 国产精品国产三级国产专播 | а√资源新版在线天堂 | 国产sm调教视频在线观看 | 少妇性l交大片欧洲热妇乱xxx | 毛片内射-百度 | 国产精品国产自线拍免费软件 | 国产精品久久久久影院嫩草 | √天堂资源地址中文在线 | 日韩精品成人一区二区三区 | 精品乱子伦一区二区三区 | 少女韩国电视剧在线观看完整 | 亚洲 a v无 码免 费 成 人 a v | 亚洲中文字幕成人无码 | 少妇厨房愉情理9仑片视频 | 国产无遮挡又黄又爽又色 | 免费观看又污又黄的网站 | 18禁黄网站男男禁片免费观看 | 成人试看120秒体验区 | 久久亚洲中文字幕精品一区 | 国产人妻精品午夜福利免费 | 免费观看又污又黄的网站 | 国产人成高清在线视频99最全资源 | 欧美日韩一区二区综合 | 又湿又紧又大又爽a视频国产 | 99精品视频在线观看免费 | 无码一区二区三区在线观看 | 久久婷婷五月综合色国产香蕉 | 国产精品人人爽人人做我的可爱 | 东京热无码av男人的天堂 | 国精品人妻无码一区二区三区蜜柚 | 免费无码的av片在线观看 | аⅴ资源天堂资源库在线 | 精品国产麻豆免费人成网站 | 国产亚洲精品久久久久久国模美 | 欧美人与动性行为视频 | 强伦人妻一区二区三区视频18 | 四虎国产精品免费久久 | 国产亚洲日韩欧美另类第八页 | 精品国偷自产在线 | 牛和人交xxxx欧美 | 国产卡一卡二卡三 | 久久亚洲精品中文字幕无男同 | 乱人伦人妻中文字幕无码 | 99精品无人区乱码1区2区3区 | 国产精品香蕉在线观看 | 国产乱人无码伦av在线a | 国产午夜亚洲精品不卡下载 | 亚洲人成网站色7799 | 久久aⅴ免费观看 | 欧美精品在线观看 | 精品成人av一区二区三区 | 又大又紧又粉嫩18p少妇 | 丰满少妇熟乱xxxxx视频 | 熟妇人妻中文av无码 | 一本久道高清无码视频 | 亚洲成a人片在线观看无码 | 丰满妇女强制高潮18xxxx | 无遮挡国产高潮视频免费观看 | 久久精品中文字幕一区 | 亚洲国产精品久久久天堂 | 无码人妻少妇伦在线电影 | 国产成人无码av在线影院 | 亚洲经典千人经典日产 | 亚洲欧洲日本无在线码 | 曰本女人与公拘交酡免费视频 | 一个人免费观看的www视频 | 小泽玛莉亚一区二区视频在线 | 初尝人妻少妇中文字幕 | 久久精品国产精品国产精品污 | 亚洲精品午夜国产va久久成人 | 在线播放亚洲第一字幕 | 精品国产福利一区二区 | 偷窥村妇洗澡毛毛多 | 捆绑白丝粉色jk震动捧喷白浆 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 亚洲精品无码人妻无码 | 亚洲 高清 成人 动漫 | 一本大道久久东京热无码av | 国产精品久久久 | 欧美 丝袜 自拍 制服 另类 | 色诱久久久久综合网ywww | 亚洲国产精品成人久久蜜臀 | 日韩欧美中文字幕在线三区 | 荡女精品导航 | 色五月五月丁香亚洲综合网 | 国产又爽又猛又粗的视频a片 | 久久久久se色偷偷亚洲精品av | 强奷人妻日本中文字幕 | 精品厕所偷拍各类美女tp嘘嘘 | 领导边摸边吃奶边做爽在线观看 | 2020最新国产自产精品 | 国产激情艳情在线看视频 | 国产精品久久久一区二区三区 | 亚洲天堂2017无码 | 乱码av麻豆丝袜熟女系列 | 天干天干啦夜天干天2017 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲成a人片在线观看日本 | 97夜夜澡人人双人人人喊 | 性色欲情网站iwww九文堂 | 国产亚洲精品久久久闺蜜 | 国产成人精品三级麻豆 | 老头边吃奶边弄进去呻吟 | 嫩b人妻精品一区二区三区 | 3d动漫精品啪啪一区二区中 | 国产9 9在线 | 中文 | 亚洲日本va午夜在线电影 | 亚洲综合另类小说色区 | 十八禁视频网站在线观看 | 在线观看欧美一区二区三区 | 久久99精品久久久久久动态图 | 久久久久se色偷偷亚洲精品av | 激情爆乳一区二区三区 | 强伦人妻一区二区三区视频18 | 国产明星裸体无码xxxx视频 | 中国女人内谢69xxxx | 精品久久久久香蕉网 | 久久人人爽人人人人片 | 2019午夜福利不卡片在线 | 人人妻人人澡人人爽精品欧美 | 国产精华av午夜在线观看 | 国产成人久久精品流白浆 | 黑人大群体交免费视频 | 亚洲国产精品毛片av不卡在线 | 国产精品va在线播放 | 又紧又大又爽精品一区二区 | 沈阳熟女露脸对白视频 | 中文精品久久久久人妻不卡 | 久久午夜无码鲁丝片 | 精品 日韩 国产 欧美 视频 | 亚洲国产av精品一区二区蜜芽 | 中文字幕无码热在线视频 | 国产片av国语在线观看 | 亚洲中文字幕在线无码一区二区 | 蜜臀av无码人妻精品 | 久久综合久久自在自线精品自 | 久久精品丝袜高跟鞋 | 少妇人妻av毛片在线看 | 人人妻人人澡人人爽人人精品 | 小鲜肉自慰网站xnxx | 亚洲 欧美 激情 小说 另类 | 小泽玛莉亚一区二区视频在线 | 国产九九九九九九九a片 | 国产成人无码一二三区视频 | 精品国产一区二区三区四区 | 日日橹狠狠爱欧美视频 | 国产精品香蕉在线观看 | 暴力强奷在线播放无码 | 久久人人爽人人爽人人片ⅴ | 麻豆国产人妻欲求不满谁演的 | 久久精品国产一区二区三区肥胖 | 欧美性生交xxxxx久久久 | 精品无码成人片一区二区98 | 国产午夜手机精彩视频 | 国产精品18久久久久久麻辣 | 久久精品女人天堂av免费观看 | 夜精品a片一区二区三区无码白浆 | 日韩精品无码一区二区中文字幕 | 沈阳熟女露脸对白视频 | 人妻中文无码久热丝袜 | 亚洲自偷自拍另类第1页 | 国语自产偷拍精品视频偷 | 国产女主播喷水视频在线观看 | a在线观看免费网站大全 | 亚洲最大成人网站 | 国内少妇偷人精品视频免费 | 丝袜人妻一区二区三区 | 精品国偷自产在线视频 | 男人扒开女人内裤强吻桶进去 | 一本色道久久综合亚洲精品不卡 | 国产人妻精品一区二区三区不卡 | 国产在线精品一区二区高清不卡 | 日本一区二区三区免费播放 | 国产人妻久久精品二区三区老狼 | 无码福利日韩神码福利片 | 亚洲人交乣女bbw | 亚洲国产一区二区三区在线观看 | 亚洲伊人久久精品影院 | 欧美高清在线精品一区 | 四虎国产精品一区二区 | 精品国产精品久久一区免费式 | 国产人妻精品一区二区三区不卡 | 又粗又大又硬毛片免费看 | 青草视频在线播放 | 青青青爽视频在线观看 | 一区二区传媒有限公司 | 无码人中文字幕 | 国产成人午夜福利在线播放 | 四虎国产精品免费久久 | 国产莉萝无码av在线播放 | 欧美大屁股xxxxhd黑色 | 性开放的女人aaa片 | 午夜福利试看120秒体验区 | 狂野欧美性猛交免费视频 | 久久久久久a亚洲欧洲av冫 | 四虎4hu永久免费 | 成人精品视频一区二区三区尤物 | av香港经典三级级 在线 | 无套内谢老熟女 | 亚洲欧洲日本综合aⅴ在线 | 国产精品免费大片 | 国产免费久久精品国产传媒 | 亚洲国产欧美日韩精品一区二区三区 | 国产xxx69麻豆国语对白 | 少妇人妻偷人精品无码视频 | 性欧美牲交在线视频 | 特大黑人娇小亚洲女 | 熟女少妇人妻中文字幕 | 久久精品人妻少妇一区二区三区 | 女人色极品影院 | 国产精品视频免费播放 | aⅴ亚洲 日韩 色 图网站 播放 | 黑人巨大精品欧美一区二区 | 无码播放一区二区三区 | 樱花草在线播放免费中文 | 青青青爽视频在线观看 | 免费看男女做好爽好硬视频 | 亚洲国产成人av在线观看 | 日本一区二区三区免费高清 | 国产人妻大战黑人第1集 | 性欧美牲交在线视频 | 日日鲁鲁鲁夜夜爽爽狠狠 | 免费国产黄网站在线观看 | 精品欧美一区二区三区久久久 | 国精产品一品二品国精品69xx | 成人片黄网站色大片免费观看 | 人妻少妇精品无码专区动漫 | 日韩精品a片一区二区三区妖精 | 日韩精品成人一区二区三区 | 欧美高清在线精品一区 | 国产午夜亚洲精品不卡 | 国产综合在线观看 | 欧美亚洲国产一区二区三区 | 一区二区三区高清视频一 | 亚洲国产一区二区三区在线观看 | 日本爽爽爽爽爽爽在线观看免 | 免费男性肉肉影院 | 亚洲乱码国产乱码精品精 | av人摸人人人澡人人超碰下载 | 精品水蜜桃久久久久久久 | 国产精品国产自线拍免费软件 | 国产亚洲精品久久久久久大师 | 亚洲一区二区三区 | 亚洲成av人在线观看网址 | 色诱久久久久综合网ywww | 日本一区二区三区免费高清 | 午夜精品久久久内射近拍高清 | 精品无码成人片一区二区98 | 久久国产自偷自偷免费一区调 | 日日橹狠狠爱欧美视频 | 亚洲精品综合一区二区三区在线 | 午夜福利不卡在线视频 | 国内精品人妻无码久久久影院 | 免费看少妇作爱视频 | 牲欲强的熟妇农村老妇女 | 1000部夫妻午夜免费 | 国产精品va在线观看无码 | 国产一区二区三区精品视频 | 亚洲无人区一区二区三区 | 乱码午夜-极国产极内射 | 国产农村乱对白刺激视频 | 狠狠色色综合网站 | 亚洲中文字幕久久无码 | 中文字幕无码免费久久9一区9 | 一个人看的视频www在线 | 少妇性荡欲午夜性开放视频剧场 | 牲欲强的熟妇农村老妇女 | 无码人妻少妇伦在线电影 | 国产精品久久久 | 中文字幕无码人妻少妇免费 | 国产综合色产在线精品 | 国产精品国产自线拍免费软件 | 人人超人人超碰超国产 | 成人一在线视频日韩国产 | 俄罗斯老熟妇色xxxx | 久久精品中文字幕一区 | 婷婷五月综合缴情在线视频 | 无码人妻久久一区二区三区不卡 | 免费乱码人妻系列无码专区 | 伊人久久大香线蕉午夜 | 乱人伦人妻中文字幕无码久久网 | 国产成人午夜福利在线播放 | 老熟女重囗味hdxx69 | 国产一区二区三区日韩精品 | 美女扒开屁股让男人桶 | 国产精品久久久久久亚洲影视内衣 | 日本熟妇乱子伦xxxx | 天堂亚洲2017在线观看 | 国产精品亚洲五月天高清 | 粉嫩少妇内射浓精videos | 亚洲精品国偷拍自产在线观看蜜桃 | 99久久久国产精品无码免费 | 人人澡人人妻人人爽人人蜜桃 | 国产精品久久久久影院嫩草 | 99re在线播放 | 帮老师解开蕾丝奶罩吸乳网站 | 2019nv天堂香蕉在线观看 | 97无码免费人妻超级碰碰夜夜 | 国产高清不卡无码视频 | 日韩欧美成人免费观看 | 欧美日韩色另类综合 | 国产高清不卡无码视频 | 一本加勒比波多野结衣 | 久久精品一区二区三区四区 | 国产人成高清在线视频99最全资源 | 综合网日日天干夜夜久久 | 亚洲a无码综合a国产av中文 | 波多野结衣av一区二区全免费观看 | 久久久精品人妻久久影视 | 红桃av一区二区三区在线无码av | 成人欧美一区二区三区黑人 | 青草青草久热国产精品 | 久久精品国产一区二区三区 | 亚洲中文字幕av在天堂 | 精品国产福利一区二区 | 日本丰满熟妇videos | 中文字幕日韩精品一区二区三区 | 未满小14洗澡无码视频网站 | 精品人妻人人做人人爽夜夜爽 | 四十如虎的丰满熟妇啪啪 | 曰本女人与公拘交酡免费视频 | 特大黑人娇小亚洲女 | 欧美一区二区三区 | 久久久精品欧美一区二区免费 | 99er热精品视频 | 午夜丰满少妇性开放视频 | 无码人中文字幕 | 国精产品一品二品国精品69xx | 欧美一区二区三区 | 国产乱码精品一品二品 | 国产精品亚洲一区二区三区喷水 | 日本一区二区三区免费高清 | 日本一卡2卡3卡四卡精品网站 | 人人爽人人澡人人高潮 | 内射白嫩少妇超碰 | 国产精品亚洲综合色区韩国 | 国产精品亚洲专区无码不卡 | 亚洲中文字幕成人无码 | 国产精品欧美成人 | 亚洲国产成人a精品不卡在线 | 丰满肥臀大屁股熟妇激情视频 | 国产午夜福利100集发布 | 久久99精品国产麻豆 | 极品嫩模高潮叫床 | 国产深夜福利视频在线 | 精品无人国产偷自产在线 | 午夜成人1000部免费视频 | 欧美性猛交内射兽交老熟妇 | 老子影院午夜精品无码 | 无码人妻丰满熟妇区毛片18 | 中国女人内谢69xxxx | 乌克兰少妇xxxx做受 | 国产精品内射视频免费 | 亚洲啪av永久无码精品放毛片 | 欧美老人巨大xxxx做受 | 亚洲aⅴ无码成人网站国产app | 日韩精品a片一区二区三区妖精 | 永久免费观看国产裸体美女 | 亚洲欧美日韩成人高清在线一区 | 中文字幕乱码人妻二区三区 | 九九在线中文字幕无码 | 亚洲色大成网站www | 久久精品一区二区三区四区 | 无码人妻出轨黑人中文字幕 | 又紧又大又爽精品一区二区 | 性欧美大战久久久久久久 | 亚洲一区av无码专区在线观看 | 国产精品人人爽人人做我的可爱 | 久久精品国产一区二区三区肥胖 | 欧美老妇交乱视频在线观看 | 草草网站影院白丝内射 | 成人欧美一区二区三区黑人免费 | 色婷婷综合中文久久一本 | 欧美 日韩 人妻 高清 中文 | 永久免费观看美女裸体的网站 | 亚洲成av人片在线观看无码不卡 | 真人与拘做受免费视频一 | 日本熟妇乱子伦xxxx | 99久久婷婷国产综合精品青草免费 | 亚洲精品久久久久avwww潮水 | 波多野结衣乳巨码无在线观看 | 色综合久久88色综合天天 | 97人妻精品一区二区三区 | 日本免费一区二区三区最新 | 99久久婷婷国产综合精品青草免费 | 精品人妻av区 | 久久精品国产一区二区三区 | 国产美女极度色诱视频www | 丰满少妇高潮惨叫视频 | 精品人人妻人人澡人人爽人人 | 日本精品人妻无码免费大全 | 国产凸凹视频一区二区 | 国产成人久久精品流白浆 | 精品aⅴ一区二区三区 | 久久久亚洲欧洲日产国码αv | 亚洲第一网站男人都懂 | 美女毛片一区二区三区四区 | 免费看男女做好爽好硬视频 | 精品国产一区二区三区四区 | 国产精品亚洲五月天高清 | 日日摸天天摸爽爽狠狠97 | 免费观看的无遮挡av | 亚洲小说春色综合另类 | 日韩精品无码免费一区二区三区 | 国产超碰人人爽人人做人人添 | 亚洲春色在线视频 | 国产高潮视频在线观看 | 色婷婷综合激情综在线播放 | 亚洲熟妇色xxxxx亚洲 | 国精产品一品二品国精品69xx | 毛片内射-百度 | 乌克兰少妇xxxx做受 | 国产午夜亚洲精品不卡 | 亚洲一区二区三区含羞草 | 国产精品a成v人在线播放 | 亚洲国产欧美在线成人 | 亚洲成a人一区二区三区 | 亚洲中文字幕无码中文字在线 | 亚洲啪av永久无码精品放毛片 | 国产乱人伦av在线无码 | 无人区乱码一区二区三区 | 美女黄网站人色视频免费国产 | 无遮挡国产高潮视频免费观看 | 在线观看国产一区二区三区 | 国产无遮挡又黄又爽又色 | 亚洲精品鲁一鲁一区二区三区 | 国内少妇偷人精品视频免费 | 久久精品女人天堂av免费观看 | 波多野结衣av一区二区全免费观看 | 免费观看的无遮挡av | 欧美丰满熟妇xxxx性ppx人交 | 18无码粉嫩小泬无套在线观看 | 无码中文字幕色专区 | 久久国内精品自在自线 | 荫蒂被男人添的好舒服爽免费视频 | 亚洲欧美综合区丁香五月小说 | 99久久精品午夜一区二区 | 精品人妻人人做人人爽夜夜爽 | 狠狠色噜噜狠狠狠7777奇米 | 熟女少妇人妻中文字幕 | 学生妹亚洲一区二区 | 少妇愉情理伦片bd | 色五月丁香五月综合五月 | 狠狠亚洲超碰狼人久久 | 蜜臀av在线播放 久久综合激激的五月天 | 暴力强奷在线播放无码 | 伊人久久婷婷五月综合97色 | 久久婷婷五月综合色国产香蕉 | 国产国产精品人在线视 | 国产欧美亚洲精品a | 国产色xx群视频射精 | 久9re热视频这里只有精品 | 亚洲经典千人经典日产 | 蜜臀av在线播放 久久综合激激的五月天 | 激情爆乳一区二区三区 | 亚洲综合精品香蕉久久网 | 国产va免费精品观看 | 免费观看又污又黄的网站 | 在线а√天堂中文官网 | av无码不卡在线观看免费 | 国产激情综合五月久久 | 丁香花在线影院观看在线播放 | 久久精品视频在线看15 | 免费无码午夜福利片69 | 欧美国产日韩亚洲中文 | av香港经典三级级 在线 | 国产乱码精品一品二品 | 国产又爽又黄又刺激的视频 | 国产成人无码午夜视频在线观看 | 131美女爱做视频 | 中文字幕乱码人妻二区三区 | yw尤物av无码国产在线观看 | 欧美zoozzooz性欧美 | 亚洲欧美中文字幕5发布 | 亚洲成a人片在线观看无码3d | 久久无码人妻影院 | 国产在线aaa片一区二区99 | 少妇人妻大乳在线视频 | 99在线 | 亚洲 | 在线播放免费人成毛片乱码 | 中文久久乱码一区二区 | 真人与拘做受免费视频 | 国产激情无码一区二区app | av人摸人人人澡人人超碰下载 | 久久精品人妻少妇一区二区三区 | 精品国产一区二区三区av 性色 | 男女性色大片免费网站 | 好男人社区资源 | 大肉大捧一进一出视频出来呀 | 日产国产精品亚洲系列 | 欧美35页视频在线观看 | aa片在线观看视频在线播放 | 少妇被黑人到高潮喷出白浆 | 色诱久久久久综合网ywww | 成人欧美一区二区三区黑人免费 | 国产九九九九九九九a片 | 久久久久久亚洲精品a片成人 | 久久熟妇人妻午夜寂寞影院 | 成人片黄网站色大片免费观看 | 老太婆性杂交欧美肥老太 | 亚洲无人区一区二区三区 | 又黄又爽又色的视频 | 亚洲中文字幕va福利 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲性无码av中文字幕 | 欧美丰满老熟妇xxxxx性 | 日本丰满护士爆乳xxxx | 欧美 丝袜 自拍 制服 另类 | 在线 国产 欧美 亚洲 天堂 | 青青草原综合久久大伊人精品 | 色婷婷av一区二区三区之红樱桃 | 亚洲高清偷拍一区二区三区 | 少妇无码吹潮 | 99久久精品日本一区二区免费 | 丰满岳乱妇在线观看中字无码 | 日本乱偷人妻中文字幕 | 波多野结衣aⅴ在线 | 内射白嫩少妇超碰 | 成人av无码一区二区三区 | 国产免费久久久久久无码 | 国产人妻精品一区二区三区 | 亚洲小说图区综合在线 | 中文字幕 人妻熟女 | 67194成是人免费无码 | 亚洲色欲久久久综合网东京热 | 亚洲va欧美va天堂v国产综合 | 久久精品人妻少妇一区二区三区 | 激情五月综合色婷婷一区二区 | 久久五月精品中文字幕 | 久久精品国产亚洲精品 | 在线а√天堂中文官网 | 永久黄网站色视频免费直播 | 少妇被黑人到高潮喷出白浆 | 蜜桃臀无码内射一区二区三区 | 亚洲国产精品一区二区美利坚 | 国产成人综合在线女婷五月99播放 | 欧美xxxx黑人又粗又长 | 国产精品二区一区二区aⅴ污介绍 | 国产午夜福利100集发布 | 在线观看免费人成视频 | 日本熟妇大屁股人妻 | 丁香啪啪综合成人亚洲 | 欧美35页视频在线观看 | 人妻少妇精品无码专区动漫 | 国产9 9在线 | 中文 | 日本丰满护士爆乳xxxx | 国产精品无码永久免费888 | 亚洲一区二区三区含羞草 | 美女扒开屁股让男人桶 | 欧美日韩久久久精品a片 | 亚洲大尺度无码无码专区 | 国产黑色丝袜在线播放 | 少女韩国电视剧在线观看完整 | 久久国产精品二国产精品 | 无码人妻出轨黑人中文字幕 | 熟女俱乐部五十路六十路av | 国产人妻久久精品二区三区老狼 | 在线a亚洲视频播放在线观看 | 亚洲精品国偷拍自产在线麻豆 | 狠狠色丁香久久婷婷综合五月 | 99久久久国产精品无码免费 | 97色伦图片97综合影院 | 国产av无码专区亚洲a∨毛片 | 国产亚洲精品久久久久久国模美 | 激情五月综合色婷婷一区二区 | 日本va欧美va欧美va精品 | 国产精品va在线观看无码 | 国模大胆一区二区三区 | 亚洲日韩av片在线观看 | 一个人看的www免费视频在线观看 | 欧美真人作爱免费视频 | 日本精品人妻无码77777 天堂一区人妻无码 | 曰韩无码二三区中文字幕 | 国产午夜福利100集发布 | 国产精品二区一区二区aⅴ污介绍 | 欧美 亚洲 国产 另类 | 一个人看的视频www在线 | 国产成人一区二区三区别 | 国产精品久久久久久亚洲影视内衣 | 日日摸日日碰夜夜爽av | 久久精品中文闷骚内射 | 精品国产青草久久久久福利 | 国产成人av免费观看 | 亚洲男人av香蕉爽爽爽爽 | 2020最新国产自产精品 | 无码人妻精品一区二区三区下载 | 白嫩日本少妇做爰 | 97久久精品无码一区二区 | 成人一在线视频日韩国产 | 一本久道高清无码视频 | 国内精品人妻无码久久久影院蜜桃 | 国产精品人人爽人人做我的可爱 | 久久99精品国产麻豆 | 国产偷抇久久精品a片69 | 亚洲天堂2017无码中文 | 在教室伦流澡到高潮hnp视频 | 国产高清不卡无码视频 | 成人毛片一区二区 | 天堂亚洲2017在线观看 | 国产亚洲精品久久久久久大师 | 亚洲午夜福利在线观看 | 亚洲中文字幕无码一久久区 | 男人扒开女人内裤强吻桶进去 | 人妻少妇精品无码专区动漫 | 亚洲七七久久桃花影院 | 奇米影视888欧美在线观看 | 国精产品一品二品国精品69xx | 国产免费久久精品国产传媒 | 人妻互换免费中文字幕 | 18无码粉嫩小泬无套在线观看 | 日韩精品成人一区二区三区 | 精品国产av色一区二区深夜久久 | 国产偷抇久久精品a片69 | 2020最新国产自产精品 | 亚洲呦女专区 | 亚洲综合无码久久精品综合 | 99久久精品午夜一区二区 | 免费无码av一区二区 | 久久久久久九九精品久 | 强伦人妻一区二区三区视频18 | 亚洲精品一区二区三区大桥未久 | 久久伊人色av天堂九九小黄鸭 | 99久久精品日本一区二区免费 | 美女毛片一区二区三区四区 | 国产午夜精品一区二区三区嫩草 | 最近中文2019字幕第二页 | 牲欲强的熟妇农村老妇女视频 | 精品欧洲av无码一区二区三区 | 四虎永久在线精品免费网址 | 日韩精品成人一区二区三区 | 精品国产国产综合精品 | 亚洲一区二区三区含羞草 | 性欧美videos高清精品 | а√天堂www在线天堂小说 | 激情内射日本一区二区三区 | 精品国产一区二区三区av 性色 | 国产色视频一区二区三区 | 无码任你躁久久久久久久 | 亚洲经典千人经典日产 | 午夜免费福利小电影 | 亚洲欧美精品aaaaaa片 | 亚洲爆乳大丰满无码专区 | 亚洲色在线无码国产精品不卡 | 色五月五月丁香亚洲综合网 | 人人爽人人澡人人人妻 | 日本一卡二卡不卡视频查询 | 国产麻豆精品一区二区三区v视界 | 国产麻豆精品一区二区三区v视界 | 成人欧美一区二区三区黑人免费 | 国产午夜亚洲精品不卡下载 | 老熟女重囗味hdxx69 | 亚洲中文字幕av在天堂 | 在线观看国产午夜福利片 | 国内揄拍国内精品人妻 | 中文字幕人妻丝袜二区 | 国产精品视频免费播放 | 欧美freesex黑人又粗又大 | 狠狠综合久久久久综合网 | aⅴ在线视频男人的天堂 | 粗大的内捧猛烈进出视频 | 成人动漫在线观看 | 西西人体www44rt大胆高清 | 国产一精品一av一免费 | 天堂亚洲2017在线观看 | 中文字幕无码日韩专区 | 荫蒂被男人添的好舒服爽免费视频 | 欧美大屁股xxxxhd黑色 | 无码av最新清无码专区吞精 | 女人和拘做爰正片视频 | 美女毛片一区二区三区四区 | 2019午夜福利不卡片在线 | 欧美性黑人极品hd | 女人高潮内射99精品 | 国产又粗又硬又大爽黄老大爷视 | 精品人妻中文字幕有码在线 | 国产av无码专区亚洲a∨毛片 | 国产又粗又硬又大爽黄老大爷视 | yw尤物av无码国产在线观看 | 欧美人与物videos另类 | 一二三四社区在线中文视频 | 精品无码国产一区二区三区av | 国产精品久久福利网站 | 香港三级日本三级妇三级 | 天天爽夜夜爽夜夜爽 | 国产精品对白交换视频 | 蜜桃视频韩日免费播放 | 国产婷婷色一区二区三区在线 | 成人免费视频视频在线观看 免费 | 人妻天天爽夜夜爽一区二区 | 搡女人真爽免费视频大全 | 99久久婷婷国产综合精品青草免费 | 欧美 亚洲 国产 另类 | 国产尤物精品视频 | 色综合久久久无码中文字幕 | 国产高清不卡无码视频 | 美女极度色诱视频国产 | 日本精品久久久久中文字幕 | 自拍偷自拍亚洲精品被多人伦好爽 | 一个人免费观看的www视频 | 色偷偷人人澡人人爽人人模 | 亚洲精品中文字幕久久久久 | 俄罗斯老熟妇色xxxx | 国产suv精品一区二区五 | 最近中文2019字幕第二页 | 波多野结衣一区二区三区av免费 | 真人与拘做受免费视频 | 俺去俺来也在线www色官网 | 国产精品无码mv在线观看 | 天天躁日日躁狠狠躁免费麻豆 | 亚洲中文字幕在线无码一区二区 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 亚洲 日韩 欧美 成人 在线观看 | 久久亚洲精品中文字幕无男同 | 久久亚洲中文字幕无码 | 久久天天躁夜夜躁狠狠 | 熟妇激情内射com | 高潮毛片无遮挡高清免费 | 国产极品美女高潮无套在线观看 | 免费人成网站视频在线观看 | 婷婷丁香六月激情综合啪 | 成年女人永久免费看片 | 中文精品无码中文字幕无码专区 | 欧美 丝袜 自拍 制服 另类 | 国产av人人夜夜澡人人爽麻豆 | 人妻少妇被猛烈进入中文字幕 | 国产人妻久久精品二区三区老狼 | 国产精品视频免费播放 | 国产精品自产拍在线观看 | 毛片内射-百度 | 最新版天堂资源中文官网 | 亚洲一区二区三区含羞草 | 婷婷色婷婷开心五月四房播播 | 国产激情无码一区二区app | 国产精品成人av在线观看 | 国产精品欧美成人 | 亚无码乱人伦一区二区 | 亚洲爆乳无码专区 | 人妻少妇被猛烈进入中文字幕 | 伊人久久婷婷五月综合97色 | 国产成人精品久久亚洲高清不卡 | 亚洲天堂2017无码 | 奇米影视7777久久精品 | 国产又粗又硬又大爽黄老大爷视 | 久久精品中文字幕一区 | 六月丁香婷婷色狠狠久久 | 亚洲日韩中文字幕在线播放 | 成人试看120秒体验区 | 无码av岛国片在线播放 | 亚洲一区二区三区在线观看网站 | 中文字幕人妻无码一区二区三区 | 在线 国产 欧美 亚洲 天堂 | 精品久久久久久亚洲精品 | 男人扒开女人内裤强吻桶进去 | aa片在线观看视频在线播放 | 久久久久国色av免费观看性色 | 色综合久久88色综合天天 | 国产成人一区二区三区别 | 精品午夜福利在线观看 | 久久久久99精品成人片 | 欧美成人午夜精品久久久 | 99riav国产精品视频 | 麻豆成人精品国产免费 | 熟女俱乐部五十路六十路av | 国産精品久久久久久久 | 精品一区二区三区波多野结衣 | 成人免费视频视频在线观看 免费 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 亚欧洲精品在线视频免费观看 | 少女韩国电视剧在线观看完整 | 最新国产乱人伦偷精品免费网站 | 又大又硬又黄的免费视频 | 久久国产精品萌白酱免费 | 精品午夜福利在线观看 | 国产美女极度色诱视频www | 国产肉丝袜在线观看 |