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)