1、鍵管理
之前通過對五種資料類型的操作指令的學習發現,Redis在對每種資料進行處理之前,都要先指定該資料的key,然後再指定對該資料進行何種操作。
Redis中的key有點類似于Java中的變量名。對某個資料的處理都是以key作為切入點。是以Redis把key作為單獨的處理對象抽象出了一套操作指令。key可以想象成一個指向實際資料的指針,對key的操作會直接影響它所指向的資料的狀态。
:> SET name tom
OK
:> GET name
"tom"
:> DEL name
(integer)
:> GET name
(nil)
想要檢視某個資料的類型:
:> SADD direction east west south north
(integer)
:> TYPE direction
set
想要更改某個資料的key的名字:
:> RENAME direction direct
OK
:> SMEMBERS direct
) "north"
) "west"
) "south"
) "east"
1.1 key(鍵)指令
指令示例:
DEL key [key …]
删除給定的一個或多個 key 。不存在的 key 會被忽略。
傳回值:被删除key的數量。
示例:
//删除單個 key
redis> SET name huangz
OK
redis> DEL name
(integer) 1
//删除一個不存在的 key
redis> EXISTS phone
(integer) 0
redis> DEL phone # 失敗,沒有 key 被删除
(integer) 0
//同時删除多個 key
redis> SET name “redis”
OK
redis> SET type “key-value store”
OK
redis> SET website “redis.com”
OK
redis> DEL name type website
(integer) 3
1.2 String(字元串)指令
指令示例:
SET key value [EX seconds] [PX milliseconds] [NX|XX]
将字元串值 value 關聯到 key 。如果 key 已經持有其他值, SET 就覆寫舊值,無視類型。
對于某個原本帶有生存時間(TTL)的鍵來說, 當 SET 指令成功在這個鍵上執行時, 這個鍵原有的 TTL 将被清除。
可選參數:
從 Redis 2.6.12 版本開始, SET 指令的行為可以通過一系列參數來修改:
EX second :設定鍵的過期時間為 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。
PX millisecond :設定鍵的過期時間為 millisecond 毫秒。 SET key value PX millisecond 效果等同于 PSETEX key millisecond value 。
NX :隻在鍵不存在時,才對鍵進行設定操作。 SET key value NX 效果等同于 SETNX key value 。
XX :隻在鍵已經存在時,才對鍵進行設定操作。
因為 SET 指令可以通過參數來實作和 SETNX 、 SETEX 和 PSETEX 三個指令的效果,是以将來的 Redis 版本可能會廢棄并最終移除 SETNX 、 SETEX 和 PSETEX 這三個指令。
傳回值:在 Redis 2.6.12 版本以前, SET 指令總是傳回 OK 。
從 Redis 2.6.12 版本開始, SET 在設定操作成功完成時,才傳回 OK 。
如果設定了 NX 或者 XX ,但因為條件沒達到而造成設定操作未執行,那麼指令傳回空批量回複(NULL Bulk Reply)。
//對不存在的鍵進行設定
示例:
redis 127.0.0.1:6379> SET key “value”
OK
redis 127.0.0.1:6379> GET key
“value”
// 對已存在的鍵進行設定
redis 127.0.0.1:6379> SET key “new-value”
OK
redis 127.0.0.1:6379> GET key
“new-value”
//使用 EX 選項
redis 127.0.0.1:6379> SET key-with-expire-time “hello” EX 10086
OK
redis 127.0.0.1:6379> GET key-with-expire-time
“hello”
redis 127.0.0.1:6379> TTL key-with-expire-time
(integer) 10069
//使用 PX 選項
redis 127.0.0.1:6379> SET key-with-pexpire-time “moto” PX 123321
OK
redis 127.0.0.1:6379> GET key-with-pexpire-time
“moto”
redis 127.0.0.1:6379> PTTL key-with-pexpire-time
(integer) 111939
//使用 NX 選項
redis 127.0.0.1:6379> SET not-exists-key “value” NX
OK # 鍵不存在,設定成功
redis 127.0.0.1:6379> GET not-exists-key
“value”
redis 127.0.0.1:6379> SET not-exists-key “new-value” NX
(nil) # 鍵已經存在,設定失敗
redis 127.0.0.1:6379> GEt not-exists-key
“value” # 維持原值不變
// 使用 XX 選項
redis 127.0.0.1:6379> EXISTS exists-key
(integer) 0
redis 127.0.0.1:6379> SET exists-key “value” XX
(nil) # 因為鍵不存在,設定失敗
redis 127.0.0.1:6379> SET exists-key “value”
OK # 先給鍵設定一個值
redis 127.0.0.1:6379> SET exists-key “new-value” XX
OK # 設定新值成功
redis 127.0.0.1:6379> GET exists-key
“new-value”
// NX 或 XX 可以和 EX 或者 PX 組合使用
redis 127.0.0.1:6379> SET key-with-expire-and-NX “hello” EX 10086 NX
OK
redis 127.0.0.1:6379> GET key-with-expire-and-NX
“hello”
redis 127.0.0.1:6379> TTL key-with-expire-and-NX
(integer) 10063
redis 127.0.0.1:6379> SET key-with-pexpire-and-XX “old value”
OK
redis 127.0.0.1:6379> SET key-with-pexpire-and-XX “new value” PX 123321
OK
redis 127.0.0.1:6379> GET key-with-pexpire-and-XX
“new value”
redis 127.0.0.1:6379> PTTL key-with-pexpire-and-XX
(integer) 112999
// EX 和 PX 可以同時出現,但後面給出的選項會覆寫前面給出的選項
redis 127.0.0.1:6379> SET key “value” EX 1000 PX 5000000
OK
redis 127.0.0.1:6379> TTL key
(integer) 4993 # 這是 PX 參數設定的值
redis 127.0.0.1:6379> SET another-key “value” PX 5000000 EX 1000
OK
redis 127.0.0.1:6379> TTL another-key
(integer) 997 # 這是 EX 參數設定的值
1.3 hash(哈希表)
指令示例:
HSET key field value
将哈希表 key 中的域 field 的值設為 value 。如果 key 不存在,一個新的哈希表被建立并進行 HSET 操作。如果域 field 已經存在于哈希表中,舊值将被覆寫。
傳回值:如果 field 是哈希表中的一個建立域,并且值設定成功,傳回 1 。如果哈希表中域 field 已經存在且舊值已被新值覆寫,傳回 0 。
redis> HSET website google “www.g.cn” # 設定一個新域
(integer) 1
redis> HSET website google “www.google.com” # 覆寫一個舊域
(integer) 0
1.4 List(清單)
指令示例:
LSET key index value
将清單 key 下标為 index 的元素的值設定為 value 。當 index 參數超出範圍,或對一個空清單( key 不存在)進行 LSET 時,傳回一個錯誤。
關于清單下标的更多資訊,請參考 LINDEX 指令。
傳回值:操作成功傳回 ok ,否則傳回錯誤資訊。
//對空清單(key 不存在)進行 LSET
redis> EXISTS list
(integer) 0
redis> LSET list 0 item
(error) ERR no such key
//對非空清單進行 LSET
redis> LPUSH job “cook food”
(integer) 1
redis> LRANGE job 0 0
1) “cook food”
redis> LSET job 0 “play game”
OK
redis> LRANGE job 0 0
1) “play game”
// index 超出範圍
redis> LLEN list # 清單長度為 1
(integer) 1
redis> LSET list 3 ‘out of range’
(error) ERR index out of range
1.5 Set(集合)
指令示例:
SADD key member [member …]
将一個或多個 member 元素加入到集合 key 當中,已經存在于集合的 member 元素将被忽略。假如 key 不存在,則建立一個隻包含 member 元素作成員的集合。當 key 不是集合類型時,傳回一個錯誤。
在Redis2.4版本以前, SADD 隻接受單個 member 值。
傳回值:被添加到集合中的新元素的數量,不包括被忽略的元素。
// 添加單個元素
redis> SADD bbs “discuz.net”
(integer) 1
// 添加重複元素
redis> SADD bbs “discuz.net”
(integer) 0
// 添加多個元素
redis> SADD bbs “tianya.cn” “groups.google.com”
(integer) 2
redis> SMEMBERS bbs
1) “discuz.net”
2) “groups.google.com”
3) “tianya.cn”
1.6 SortedSet(有序集合)
指令示例:
ZADD key score member [[score member] [score member] …]
将一個或多個 member 元素及其 score 值加入到有序集 key 當中。如果某個 member 已經是有序集的成員,那麼更新這個 member 的 score 值,并通過重新插入這個 member 元素,來保證該 member 在正确的位置上。score 值可以是整數值或雙精度浮點數。如果 key 不存在,則建立一個空的有序集并執行 ZADD 操作。當 key 存在但不是有序集類型時,傳回一個錯誤。
對有序集的更多介紹請參見 sorted set 。
在 Redis 2.4 版本以前, ZADD 每次隻能添加一個元素。
傳回值:被成功添加的新成員的數量,不包括那些被更新的、已經存在的成員。
// 添加單個元素
redis> ZADD page_rank 10 google.com
(integer) 1
// 添加多個元素
redis> ZADD page_rank 9 baidu.com 8 bing.com
(integer) 2
redis> 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) 0
redis> 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) 0
redis> 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、Pub/Sub釋出訂閱管理
釋出訂閱(pub/sub)是一種消息通信模式,主要的目的是解耦消息釋出者和消息訂閱者之間的耦合,這點和設計模式中的觀察者模式比較相似。
Redis作為一個server,在訂閱者和釋出者之間起到了消息路由的功能。訂閱者可以通過subscribe和psubscribe指令向Redis server訂閱自己感興趣的消息類型,Redis将消息類型稱為通道(channel)。當釋出者通過publish指令向Redis server發送特定類型的消息時。訂閱該消息類型的全部client都會收到此消息。這裡消息的傳遞是多對多的。一個client可以訂閱多個 channel,也可以向多個channel發送消息。
例如,一個用戶端訂閱了“CCTV-5”頻道的消息:
:> SUBSCRIBE CCTV-
Reading messages... (press Ctrl-C to quit)
) "subscribe"
) "CCTV-5"
) (integer)
另一個用戶端在“CCTV-5”釋出了兩條消息:
:> PUBLISH CCTV- "Kobe will say good bye to NBA in 2016.4.4"
(integer)
:>PUBLISH CCTV- "Cavaliers Cleveland won the championship"
(integer)
第一個用戶端就會收到這兩條消息:
:> SUBSCRIBE CCTV-
Reading messages... (press Ctrl-C to quit)
) "subscribe"
) "CCTV-5"
) (integer)
)"message"
)"CCTV-5"
)"Kobe will say good bye to NBA in 2016.4.4"
)"message"
)"CCTV-5"
) "CavaliersCleveland won the championship"
指令示例:
PSUBSCRIBE pattern [pattern …]
訂閱一個或多個符合給定模式的頻道。每個模式以 * 作為比對符,比如 it* 比對所有以 it 開頭的頻道( it.news 、 it.blog 、 it.tweets 等等), news.* 比對所有以 news. 開頭的頻道( news.it 、 news.global.today 等等),諸如此類。
傳回值:接收到的資訊(請參見下面的代碼說明)。
// 訂閱 news.* 和 tweet.* 兩個模式
// 第 1 - 6 行是執行 psubscribe 之後的回報資訊
// 第 7 - 10 才是接收到的第一條資訊
// 第 11 - 14 是第二條
// 以此類推。。。
redis> psubscribe news.* tweet.*
Reading messages… (press Ctrl-C to quit)
1) “psubscribe” # 傳回值的類型:顯示訂閱成功
2) “news.*” # 訂閱的模式
3) (integer) 1 # 目前已訂閱的模式的數量
1) “psubscribe”
2) “tweet.*”
3) (integer) 2
1) “pmessage” # 傳回值的類型:資訊
2) “news.*” # 資訊比對的模式
3) “news.it” # 資訊本身的目标頻道
4) “Google buy Motorola” # 資訊的内容
1) “pmessage”
2) “tweet.*”
3) “tweet.huangz”
4) “hello”
1) “pmessage”
2) “tweet.*”
3) “tweet.joe”
4) “@huangz morning”
1) “pmessage”
2) “news.*”
3) “news.life”
4) “An apple a day, keep doctors away”
3、Transaction事務管理
4、Script(腳本)管理指令
指令示例:
EVALSHA sha1 numkeys key [key …] arg [arg …]
根據給定的 sha1 校驗碼,對緩存在伺服器中的腳本進行求值。将腳本緩存到伺服器的操作可以通過 SCRIPT LOAD 指令進行。這個指令的其他地方,比如參數的傳入方式,都和 EVAL 指令一樣。
redis> SCRIPT LOAD “return ‘hello moto’”
“232fd51614574cf0867b83d384a5e898cfd24e5a”
redis> EVALSHA “232fd51614574cf0867b83d384a5e898cfd24e5a” 0
“hello moto”
5、connection連接配接管理指令
預設情況下,Redis沒有密碼要求,意味着無需通過密碼驗證就可以連接配接到Redis 服務。
可以通過更改配置檔案中的“requirepass”配置項,來設定密碼。
[email protected]:~$ Redis-cli
:> CONFIG get requirepass
) "requirepass"
) "" --預設沒有密碼
:> CONFIG set requirepass"chenlongfei" --設定密碼
OK
:> QUIT --退出重新連接配接
[email protected]:~$ Redis-cli
:> SET name "clf"
(error) NOAUTH Authentication required. –提示沒權限
:> AUTH chenlongfei --驗證密碼
OK
:> SET name "clf" --之後才能進行操作
OK
:> GET name
"clf"
指令示例:
AUTH password
通過設定配置檔案中 requirepass 項的值(使用指令 CONFIG SET requirepass password ),可以使用密碼來保護 Redis 伺服器。
如果開啟了密碼保護的話,在每次連接配接 Redis 伺服器之後,就要使用 AUTH 指令解鎖,解鎖之後才能使用其他 Redis 指令。
如果 AUTH 指令給定的密碼 password 和配置檔案中的密碼相符的話,伺服器會傳回 OK 并開始接受指令輸入。
另一方面,假如密碼不比對的話,伺服器将傳回一個錯誤,并要求用戶端需重新輸入密碼。
因為 Redis 高性能的特點,在很短時間内嘗試猜測非常多個密碼是有可能的,是以請確定使用的密碼足夠複雜和足夠長,以免遭受密碼猜測攻擊。
傳回值:密碼比對時傳回 OK ,否則傳回一個錯誤。
// 設定密碼
redis> CONFIG SET requirepass secret_password # 将密碼設定為 secret_password
OK
redis> QUIT # 退出再連接配接,讓新密碼對用戶端生效
[[email protected]]$ redis
redis> PING # 未驗證密碼,操作被拒絕
(error) ERR operation not permitted
redis> AUTH wrong_password_testing # 嘗試輸入錯誤的密碼
(error) ERR invalid password
redis> AUTH secret_password # 輸入正确的密碼
OK
redis> PING # 密碼驗證成功,可以正常操作指令了
PONG
//清空密碼
redis> CONFIG SET requirepass “” # 通過将密碼設為空字元來清空密碼
OK
redis> QUIT
$ redis # 重新進入用戶端
redis> PING # 執行指令不再需要密碼,清空密碼操作成功
PONG
6、Server(伺服器)管理指令
Redis定義了一組與伺服器相關的指令,用于查詢伺服器資訊,如目前時間、用戶端連接配接數量,以及修改配置檔案、手動觸發某些操作等。
指令示例:
SAVE
SAVE 指令執行一個同步儲存操作,将目前 Redis 執行個體的所有資料快照(snapshot)以 RDB 檔案的形式儲存到硬碟。
一般來說,在生産環境很少執行 SAVE 操作,因為它會阻塞所有用戶端,儲存資料庫的任務通常由 BGSAVE 指令異步地執行。然而,如果負責儲存資料的背景子程序不幸出現問題時, SAVE 可以作為儲存資料的最後手段來使用。
傳回值:儲存成功時傳回 OK 。
redis> SAVE
OK