深刻學習Redis(一)

什麼是 Redis

Redis 是徹底開源的,遵照 BSD 協議,是一個高性能的 key-value 數據庫。redis

Redis 與其餘 key - value 緩存產品有如下三個特色:shell

  • Redis 支持數據的持久化,能夠將內存中的數據保存在磁盤中,重啓的時候能夠再次加載進行使用。
  • Redis 不只僅支持簡單的 key-value 類型的數據,同時還提供 list,set,zset,hash 等數據結構的存儲。
  • Redis 支持數據的備份,即 master-slave 模式的數據備份。

Redis 的特性

特性一:速度快

官網聲稱能夠達到:10 萬 QPS數據庫

  • 數據是存在內存中的。
  • 使用 C 語言編寫。
  • 單線程模型。

Redis 速度快的主要緣由就是內存segmentfault

從快到慢依次是:數組

  • Register 寄存器
  • L1 Cache 一級緩存
  • L2 Cache 二級緩存
  • Main Memory 主存
  • Local Disk 本地磁盤
  • Remote Disk 遠程磁盤
類型 每秒讀寫次數 隨機讀寫延遲 訪問帶寬
內存 千萬級 80ns 5GB
SSD 盤 35000 0.1-02ms 100~300MB
機械盤 100 左右 10ms 100MB 左右

特性二:持久化

Redis 全部數據保存在內存當中,對數據的更新將以異步方式保存到磁盤上。緩存

Redis 支持兩種持久化方式:服務器

  1. RDB
  2. AOF

特性三:多種數據結構

五種數據結構

另外在 Redis 從 2.2.0 版本開始新增了三種數據結構:網絡

Bitmaps 和 HyperLogLog 其實本質上是字符串,並不算是真實的數據結構,而 GEO 本質上有序集合實現的。數據結構

BitMaps:能夠實現對位的操做。能夠把 Bitmaps 想象成一個以位爲單位數組,數組中的每一個單元只能存 0 或者 1,數組的下標在 bitmaps 中叫作偏移量。單個 bitmaps 的最大長度是 512MB,即 2^32 個比特位。架構

HyperLogLog:超小內存惟一值計數。特色是速度快,佔用空間小。

GEO:地理信息定位。

特性四:支持多種客戶端語言

  • Java
  • PHP
  • Python
  • Ruby
  • Lua
  • Node
  • ...

特性五:功能豐富

  • 提供發佈訂閱功能。
  • 支持事務。
  • 支持 Lua 腳本。
  • Pipeline。

特性六:"簡單"

  1. Redis 的單機核心代碼只有 23.000 行左右。
  2. Redis 不依賴外部庫。
  3. Redis 是單線程模型。

特性七:主從複製

主從複製是 Redis 保證高可用的基礎

Redis 提供了複製功能,實現了多個相同數據的 Redis 副本。

特性八:高可用、分佈式

Redis 從 2.8 版本正式提供了高可用實現 Redis Sentinel,它可以保證 Redis 節點的故障發現和故障自動轉移。

Redis 從 3.0 版本正式提供了分佈式實現 Redis Cluster,它是 Redis 真正的分佈式實現,提供了高可用、讀寫和容量的擴展性。

Redis 典型應用場景

  • 緩存系統
  • 計數器
  • 消息隊列
  • 排行榜
  • 社交網絡,例如:粉絲數、關注數、共同關注、時間軸列表
  • 實時系統,Redis 使用 Bitmap 位圖來實現布隆過濾功能,例如:垃圾郵件過濾實時處理

安裝 Redis(Linux)

wget http://download.redis.io/releases/redis-3.0.7.tar.gz

tar -xzf redis-3.0.7.tar.gz

ln -s redis-3.0.7 redis

cd redis

make && make install

Redis 可執行文件說明

進入 src 目錄下:

  • redis-server :Redis 服務器
  • redis-cli :Redis 命令行客戶端
  • redis-benchmark :Redis 基準測試工具
  • redis-check-aof :AOF 文件修復工具
  • redis-check-dump:RDB 文件檢查工具
  • redis-sentinel :Sentinel 服務器

三種啓動方式

  1. 最簡啓動:能夠直接使用redis-server命令以默認參數進行啓動。
  2. 動態啓動:redis-server –port 6380
  3. 配置文件啓動: redis-server configPath

驗證:

  • ps -ef | grep redis:(檢查 redis 進程是否啓動)
  • netstat -antpl | grep redis:(檢查 redis 服務端口是否存在)
  • redis-cli -h ip -p port ping:(檢查 redis 客戶端到 redis 服務端連通性)

三種啓動方式比較

生產環境選擇配置啓動。

單機多實例配置文件能夠用端口區分。

啓動 Redis

使用下面命令進行啓動:

redis-server

鏈接 Redis

redis-cli -h 127.0.0.1 -p 6379

鏈接成功後咱們就能夠作一些操做。

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>exit

Redis API 使用和理解

通用命令

KEYS

KEYS [pattern]

查找全部符合給定模式 patternkey , 好比說:

  • KEYS * 匹配數據庫中全部 key
  • KEYS h?llo 匹配 hellohallohxllo 等。
  • KEYS h*llo 匹配 hlloheeeeello 等。
  • KEYS h[ae]llo 匹配 hellohallo ,但不匹配 hillo

keys 是 O(n)複雜度因此通常不在生產環境使用,由於 Redis 是單線程架構,使用不當會致使 Redis 阻塞。

DBSIZE

返回當前數據庫的 key 的數量。在 Redis 內部有一個計數器來維護 Key 的數量,因此它的複雜度是 O(1)。

EXISTS

檢查給定 key 是否存在。

key 存在,返回 1 ,不然返回 0

DEL

刪除給定的一個或多個 key

返回被刪除 key 的數量。

EXPIRE

爲給定 key 設置生存時間,當 key 過時時(生存時間爲 0 ),它會被自動刪除。

設置成功返回 1 。 當 key 不存在或者不能爲 key 設置生存時間時,返回 0

TTL

以秒爲單位,返回給定 key 的剩餘生存時間(TTL, time to live)。

key 不存在時,返回 -2 。 當 key 存在但沒有設置剩餘生存時間時,返回 -1 。 不然,以秒爲單位,返回 key 的剩餘生存時間。

PERSIST

移除給定 key 的生存時間,並變爲永不過時的key

當生存時間移除成功時,返回 1 . 若是 key 不存在或 key 沒有設置生存時間,返回 0

TYPE

返回 key 所儲存的值的類型。

返回值

  • none (key 不存在)
  • string (字符串)
  • list (列表)
  • set (集合)
  • zset (有序集)
  • hash (哈希表)
  • stream (流)

數據結構和內部編碼

redis 對外展示五種數據類型:

  • string
  • hash
  • set
  • zset
  • list

每種數據結構,redis 都提供了不一樣的內部編碼實現方式(內部編碼能夠經過object encoding key查看),以便使用不一樣的場景。

127.0.0.1:6379> object encoding hello
"embstr"

string

  • raw:大於 39 個字節的字符串,用簡單動態字符串(SDS)來保存,將這個字符串的對象編碼設置爲 raw。
  • int:8 個字節的長整型,若是一個字符串保存的類型是整數值,而且這個值能夠用 long 類型來表示,name 字符串對象會將整數值保存在字符串對象結構的 ptr 屬性裏面,並將字符串對象的編碼設置爲 int。
  • embstr:小於等於 39 個字節的字符串,embstr 編碼是專門用於保存短字符串的優化編碼方式。

embstr 相較於 raw 有如下好處:

  1. embstr 編碼將建立字符串對象所需的空間分配的次數從 raw 編碼的兩次下降爲一次。
  2. 釋放 embstr 編碼的字符串對象只須要調用一次內存釋放函數,而釋放 raw 編碼對象的字符串對象須要調用兩次內存釋放函數
  3. 由於 embstr 編碼的字符串對象的全部數據都保存在一塊連續的內存裏面,因此這種編碼的字符串對象比起 raw 編碼的字符串對象能更好地利用緩存帶來的優點。

hash

  • ziplist(壓縮列表):當哈希類型元素小於has-max-ziplist-entries配置(默認 512 個),同時全部值都小於hash-max-ziplist-value配置(默認 64 個字節)時,redis 會使用 ziplist 做爲哈希的內部實現。ziplist 使用更加緊湊的結構實現多個元素的連續存儲,因此在節省內存方面比 hashtable 更加優秀。
  • hashtable(哈希表):當哈希類型沒法知足 ziplist 的條件時,redis 會使用 hashtable 做爲哈希的內部實現。由於 ziplist 的讀寫效率會降低,而 hashtable 的讀寫時間複雜度爲 O(1)。

list

  • ziplist(壓縮列表):當列表類型元素個數小於 hash-max-ziplist-entries 配置(默認 512 個)同時全部值都小於 hash-max-ziplist-value 配置(默認 64 個字節)時,Redis 會使用 ziplist 做爲列表的內部實現。
  • linkedlist(鏈表):當列表類型沒法知足條件的時候,redis 會使用 linkedlist 做爲列表的內部實現。

set

  • intset(整數集合):當集合中的元素都是整數且元素個數小於set-max-intset-entries配置(默認 512 個)是,redis 會選 intset 做爲集合的內部實現,從而減小內存使用。
  • hashtable(哈希表):當集合元素沒法知足 intset 的條件時,redis 會使用 hashtable 做爲集合的內部實現。

zset

  • ziplist:當有序集合的元素個數小於zset-max-ziplist-entries配置(默認 128 個)同時每一個元素的值小於zset-max-ziplist-value配置(默認 64 個字節)時,Redis 會用 ziplist 來做爲有序集合的內部實現,ziplist 能夠有效減小內存使用。
  • skiplist(跳躍表):當 ziplist 條件不知足的時候,有序集合會使用 skiplist 做爲內部 實現,由於 ziplist 的讀寫效率會降低

字符串類型

特色

  • key 是惟一的,不能重複。
  • value 數據類型能夠是多種,好比:字符串、數字、二進制,只是內部把數字、二進制數據轉化爲字符串。
  • value 也能夠是一個 JSON 字符串。
  • value 還能夠是序列化對象。
  • value 能夠存儲最大的數據大小爲:512MB。

經常使用的字符串場景

  • 緩存
  • 計數器
  • 分佈式鎖

GET

返回與鍵 key 相關聯的字符串值。

若是鍵 key 不存在, 那麼返回特殊值 nil ; 不然, 返回鍵 key 的值。

若是鍵 key 的值並不是字符串類型, 那麼返回一個錯誤, 由於 GET 命令只能用於字符串值。

SET

將字符串值 value 關聯到 key

若是 key 已經持有其餘值, SET 就覆寫舊值, 無視類型。

SET 命令對一個帶有生存時間(TTL)的鍵進行設置以後, 該鍵原有的 TTL 將被清除。

DEL

刪除給定的一個或多個 key

返回被刪除 key 的數量。

INCR

爲鍵 key 儲存的數字值加上一。

若是鍵 key 不存在, 那麼它的值會先被初始化爲 0 , 而後再執行 INCR 命令。

若是鍵 key 儲存的值不能被解釋爲數字, 那麼 INCR 命令將返回一個錯誤。

本操做的值限制在 64 位(bit)有符號數字表示以內。

INCR 命令會返回鍵 key 在執行加一操做以後的值。

DECR

爲鍵 key 儲存的數字值減去一。

若是鍵 key 不存在, 那麼鍵 key 的值會先被初始化爲 0 , 而後再執行 DECR 操做。

若是鍵 key 儲存的值不能被解釋爲數字, 那麼 DECR 命令將返回一個錯誤。

本操做的值限制在 64 位(bit)有符號數字表示以內。

DECR 命令會返回鍵 key 在執行減一操做以後的值。

INCRBY

爲鍵 key 儲存的數字值加上增量 increment

若是鍵 key 不存在, 那麼鍵 key 的值會先被初始化爲 0 , 而後再執行 INCRBY 命令。

若是鍵 key 儲存的值不能被解釋爲數字, 那麼 INCRBY 命令將返回一個錯誤。

本操做的值限制在 64 位(bit)有符號數字表示以內。

在加上增量 increment 以後, 返回鍵 key 當前的值。

DECRBY

將鍵 key 儲存的整數值減去減量 decrement

若是鍵 key 不存在, 那麼鍵 key 的值會先被初始化爲 0 , 而後再執行 DECRBY 命令。

若是鍵 key 儲存的值不能被解釋爲數字, 那麼 DECRBY 命令將返回一個錯誤。

本操做的值限制在 64 位(bit)有符號數字表示以內。

DECRBY 命令會返回鍵在執行減法操做以後的值。

SETNX

只在鍵 key 不存在的狀況下, 將鍵 key 的值設置爲 value

若鍵 key 已經存在, 則 SETNX 命令不作任何動做。

SETNX 是『SET if Not eXists』(若是不存在,則 SET)的簡寫。

命令在設置成功時返回 1 , 設置失敗時返回 0

SETEX

將鍵 key 的值設置爲 value , 並將鍵 key 的生存時間設置爲 seconds 秒鐘。

若是鍵 key 已經存在, 那麼 SETEX 命令將覆蓋已有的值。

SETEX 命令的效果和如下兩個命令的效果相似:

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

SETEX 和這兩個命令的不一樣之處在於 SETEX 是一個原子性(atomic)操做, 它能夠在同一時間內完成設置值和設置過時時間這兩個操做, 所以 SETEX 命令在儲存緩存的時候很是實用。

命令在設置成功時返回 OK 。 當 seconds 參數不合法時, 命令將返回一個錯誤。

APISETEX key seconds value

127.0.0.1:6379> setex jack 60 nihao
OK

MGET

返回給定的一個或多個字符串鍵的值。

若是給定的字符串鍵裏面, 有某個鍵不存在, 那麼這個鍵的值將以特殊值 nil 表示。

MGET 命令將返回一個列表, 列表中包含了全部給定鍵的值。

MSET

同時爲多個鍵設置值。

若是某個給定鍵已經存在, 那麼 MSET 將使用新值去覆蓋舊值。

MSET 是一個原子性(atomic)操做, 全部給定鍵都會在同一時間內被設置, 不會出現某些鍵被設置了可是另外一些鍵沒有被設置的狀況。

MSET 命令老是返回 OK

MSETNX

當且僅當全部給定鍵都不存在時, 爲全部給定鍵設置值。

即便只有一個給定鍵已經存在, MSETNX 命令也會拒絕執行對全部鍵的設置操做。

MSETNX 是一個原子性(atomic)操做, 全部給定鍵要麼就所有都被設置, 要麼就所有都不設置, 不可能出現第三種狀態。

當全部給定鍵都設置成功時, 命令返回 1 ; 若是由於某個給定鍵已經存在而致使設置未能成功執行, 那麼命令返回 0

APIMSETNX key value [key value …]

127.0.0.1:6379> msetnx jack1 h jack2 e jack3 l  #對不存在的key設置value
(integer) 1
127.0.0.1:6379> msetnx jack1 h jack2 e jack3 l #對存在的key設置value
(integer) 0
127.0.0.1:6379> mget jack1 jack2 jack3  #批量獲取key
1) "h"
2) "e"
3) "l"
127.0.0.1:6379>

GETSET

將鍵 key 的值設爲 value , 並返回鍵 key 在被設置以前的舊值。

若是鍵 key 沒有舊值, 也便是說, 鍵 key 在被設置以前並不存在, 那麼命令返回 nil

當鍵 key 存在但不是字符串類型時, 命令返回一個錯誤。

APPEND

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

若是 key 不存在, APPEND 就簡單地將鍵 key 的值設爲 value , 就像執行 SET key value 同樣。

追加 value 以後, 返回鍵 key 的值的長度。

STRLEN

返回鍵 key 儲存的字符串值的長度。

STRLEN 命令返回字符串值的長度。

當鍵 key 不存在時, 命令返回 0

key 儲存的不是字符串值時, 返回一個錯誤。

INCRBYFLOAT

爲鍵 key 儲存的值加上浮點數增量 increment

若是鍵 key 不存在, 那麼 INCRBYFLOAT 會先將鍵 key 的值設爲 0 , 而後再執行加法操做。

若是命令執行成功, 那麼鍵 key 的值會被更新爲執行加法計算以後的新值, 而且新值會以字符串的形式返回給調用者。

當如下任意一個條件發生時, 命令返回一個錯誤:

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

在加上增量 increment 以後, 返回鍵 key 的值。

GETRANGE

返回鍵 key 儲存的字符串值的指定部分, 字符串的截取範圍由 startend 兩個偏移量決定 (包括 startend 在內)。

負數偏移量表示從字符串的末尾開始計數, -1 表示最後一個字符, -2 表示倒數第二個字符, 以此類推。

GETRANGE 命令會返回字符串值的指定部分。

SETRANGE

從偏移量 offset 開始, 用 value 參數覆寫鍵 key 儲存的字符串值。

SETRANGE 命令會返回被修改以後, 字符串值的長度。

Hash 類型

  • 哈希類型也是 key-value 結構,key 是字符串類型,其 value 分爲兩個部分:field 和 value。
  • 其中 field 部分表明屬性,value 表明屬性對應的值。

例如上圖中,user:1:info爲 key,name,age,Date爲 user 這個 key 的一些屬性,value 是屬性對應的值。

在 hash 中,能夠爲 key 添加一個新的屬性和新的值。

好比使用下面的命令向user:1:info這個 key 添加一個新屬性 viewCounter,屬性對應的值爲 100。

hset user:1:info viewCounter 100

特色:

  • 適合存儲對象,而且能夠像數據庫中 update 一個屬性同樣只修改某一項屬性值
  • field 不能相同,value 能夠相同。

適用場景:

hash 變動的數據 user name age,尤爲是是用戶信息之類的,常常變更的信息。hash 更適合於對象的 存儲,String 更加適合字符串存儲!

HGET

HGET 命令在默認狀況下返回給定域的值。

若是給定域不存在於哈希表中, 又或者給定的哈希表並不存在, 那麼命令返回 nil

HSET

將哈希表 hash 中域 field 的值設置爲 value

若是給定的哈希表並不存在, 那麼一個新的哈希表將被建立並執行 HSET 操做。

若是域 field 已經存在於哈希表中, 那麼它的舊值將被新值 value 覆蓋。

HSET 命令在哈希表中新建立 field 域併成功爲它設置值時, 命令返回 1 ; 若是域 field 已經存在於哈希表, 而且 HSET 命令成功使用新值覆蓋了它的舊值, 那麼命令返回 0

HSETNX

當且僅當域 field 還沒有存在於哈希表的狀況下, 將它的值設置爲 value

若是給定field已經存在於哈希表當中, 那麼命令將放棄執行設置操做。

若是哈希表 hash 不存在, 那麼一個新的哈希表將被建立並執行 HSETNX 命令。

HSETNX 命令在設置成功時返回 1 , 在給定域已經存在而放棄執行設置操做時返回 0

HDEL

刪除哈希表 key 中的一個或多個指定域,不存在的域將被忽略。

返回被成功移除的域的數量,不包括被忽略的域。

HEXISTS

檢查給定域 field 是否存在於哈希表 hash 當中。

HEXISTS 命令在給定域存在時返回 1 , 在給定域不存在時返回 0

HLEN

返回哈希表 keyfield的數量。

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

HMGET

返回哈希表 key 中,一個或多個給定域的值。

若是給定的域不存在於哈希表,那麼返回一個 nil 值。

由於不存在的 key 被看成一個空哈希表來處理,因此對一個不存在的 key 進行 HMGET 操做將返回一個只帶有 nil 值的表。

HMSET

同時將多個 field-value (域-值)對設置到哈希表 key 中。

此命令會覆蓋哈希表中已存在的域。

若是 key 不存在,一個空哈希表被建立並執行 HMSET 操做。

若是命令執行成功,返回 OK

key 不是哈希表(hash)類型時,返回一個錯誤。

HGETALL

返回哈希表 key 中,全部的域和值。

在返回值裏,緊跟每一個域(field)以後是域的值(value),因此返回值的長度是哈希表大小的兩倍

HVALS

返回哈希表 key 中全部field的值。

key 不存在時,返回一個空表。

HKEYS

返回哈希表 key 中的全部field

key 不存在時,返回一個空表。

HINCRBY

爲哈希表 key 中的域 field 的值加上增量 increment

增量也能夠爲負數,至關於對給定域進行減法操做。

若是 key 不存在,一個新的哈希表被建立並執行 HINCRBY 命令。

若是域 field 不存在,那麼在執行命令前,域的值被初始化爲 0

對一個儲存字符串值的域 field 執行 HINCRBY 命令將形成一個錯誤。

本操做的值被限制在 64 位(bit)有符號數字表示以內。

最終返回哈希表 key 中域 field 的新值。

List 類型

特色

  • 鏈表(雙向鏈表)可演化成棧,隊列,在兩邊插入或者改動值,效率高。
  • 有序。
  • 能夠重複。
  • 左右兩邊插入彈出。

適用場景:

  • 最新消息排行等功能(好比朋友圈的時間線)。
  • 消息隊列。

RPUSH

將一個或多個值 value 插入到列表 key 的表尾(最右邊)。

若是有多個 value 值,那麼各個 value 值按從左到右的順序依次插入到表尾。

若是 key 不存在,一個空列表會被建立並執行 RPUSH 操做。

key 存在但不是列表類型時,返回一個錯誤。

執行 RPUSH 操做後,返回列表的長度。

LPUSH

將一個或多個值 value 插入到列表 key 的表頭

若是有多個 value 值,那麼各個 value 值按從左到右的順序依次插入到表頭。

若是 key 不存在,一個空列表會被建立並執行 LPUSH 操做。

key 存在但不是列表類型時,返回一個錯誤。

執行 LPUSH 操做後,返回列表的長度。

LINSERT

將值 value 插入到列表 key 當中,位於值 pivot 以前或以後。

pivot 不存在於列表 key 時,不執行任何操做。

key 不存在時, key 被視爲空列表,不執行任何操做。

若是 key 不是列表類型,返回一個錯誤。

若是命令執行成功,返回插入操做完成以後,列表的長度。

若是沒有找到 pivot ,返回 -1 。 若是 key 不存在或爲空列表,返回 0

LPOP

移除並返回列表 key 的頭元素。

執行成功返回列表的頭元素。 當 key 不存在時,返回 nil

RPOP

移除並返回列表 key 的尾元素。

執行成功返回列表的尾元素。 當 key 不存在時,返回 nil

LREM

根據參數 count 的值,移除列表中與參數 value 相等的元素。

count 的值能夠是如下幾種:

  • count > 0 : 從表頭開始向表尾搜索,移除與 value 相等的元素,數量爲 count
  • count < 0 : 從表尾開始向表頭搜索,移除與 value 相等的元素,數量爲 count
  • count = 0 : 移除表中全部與 value 相等的值。

返回被移除元素的數量。 由於不存在的 key 被視做空表(empty list),因此當 key 不存在時,返回 0

LTRIM

對一個列表進行修剪,也就是說,讓列表只保留指定區間內的元素,不在指定區間以內的元素都將被刪除。

key 不是列表類型時,返回一個錯誤。

須要注意的是:

  • 若是 stop 下標比 end 下標還要大,Redis 將 stop 的值設置爲 end
  • 下標從 0 開始。

命令執行成功時,返回 ok

LRANGE

返回列表 key 中指定區間內的元素,區間以偏移量 startstop 指定。

須要注意的是:

  • 若是 stop 下標比 end 下標還要大,Redis 將 stop 的值設置爲 end
  • 下標從 0 開始。
  • 包含startstop

命令執行成功時,返回指定區間內的元素。

LINDEX

返回列表 key 中,下標爲 index 的元素。

0 表示列表的第一個元素,以 1 表示列表的第二個元素,以此類推。

也可使用負數下標,以 -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推。

LLEN

返回列表 key 的長度。

若是 key 不存在,則 key 被解釋爲一個空列表,返回 0 .

若是 key 不是列表類型,返回一個錯誤。

LSET

將列表 key 下標爲 index 的元素的值設置爲 value

index 參數超出範圍,或對一個空列表( key 不存在)進行 LSET 時,返回一個錯誤。

操做成功返回 ok ,不然返回錯誤。

BLPOP

BLPOP 是列表的阻塞式(blocking)彈出。

當給定列表內沒有任何元素可供彈出的時候,鏈接將被阻塞,直到等待超時或發現可彈出元素爲止。

當存在多個給定 key 時,按給定 key 參數排列的前後順序,依次檢查各個列表。

超時參數 timeout 接受一個以秒爲單位的數字做爲值。超時參數設爲 0 表示阻塞時間能夠無限期延長(block indefinitely) 。

APIBLPOP key [key …] timeout

127.0.0.1:6379> blpop list1 list2 0  # 無限期阻塞
1) "list1"                           # 用另外一個鏈接 lpush list1 a
2) "a"                                                   # 被彈出的值
(30.31s)

BLPOP 保證返回的元素來自第一個非空的列表 ,由於它是按」查找 list1 -> 查找 list2 這樣的順序,第一個找到的非空列表。

若是列表爲空,返回一個 nil 。 不然,返回一個含有兩個元素的列表,第一個元素是被彈出元素所屬的 key ,第二個元素是被彈出元素的值。

BRPOP 和 BLPOP 命令正好相反,就不演示了。

List 的小技巧

  • LPUSH + LPOP = Stack
  • LPUSH + RPOP = Queue
  • LPUSH +BRPOP = Message Queue

Set 類型

左邊爲 key 是字符串類型,右邊爲 values,能夠將一些字符串進行一些組合,能夠向 value 中添加或者刪除一個元素。

特色

  • 哈希表實現,元素不重複。
  • 添加、刪除,查找的複雜度都是 O(1)。
  • 爲集合提供了求交集、並集、差集等操做。
  • 無序。

適用場景:

  • 共同好友。
  • 利用惟一性,統計訪問網站的全部獨立 ip。
  • 好友推薦時,根據 tag 求交集,大於某個閾值就能夠推薦。

SADD

將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略。

假如 key 不存在,則建立一個只包含 member 元素做成員的集合。

key 不是集合類型時,返回一個錯誤。

返回被添加到集合中的新元素的數量,不包括被忽略的元素。

SREM

移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略。

key 不是集合類型,返回一個錯誤。

返回被成功移除的元素的數量,不包括被忽略的元素。

SCARD

返回集合 key 的基數(集合中元素的數量)。

集合的基數。 當 key 不存在時,返回 0

APISCARD key

127.0.0.1:6379> sadd myset a b c d e f
(integer) 6
127.0.0.1:6379> scard myset
(integer) 6

SISMEMBER

判斷 member 元素是否集合 key 的成員。

若是 member 元素是集合的成員,返回 1 。 若是 member 元素不是集合的成員,或 key 不存在,返回 0

APISISMEMBER key member

127.0.0.1:6379> sismember myset a  #存在
(integer) 1
127.0.0.1:6379> sismember myset z #不存在
(integer) 0

SRANDMEMBER

若是命令執行時,只提供了 key 參數,那麼返回集合中的一個隨機元素。

從 Redis 2.6 版本開始, 接受可選的 count 參數:

  • 若是 count 爲正數,且小於集合基數,那麼命令返回一個包含 count 個元素的數組,數組中的元素各不相同。若是 count 大於等於集合基數,那麼返回整個集合。
  • 若是 count 爲負數,那麼命令返回一個數組,數組中的元素可能會重複出現屢次,而數組的長度爲 count 的絕對值。

只提供 key 參數時,返回一個元素;若是集合爲空,返回 nil 。 若是提供了 count 參數,那麼返回一個數組;若是集合爲空,返回空數組。

APISRANDMEMBER key [count]

127.0.0.1:6379> srandmember myset #不填count 隨機返回一個
"b"
127.0.0.1:6379> srandmember myset 2 # count爲正數
1) "e"
2) "f"
127.0.0.1:6379> srandmember myset -2 # count爲負數
1) "e"
2) "a"
127.0.0.1:6379> srandmember myset -2 # count爲負數
1) "f"
2) "f"

SMEMBERS

返回集合 key 中的全部成員。

不存在的 key 被視爲空集合。

APISMEMBERS key

127.0.0.1:6379> smembers myset
1) "a"
2) "e"
3) "d"
4) "f"
5) "c"
6) "b"

SPOP

移除並返回集合中的一個隨機元素。

返回被移除的隨機元素。 當 key 不存在或 key 是空集時,返回 nil

APISPOP key

127.0.0.1:6379> spop myset
"d"

SINTER

返回一個集合的所有成員,該集合是全部給定集合的交集。

不存在的 key 被視爲空集。

當給定集合當中有一個空集時,結果也爲空集(根據集合運算定律)。

APISINTER key [key …]

127.0.0.1:6379> smembers set1
1) "a"
2) "c"
3) "d"
4) "b"
5) "e"
127.0.0.1:6379> smembers set2
1) "d"
2) "b"
3) "e"
127.0.0.1:6379> sinter set1 set2  #獲取兩遍都存在的數據
1) "d"
2) "b"
3) "e"

SUNION

返回一個集合的所有成員,該集合是全部給定集合的並集。

不存在的 key 被視爲空集。

API:SUNION key [key …]

127.0.0.1:6379> sunion set1 set2 #獲取並集
1) "a"
2) "e"
3) "d"
4) "c"
5) "b"

SDIFF

返回一個集合的所有成員,該集合是全部給定集合之間的差集。

不存在的 key 被視爲空集。

APISDIFF key [key …]

127.0.0.1:6379> sdiff set1 set2 #獲取差集
1) "a"
2) "c"

ZSet 類型

左邊爲 key,是字符串類型。右邊爲 value,由兩部分組成:score 和 value score 表示分值,表示 value 在有序集合中的位置。

集合與有序集合的區別

  • 都沒有重複元素。
  • 集合無序,有序集合是有序的。
  • 集合中只有 member,有序集合中有 member+score。

列表與有序集合的區別

  • 列表能夠有重複元素,有序集合沒有重複元素。
  • 列表有序,有序集合有序。
  • 列表中只有 member,有序集合中有 member+score。

特色

將 Set 中的元素增長一個權重參數 score,元素按 score 有序排列,自然排序。

適用場景:

  • 一、排行榜。
  • 二、帶權重的消息隊列。

ZADD

將一個或多個 member 元素及其 score 值加入到有序集 key 當中。

若是某個 member 已是有序集的成員,那麼更新這個 memberscore 值,並經過從新插入這個 member 元素,來保證該 member 在正確的位置上。

score 值能夠是整數值或雙精度浮點數。

若是 key 不存在,則建立一個空的有序集並執行 ZADD 操做。

key 存在但不是有序集類型時,返回一個錯誤。

返回被成功添加的新成員的數量,不包括那些被更新的、已經存在的成員。

ZREM

移除有序集 key 中的一個或多個成員,不存在的成員將被忽略。

key 存在但不是有序集類型時,返回一個錯誤。

返回被成功移除的成員的數量,不包括被忽略的成員。

ZSCORE

返回有序集 key 中,成員 memberscore 值。

若是 member 元素不是有序集 key 的成員,或 key 不存在,返回 nil

ZINCRBY

爲有序集 key 的成員 memberscore 值加上增量 increment

能夠經過傳遞一個負數值 increment ,讓 score 減去相應的值。

key 不存在,或 member 不是 key 的成員時, ZINCRBY key increment member 等同於 ZADD key increment member

key 不是有序集類型時,返回一個錯誤。

score 值能夠是整數值或雙精度浮點數。

member 成員的新 score 值,以字符串形式表示。

ZCARD

key 存在且是有序集類型時,返回有序集的基數。 當 key 不存在時,返回 0

ZRANGE

返回有序集 key 中,指定區間內的成員。

其中成員的位置按 score 值遞增(從小到大)來排序。

若是須要從大到小可使用ZREVRANGE命令。

下標從 0 開始,stop 參數的值比有序集的最大下標還要大,那麼 Redis 將 stop 看成最大下標來處理。

能夠經過使用 WITHSCORES 選項,來讓成員和它的 score 值一併返回。

APIZRANGE key start stop [WITHSCORES]

127.0.0.1:6379> zadd zset 10 a 20 b 30 c 40 d 50 e
(integer) 5
127.0.0.1:6379> zrange zset  0 2
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> zrange zset  0 2 withscores
1) "a"
2) "10"
3) "b"
4) "20"
5) "c"
6) "30"

ZRANGEBYSCORE

返回有序集 key 中,全部 score 值介於 minmax 之間(包括等於 minmax )的成員。有序集成員按 score 值遞增(從小到大)次序排列。

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

能夠經過使用 WITHSCORES 選項,來讓成員和它的 score 值一併返回。

minmax 能夠是 -inf+inf ,這樣一來,你就能夠在不知道有序集的最低和最高 score 值的狀況下,使用這類命令。

APIZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

127.0.0.1:6379> ZRANGEBYSCORE zset 10 50 withscores
 1) "a"
 2) "10"
 3) "b"
 4) "20"
 5) "c"
 6) "30"
 7) "d"
 8) "40"
 9) "e"
10) "50"
127.0.0.1:6379> ZRANGEBYSCORE zset -inf +inf
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"

ZCOUNT

返回有序集 key 中, score 值在 minmax 之間(默認包括 score 值等於 minmax )的成員的數量。

返回score 值在 minmax 之間的成員的數量。

APIZCOUNT key min max

127.0.0.1:6379> zcount zset 10 30
(integer) 3

ZREMRANGEBYRANK

移除有序集 key 中,指定排名(rank)區間內的全部成員。

區間分別如下標參數 startstop 指出,包含 startstop 在內。

下標參數 startstop 都以 0 爲底,也就是說,以 0 表示有序集第一個成員,以 1 表示有序集第二個成員,以此類推。 你也可使用負數下標,以 -1 表示最後一個成員, -2 表示倒數第二個成員,以此類推。

返回被移除成員的數量。

APIZREMRANGEBYRANK key start stop

127.0.0.1:6379> zrange zset 0 100 withscores
 1) "a"
 2) "10"
 3) "b"
 4) "20"
 5) "c"
 6) "30"
 7) "d"
 8) "40"
 9) "e"
10) "50"
127.0.0.1:6379> ZREMRANGEBYRANK zset 0 1
(integer) 2
127.0.0.1:6379> zrange zset 0 100 withscores
1) "c"
2) "30"
3) "d"
4) "40"
5) "e"
6) "50"

ZREMRANGEBYSCORE

移除有序集 key 中,全部 score 值介於 minmax 之間(包括等於 minmax )的成員。

返回被移除成員的數量。

APIZREMRANGEBYSCORE key min max

127.0.0.1:6379> zremrangebyscore zset 40 50
(integer) 2

ZINTERSTORE

計算給定的一個或多個有序集的交集,其中給定 key 的數量必須以 numkeys 參數指定,並將該交集(結果集)儲存到 destination

默認狀況下,結果集中某個成員的 score 值是全部給定集下該成員 score 值之和。

返回保存到 destination 的結果集的基數。

APIZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]

127.0.0.1:6379> zadd test1 10 a 20 b 30 c 40 d 50 e
(integer) 5
127.0.0.1:6379> zadd test2 10 a 20 b 30 c 40 d 50 e
(integer) 5
127.0.0.1:6379> ZINTERSTORE sum_point 2 test1 test2
(integer) 5
127.0.0.1:6379> zrange sum_point  0 -1 withscores
 1) "a"
 2) "20"
 3) "b"
 4) "40"
 5) "c"
 6) "60"
 7) "d"
 8) "80"
 9) "e"
10) "100"

ZUNIONSTORE

計算給定的一個或多個有序集的並集,其中給定 key 的數量必須以 numkeys 參數指定,並將該並集(結果集)儲存到 destination

默認狀況下,結果集中某個成員的 score 值是全部給定集下該成員 score 值之

WEIGHTS

使用 WEIGHTS 選項,你能夠爲 每一個 給定有序集 分別 指定一個乘法因子(multiplication factor),每一個給定有序集的全部成員的 score 值在傳遞給聚合函數(aggregation function)以前都要先乘以該有序集的因子。

若是沒有指定 WEIGHTS 選項,乘法因子默認設置爲 1

AGGREGATE

使用 AGGREGATE 選項,你能夠指定並集的結果集的聚合方式。

默認使用的參數 SUM ,能夠將全部集合中某個成員的 score 值之 做爲結果集中該成員的 score 值;使用參數 MIN ,能夠將全部集合中某個成員的 最小 score 值做爲結果集中該成員的 score 值;而參數 MAX 則是將全部集合中某個成員的 最大 score 值做爲結果集中該成員的 score 值。

返回保存到 destination 的結果集的基數。

127.0.0.1:6379> zrange test3 0 -1 withscores
1) "a"
2) "10"
3) "b"
4) "20"
127.0.0.1:6379> zrange test4 0 -1 withscores
1) "a"
2) "10"
3) "b"
4) "20"
5) "c"
6) "30"
7) "d"
8) "40"
127.0.0.1:6379> zunionstore test5 2 test4 test5 weights 1 3
(integer) 4
127.0.0.1:6379> zrange test5 0 -1 withscores
1) "a"
2) "10"
3) "b"
4) "20"
5) "c"
6) "30"
7) "d"
8) "40"

Redis 命令參考

相關文章
相關標籤/搜索