【Redis学习】Redis管理命令总结
1、鍵管理
之前通過對五種數據類型的操作命令的學習發現,Redis在對每種數據進行處理之前,都要先指定該數據的key,然后再指定對該數據進行何種操作。
Redis中的key有點類似于Java中的變量名。對某個數據的處理都是以key作為切入點。所以Redis把key作為單獨的處理對象抽象出了一套操作命令。key可以想象成一個指向實際數據的指針,對key的操作會直接影響它所指向的數據的狀態。
127.0.0.1:6379> SET name tom OK 127.0.0.1:6379> GET name "tom" 127.0.0.1:6379> DEL name (integer) 1 127.0.0.1:6379> GET name (nil)想要查看某個數據的類型:
127.0.0.1:6379> SADD direction east west south north (integer) 4 127.0.0.1:6379> TYPE direction set 想要更改某個數據的key的名字: 127.0.0.1:6379> RENAME direction direct OK 127.0.0.1:6379> SMEMBERS direct 1) "north" 2) "west" 3) "south" 4) "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”頻道的消息:
127.0.0.1:6379> SUBSCRIBE CCTV-5 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "CCTV-5" 3) (integer) 1另一個客戶端在“CCTV-5”發布了兩條消息:
127.0.0.1:6379> PUBLISH CCTV-5 "Kobe will say good bye to NBA in 2016.4.4" (integer) 1 127.0.0.1:6379>PUBLISH CCTV-5 "Cavaliers Cleveland won the championship" (integer) 1第一個客戶端就會收到這兩條消息:
127.0.0.1:6379> SUBSCRIBE CCTV-5 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "CCTV-5" 3) (integer) 1 1)"message" 2)"CCTV-5" 3)"Kobe will say good bye to NBA in 2016.4.4" 1)"message" 2)"CCTV-5" 3) "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”配置項,來設置密碼。
winner@winnerdeMacBook-Pro:~$ Redis-cli 127.0.0.1:6379> CONFIG get requirepass 1) "requirepass" 2) "" --默認沒有密碼 127.0.0.1:6379> CONFIG set requirepass"chenlongfei" --設置密碼 OK 127.0.0.1:6379> QUIT --退出重新連接 winner@winnerdeMacBook-Pro:~$ Redis-cli 127.0.0.1:6379> SET name "clf" (error) NOAUTH Authentication required. –提示沒權限 127.0.0.1:6379> AUTH chenlongfei --驗證密碼 OK 127.0.0.1:6379> SET name "clf" --之后才能進行操作 OK 127.0.0.1:6379> 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 # 退出再連接,讓新密碼對客戶端生效
[huangz@mypad]$ 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
總結
以上是生活随笔為你收集整理的【Redis学习】Redis管理命令总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java线程】线程安全
- 下一篇: Oracle数据库三种备份方案