1. 程式人生 > >Redis 基礎及各資料型別對應的命令

Redis 基礎及各資料型別對應的命令

基本概念 安裝及使用

可以在官網下載原始碼編譯安裝。

Redis 安裝完成後,通過 redis-server 命令可以啟動 Redis 伺服器,如果修改了配置檔案,需要在啟動伺服器時指定配置檔案的路徑。通過 redis-cli 可以進入互動式的客戶端(類似 MySQL 的 mysql 命令)。 Redis 支援的資料型別 資料型別 可儲存的值的型別 支援的操作 STRING 字串、整數、浮點數 操作整個字串或字串的一部分,整數和浮點數還可以執行自增、自減操作 LIST 儲存字串的連結串列,允許有相同元素 連結串列兩端增刪元素(PUSH、POP),根據偏移量操作元素,讀取一個或多個元素,根據節點的值查詢、刪除元素 HASH 儲存字串鍵值對的無序散列表,適合儲存物件。 每個 hash 可以儲存 232 - 1 鍵值對(40多億) 增刪查改單個鍵值對,讀取所有鍵值對 SET 儲存字串的無序資料結構(所有儲存的元素不可相同) 增刪查改單個元素,檢查元素是否存在,獲取隨機元素,求交集、並集、差集 ZSET 有序集合(Sorted Set),儲存字串成員與浮點數分值(score)之間的有序對映(類似普通集合,所有儲存的元素不可相同,但是分數可以重複),分值決定排列順序 增刪查改單個元素,根據分值範圍(range)或成員讀取元素 過期時間

在 Redis 中,每儲存一個鍵值對時,都可以為其設定過期時間,也可以修改或刪除過期時間。 過期時間可用的型別:

EXPIRE key s:設定有效時間(長度),單位秒
PEXPIRE key ms:設定有效時間(長度),單位毫秒
EXPIREAT key timestamp_s:設定有效時刻(到那一刻過期),timestamp 代表秒數的時間戳
PEXPIREAT key timestamp_ms:設定有效時刻(到那一刻過期),timestamp 代表毫秒數的時間戳

對於上面四種方式,Redis 內部最終都會轉為使用 PEXPIREAT。

TTL 命令可以檢視鍵值對的過期時間,永不過期的鍵返回 -1,已經過期(不存在)的鍵會返回 -2。EXPIRE 命令可以重設過期時間。 過期處理策略

Redis 支援三種處理策略:

定時刪除:為每個設定了過期時間的鍵建立一個定時器,到過期時間時,立刻刪除。記憶體效率高,但 CPU 效率低。
惰性刪除:不會立刻刪除過期的鍵,而是在外部指令讀取這個鍵的時候才刪除。記憶體效率低,但 CPU 效率高。處理過程為: 
    接收 get 命令
    判斷所讀取的鍵是否過期
    過期則執行刪除操作並返回 nil(空),否則直接返回值
定期刪除:設定一個時間間隔,每隔一段時間都會檢測是否有過期鍵,如果有則刪除

通用命令

Redis 中,部分命令同時支援 5 種資料型別: KEYS

按照指定模式查詢資料庫中的鍵值。例如官方示例如下:

redis> MSET firstname Jack lastname Stuntman age 35
"OK"
redis> KEYS *name*
1) "lastname"
2) "firstname"
redis> KEYS a??
1) "age"
redis> KEYS *
1) "lastname"
2) "firstname"
3) "age"

DBSIZE

返回資料庫鍵的數量:

127.0.0.1:6379> dbsize
(integer) 4

EXISTS

判斷鍵值是否存在。可以同時判斷多個鍵值,用空格分割,返回存在的鍵值的數量:

redis> SET key1 "Hello"
"OK"
redis> EXISTS key1
(integer) 1
redis> EXISTS nosuchkey
(integer) 0
redis> SET key2 "World"
"OK"
redis> EXISTS key1 key2 nosuchkey
(integer) 2

DEL

刪除鍵值對:

redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> DEL key1 key2 key3
(integer) 2

TTL

檢視鍵值對的過期時間:

redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10

EXPIRE

設定鍵值對的過期時間:

redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10
redis> SET mykey "Hello World"
"OK"
redis> TTL mykey
(integer) -1

PERSIST

刪除過期時間:

redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10
redis> PERSIST mykey
(integer) 1
redis> TTL mykey
(integer) -1

TYPE

檢視資料型別:

redis> SET key1 "value"
"OK"
redis> LPUSH key2 "value"
(integer) 1
redis> SADD key3 "value"
(integer) 1
redis> TYPE key1
"string"
redis> TYPE key2
"list"
redis> TYPE key3
"set"

STRING

STRING 可以儲存字串、整型及浮點型。對於整型和浮點型可以執行自增和自減操作。 指令 SET 和 GET

SET 指令用於設定鍵值對,可以同時設定過期時間,還可以指定只有在鍵已經存在(或不存在)時才進行設定。 GET 指定讀取鍵對應的值,如果鍵不存在則返回 nil。

語法:

set key value [EX seconds] [PX milliseconds] [NX|XX]
 
get key

引數:

EX second:設定鍵的過期時間,單位秒。SET key value EX second 等同於 SETEX key second value 。
PX millisecond:設定鍵的過期時間,單位毫秒。SET key value PX millisecond 等同於 PSETEX key millisecond value。
NX :只在鍵不存在(Not eXist)時,才對鍵進行設定操作。SET key value NX 效果等同於 SETNX key value。
XX :只在鍵已經存在時,才對鍵進行設定操作。

設定鍵值對,同時設定過期時間:

127.0.0.1:6379> set hello world EX 10
OK
127.0.0.1:6379> ttl hello
(integer) 7
127.0.0.1:6379> ttl hello
(integer) -2
127.0.0.1:6379> get hello
(nil)
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> ttl hello
(integer) -1

只有在鍵已經存在(或不存在)時才進行設定:

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> ttl hello
(integer) -1
127.0.0.1:6379> set hello world EX 10 NX
(nil)
127.0.0.1:6379> ttl hello
(integer) -1
127.0.0.1:6379> set hello world EX 10 XX
OK
127.0.0.1:6379> ttl hello
(integer) 8

MSET 和 MGET

MSET 指令一次設定多個鍵值對 MGET 指令一次讀取多個鍵對應的值

語法:

MSET key value [key value ...]
 
MGET key [key ...]

示例:

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> keys k*
1) "k2"
2) "k3"
3) "k1"

GETSET

將給定 key 的值設為 value ,並返回這個 key 對應的舊值。

語法:

GETSET key value

示例:

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> getset hello val
"world"
127.0.0.1:6379> get hello
"val"

APPEND

如果 key 已經存在並且是一個字串, APPEND 命令將 value 追加到 key 原來的值的末尾。如果 key 不存在,則將給定 key 設為 value ,就像執行 SET key value 一樣。

語法:

APPEND key value

示例:

127.0.0.1:6379> get hello
(nil)
127.0.0.1:6379> append hello good
(integer) 4
127.0.0.1:6379> get hello
"good"
127.0.0.1:6379> append hello " world"
(integer) 10
127.0.0.1:6379> get hello
"good world"

INCR

將 key 中儲存的數字值增一。如果 key 不存在,那麼 key 的值會先被初始化為 0 ,然後再執行 INCR 操作。如果值包含錯誤的型別,或字串型別的值不能表示為數字,那麼返回一個錯誤。

語法:

INCR key

示例:

127.0.0.1:6379> set hello 1
OK
127.0.0.1:6379> incr hello
(integer) 2
127.0.0.1:6379> incr hello
(integer) 3
127.0.0.1:6379> get hello
"3"
 
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> incr hello
(integer) 1

INCRBY 和 INCRBYFLOAT

將 key 所儲存的值加上增量 increment 。如果 key 不存在,那麼 key 的值會先被初始化為 0 ,然後再執行 INCRBY 命令。如果值包含錯誤的型別,或字串型別的值不能表示為數字,那麼返回一個錯誤。

語法:

INCRBY key increment
 
INCRBYFLOAT key increment

示例:

127.0.0.1:6379> set hello 1
OK
127.0.0.1:6379> incrby hello 5
(integer) 6
127.0.0.1:6379> incrbyfloat hello 5.5
"11.5"

GETRANGE

讀取子字串,字串的擷取範圍由 start 和 end 兩個偏移量決定(包括 start 和 end 在內)。負數偏移量表示從字串最後開始計數, -1 表示最後一個字元, -2 表示倒數第二個,以此類推。

語法:

示例:

127.0.0.1:6379> set hello "hello world!!"
OK
127.0.0.1:6379> getrange hello 4 -1
"o world!!"
127.0.0.1:6379> getrange hello 4 6
"o w"

LIST

LIST 列表不能使用 GET 和 SET 命令。列表可以儲存相同的字串,索引從 0 開始,LRANGE 命令的結束索引是 -1 時表示到列表的最後一個元素。

支援的命令如下:

LPUSH:從左側新增元素,可以一次新增多個元素。 RPUSH:從右側新增元素,可以一次新增多個元素。 LPOP:從左側彈出元素。 RPOP:從右側彈出元素。 LINDEX:獲取列表給定位置上的元素。 LRANGE:獲取列表指定範圍內的所有元素。

127.0.0.1:6379> get l
(nil)
127.0.0.1:6379> rpush l 1
(integer) 1
127.0.0.1:6379> get l
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> lindex l 1
(nil)
127.0.0.1:6379> lindex l 0
"1"
127.0.0.1:6379> rpush l 2
(integer) 2
127.0.0.1:6379> lrange l 0 -1
1) "1"
2) "2"
127.0.0.1:6379> lpop l
"1"
127.0.0.1:6379> lrange l 0 -1
1) "2"

SET

SET 集合跟 LIST 列表類似,都可以儲存多個字串,但是 SET 中的字串無序且不能相同。

支援的命令如下:

SADD:向集合新增元素。 SREM:從集合中刪除元素。 SISMEMBER:檢查元素是否已經存在於集合中。 SMEMBERS:獲取集合中的所有元素。 SINTER:計算交集。 SUNION:計算並集。 SDIFF:計算差集。

127.0.0.1:6379> get s
(nil)
127.0.0.1:6379> sadd s 666
(integer) 1
127.0.0.1:6379> sadd s 777
(integer) 1
127.0.0.1:6379> sadd s 888
(integer) 1
127.0.0.1:6379> smembers s
1) "666"
2) "777"
3) "888"
127.0.0.1:6379> sismember s 666
(integer) 1
127.0.0.1:6379> srem s 777
(integer) 1
127.0.0.1:6379> sismember s 777
(integer) 0
127.0.0.1:6379> smembers s
1) "666"
2) "888"

HASH

HASH 雜湊可以儲存多個鍵值對。雜湊儲存的鍵是字串,值可以是字串或數字,且雜湊的值為數字時可以執行自增或自減操作。很多字串命令都有對應的雜湊版本。

可以將 Redis 中的雜湊看做關係資料庫的行,可以同時讀取或修改某個雜湊(用 key 標記)的多個欄位(用 field 標記)。

支援的命令如下:

HSET:設定某個雜湊的鍵值對,如果雜湊已經存在則增加鍵值對。語法:HSET key field value HGET:獲取某個雜湊的指定的鍵對應的值。語法:HGET key field HGETALL:獲取某個雜湊的所有鍵值對。語法:HGETALL key HDEL:刪除某個雜湊的指定的鍵值對。語法:HGETALL key field [field …]

示例:

127.0.0.1:6379> hgetall h
(empty list or set)
127.0.0.1:6379> hset h k1 v1
(integer) 1
127.0.0.1:6379> hset h k2 v2
(integer) 1
127.0.0.1:6379> hset h k3 v3
(integer) 1
127.0.0.1:6379> hgetall h
1) "k1"
2) "v1"
3) "k2"
4) "v2"
5) "k3"
6) "v3"
127.0.0.1:6379> hget h k1
"v1"
127.0.0.1:6379> hdel h k1 k2
(integer) 2
127.0.0.1:6379> hget h k1
(nil)

ZSET

ZSET 有序集合類似 HASH 雜湊,也儲存鍵值對。有序集合的鍵成為成員(member),每個成員都不相同;值成為分值(score),必須是浮點數。有序集合既可以根據成員訪問元素(類似雜湊),又可以根據分值及分值的排列順序來訪問元素。 指令 ZADD

向有序集合新增指定了分值的元素。

zadd key [NX|XX] [CH] [INCR] score member [score member …]

選項: XX: 只更新已經存在的元素,不會新增新元素。 NX: 不會更新已經存在的元素,只會新增新元素。 CH: ZADD 命令預設返回新增的新元素數量,CH 選項將返回值修改為更改的元素總數(CHange)。更改的元素包括新增的新元素和更新分數的已有元素(如果分數不變,則不計算在內)。 INCR: 指定這個選項時,ZADD 的行為類似 ZINCRBY。這種模式下只能設定一個分值對。

示例,新增兩個元素 a、b,分值分別為 10 和 20:

127.0.0.1:6379> zadd z 10 a 20 b
(integer) 2
127.0.0.1:6379> zrange z 0 100
1) "a"
2) "b"

NX 表示如果 a 不存在,則新增 a 元素同時設定分值為 10(因為 a 已經存在,所以不會有任何修改):

127.0.0.1:6379> zadd z NX 10 a
(integer) 0

沒有新增新元素,所以返回 0(預設返回的是新增的新元素的數量):

127.0.0.1:6379> zadd z XX 10 a
(integer) 0

通過 NX 可以成功新增元素:

127.0.0.1:6379> zadd z XX 10 aa
(integer) 0
127.0.0.1:6379> zrange z 0 100
1) "a"
2) "b"
127.0.0.1:6379> zadd z NX 10 aa
(integer) 1
127.0.0.1:6379> zrange z 0 100
1) "a"
2) "aa"
3) "b"

通過 CH 得到修改的元素數量:

127.0.0.1:6379> zadd z CH 30 a 100 aa
(integer) 2
127.0.0.1:6379> zadd z CH 30 a 100 aa
(integer) 0

ZREM

刪除元素,可以同時刪除多個元素,空格分隔。

zrem key member [member …]

示例:

127.0.0.1:6379> zrem z a aa
(integer) 2
127.0.0.1:6379> zrange z 0 100
1) "b"

ZRANGE

根據排列順序讀取多個元素。start 和 stop 都是從零開始的索引,其中 0 是第一個元素,1 是下一個元素,依此類推。它們也可以是負數,表示從排序集的末尾開始的偏移,-1是排序集的最後一個元素,-2是倒數第二個元素,依此類推。

zrange key start stop [WITHSCORES]

WITHSCORES 選項表示同時顯示分數和值。

官方示例:

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
redis> ZRANGE myzset 2 3
1) "three"
redis> ZRANGE myzset -2 -1
1) "two"
2) "three"
redis> ZRANGE myzset 0 1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"

ZRANGEBYSCORE

根據分數讀取多個元素。

語法:

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

其中 min 和 max 表示分值,可以用 -inf 和 +inf 表示無窮小和無窮大。

結果集預設包含 min 和 max,可以使用左括號排除,例如 ZRANGEBYSCORE zset (1 5 表示 1 < score <= 5,ZRANGEBYSCORE zset (5 (10 表示 5 < score < 10。

官方示例:

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANGEBYSCORE myzset -inf +inf
1) "one"
2) "two"
3) "three"
redis> ZRANGEBYSCORE myzset 1 2
1) "one"
2) "two"
redis> ZRANGEBYSCORE myzset (1 2
1) "two"
redis> ZRANGEBYSCORE myzset (1 (2
(empty list or set)