天天看點

【Redis學習】Redis管理指令總結

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

繼續閱讀