1. 程式人生 > >Redis中Key相關的常用指令詳解

Redis中Key相關的常用指令詳解

redis key vaule

Redis是一個開源的使用ANSI C 語言編寫、支持網絡、同memcache相比在Redis下可以實現基於內存亦可持久化的日誌型、Key-Value 類型的NoSQL數據庫,且在Redis中Key的類型也更為豐富。所以較為廣泛的在生產環境中使用,在這裏就說一說Redis中Key相關的常用指令。

首先,先要說明下在Redis下Key,Redis的key是字符串類型,但是key 中不能包括邊界字符(“”),由於key 不是binary safe的字符串,所以像"my key"和"mykey\n"這樣包含空格和換行的key 是不允許的,所以建議在使用的時候不要使你的Key的名字太過復雜。在redis下的Vaule提供五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及sorted set(有序集合)。

其中Redis的系統管理指令如下:

PING 如果redis服務器存活缺省返回PONG。
DBSIZE 返回當前數據庫 key的數量。
INFO 返回當前 redis 服務器狀態和一些統計信息。
MONITOR 實時監聽並返回redis服務器接收到的所有請求信息。
SHUTDOWN 把數據同步保存到磁盤上,並關閉redis服務。
CONFIG GET parameter 獲取一個 redis配置參數信息。(個別參數可能無法獲取)
CONFIG SET parameter value 設置一個 redis配置參數信息。(個別參數可能無法獲取)
CONFIG RESETSTAT 重置 INFO 命令的統計信息。(重置包括:Keyspace 命中數、Keyspace 錯誤數、處理命令數,接收連接數、過期key 數)
DEBUG OBJECT key 獲取一個 key 的調試信息。
DEBUG SEGFAULT 制造一次 redis 服務崩潰。
######以下為危險操作,在使用時都不會失敗,請謹慎使用##########
FLUSHDB 刪除當前數據庫中所有 key。
FLUSHALL 刪除全部數據庫中所有 key。

Redis的常用對Key操作指令如下:

exits key 檢測指定key 是否存在,返回 1表示存在,0 不存在
del key1 key2 ...... keyN 刪除給定 key,返回刪除 key 的數目,0表示給定 key都不存在
type key 返回給定 key值的類型。返回 none 表示 key不存在,string字符類型,list 鏈表類型set 無序集合類型......
keys pattern 返回匹配指定模式的所有 key
randomkey 返回從當前數據庫中隨機選擇的一個key,如果當前數據庫是空的,返回空串
rename oldkey newkey 重命名一個key,如果newkey存在,將會被覆蓋,返回 1 表示成功,0失敗。可能是oldkey 不存在或者和newkey相同。
renamenx oldkey newkey 同上,但是如果 newkey存在返回失敗。
expire key seconds 為key指定過期時間,單位是秒。返回1成功,0表示key已經設置過過期時間或者不存在。
ttl key 返回設置過過期時間key的剩余過期秒數。-1表示key不存在或者未設置過期時間。
select db-index 通過索引選擇數據庫,默認連接的數據庫是0,默認數據庫數是16個。返回1表示成功,0失敗。
move key db-index 將key從當前數據庫移動到指定數據庫。返回1表示成功。0表示 key不存在或者已經在指定數據庫中。

因為Redis有5種不同類型的Key,所以在具體不同類型的Key使用是不一樣的,以下就一一介紹:

一、string 類型

string是最基本的類型,而且string 類型是二進制安全的。意思是redis 的string 可以包含任何數據。比如jpg 圖片或者序列化的對象。從內部實現來看其實string 可以看作byte數組,最大上限是1G 字節。

string 類型數據操作指令:

set key value 設置key對應string 類型的值,返回1表示成功,0失敗。
setnx key value 如果 key不存在,設置key對應string類型的值。如果key已經存在,返回0。
get key 獲取 key對應的 string值,如果 key不存在返回nil
getset key value 先獲取key的值,再設置key的值。如果 key不存在返回nil。
mget key1 key2 ...... keyN 一次獲取多個key的值,如果對應key不存在,則對應返回nil。
mset key1 value1 ...... keyN valueN 一次設置多個key的值,成功返回1表示所有的值都設置了,失敗返回0 表示沒有任何值被設置。
msetnx key1 value1 ...... keyN valueN 一次設置多個key的值,但是不會覆蓋已經存在的 key
incr key 對 key 的值做++操作,並返回新的值。註意 incr一個不是 int 的 value 會返回錯誤,incr 一個不存在的key,則設置key 值為1。
decr key 對 key的值做--操作,decr一個不存在key,則設置 key值為-1。
incrby key integer 對 key 加上指定值 ,key 不存在時候會設置 key,並認為原來的value是0。
decrby key integer 對key減去指定值。decrby完全是為了可讀性,我們完全可以通過incrby一個負值來實現同樣效果,反之一樣。

二、hash 類型

hash 是一個string 類型的field 和value 的映射表。添加,刪除操作都是O(1)(平均)。hash 特別適合用於存儲對象。相對於將對象的每個字段存成單個string 類型。將一個對象存儲在hash類型中會占用更少的內存,並且可以更方便的存取整個對象。省內存的原因是新建一個hash 對象時開始是用zipmap(又稱為small hash)來存儲的。這個zipmap 其實並不是hash table,但是zipmap 相比正常的hash 實現可以節省不少hash 本身需要的一些元數據存儲開銷。盡管zipmap 的添加,刪除,查找都是O(n),但是由於一般對象的field數量都不太多。所以使用zipmap 也是很快的,也就是說添加刪除平均還是O(1)。如果field或者value 的大小超出一定限制後,redis 會在內部自動將zipmap 替換成正常的hash 實現,這個限制可以在配置文件中指定。如下:

hash-max-zipmap-entries 64 #配置字段最多64 個
hash-max-zipmap-value 512 #配置value 最大為512 字節

hash 類型數據操作指令:

hset key field value 設置 hash field為指定值,如果 key不存在,則創建
hget key field 獲取指定的 hash field。
hmget key filed1....fieldN 獲取全部指定的 hash filed。
hmset key filed1 value1 ...... filedN valueN同時設置hash的多個field。
hincrby key field integer 將指定的 hash filed 加上指定值。成功返回 hash filed 變更後的值。
hexists key field 檢測指定 field是否存在。
hdel key field 刪除指定的 hash field。
hlen key 返回指定 hash的 field 數量。
hkeys key 返回 hash 的所有 field。
hvals key 返回 hash的所有 value。
hgetall 返回 hash的所有 filed和 value

三、list 類型

list 是一個鏈表結構,可以理解為一個每個子元素都是string 類型的雙向鏈表。主要功能是push、pop、獲取一個範圍的所有值等。操作中key理解為鏈表的名字。

List 類型數據操作指令:

lpush key string 在key對應list的頭部添加字符串元素,返回1表示成功,0表示key存在且不是list 類型。
rpush key string 在 key對應 list的尾部添加字符串元素。
llen key 返回key對應list的長度,如果key不存在返回0,如果key對應類型不是list返回錯誤。
lrange key start end 返回指定區間內的元素,下標從0開始,負值表示從後面計算,-1表示倒數第一個元素,key不存在返回空列表。
ltrim key start end 截取list指定區間內元素,成功返回1,key不存在返回錯誤。
lset key index value 設置list中指定下標的元素值,成功返回1,key或者下標不存在返回錯誤。
lrem key count value從 List 的頭部(count正數)或尾部(count負數)刪除一定數量(count)匹配value的元素,返回刪除的元素數量。count為0時候刪除全部。
lpop key 從list的頭部刪除並返回刪除元素。如果key對應list不存在或者是空返回nil,如果key 對應值不是list返回錯誤。
rpop key 從list的尾部刪除並返回刪除元素。
blpop key1 ...... keyN timeout 從左到右掃描,返回對第一個非空list進行lpop操作並返回,比如blpop list1 list2 list3 0 ,如果list不存在list2,list3 都是非空則對list2 做lpop並返回從list2 中刪除的元素。如果所有的list 都是空或不存在,則會阻塞timeout秒,timeout為0 表示一直阻塞。當阻塞時,如果有client 對key1...keyN 中的任意key進行push 操作,則第一在這個key 上被阻塞的client 會立即返回。如果超時發生,則返回nil。有點像unix 的select 或者poll。
brpop 同blpop,一個是從頭部刪除一個是從尾部刪除。

四、set 類型

set是無序集合,最大可以包含(2 的32 次方-1)個元素。set的是通過hash table 實現的,所以添加,刪除,查找的復雜度都是O(1)。hash table會隨著添加或者刪除自動的調整大小。需要註意的是調整hash table 大小時候需要同步(獲取寫鎖)會阻塞其他讀寫操作。可能不久後就會改用跳表(skip list)來實現。跳表已經在sorted sets 中使用了。關於set 集合類型除了基本的添加刪除操作,其它有用的操作還包含集合的取並集(union),交集(intersection),差集(difference)。

set 類型數據操作指令:

sadd key member 添加一個string元素到key對應set集合中,成功返回1,如果元素以及在集合中則返回0,key 對應的set 不存在則返回錯誤。
srem key member 從key對應set中移除指定元素,成功返回1,如果member在集合中不存在或者key 不存在返回0,如果key 對應的不是set 類型的值返回錯誤。
spop key 刪除並返回key對應set中隨機的一個元素,如果set是空或者 key不存在返回nil。
srandmember key 同spop,隨機取set中的一個元素,但是不刪除元素。
smove srckey dstkey member 從srckey對應set中移除member並添加到dstkey對應set中,整個操作是原子的。成功返回1,如果member 在srckey 中不存在返回0,如果key 不是set類型返回錯誤。
scard key 返回 set的元素個數,如果set是空或者 key不存在返回 0。
sismember key member 判斷member是否在set中,存在返回1,0表示不存在或者key不存在。
sinter key1 key2 …… keyN 返回所有給定key的交集。
sinterstore dstkey key1 ....... keyN 返回所有給定key的交集,並保存交集存到dstkey下。
sunion key1 key2 ...... keyN 返回所有給定key的並集。
sunionstore dstkey key1 ...... keyN 返回所有給定key的並集,並保存並集到dstkey下。
sdiff key1 key2 ...... keyN 返回所有給定key的差集。
sdiffstore dstkey key1 ...... keyN 返回所有給定key的差集,並保存差集到dstkey下。
smembers key 返回key對應set 的所有元素,結果是無序的。

五、sorted set 類型

sorted set是有序集合,它在set的基礎上增加了一個順序屬性,這一屬性在添加修改元素的時候可以指定,每次指定後,會自動重新按新的值調整順序。可以理解了有兩列的mysql表,一列存value,一列存順序。操作中key 理解為sorted set 的名字。

Sorted Set 類型數據操作指令:

add key score member 添加元素到集合,元素在集合中存在則更新對應score。
zrem key member 刪除指定元素,1表示成功,如果元素不存在返回0。
zincrby key incr member 增加對應member的score值,然後移動元素並保持skip list保持有序。返回更新後的score值。
zrank key member 返回指定元素在集合中的排名(下標),集合中元素是按score從小到大排序的。
zrevrank key member 同上,但是集合中元素是按 score從大到小排序。
zrange key start end 類似 lrange操作從集合中去指定區間的元素。返回的是有序結果
zrevrange key start end 同上,返回結果是按score逆序的。
zrangebyscore key min max 返回集合中score在給定區間的元素。
zcount key min max 返回集合中score在給定區間的數量。
zcard key 返回集合中元素個數。
zscore key element 返回給定元素對應的score。
zremrangebyrank key min max 刪除集合中排名在給定區間的元素。
zremrangebyscore key min max 刪除集合中score在給定區間的元素

為此Redis的Key相關的指令就介紹完了。

本文出自 “Jim的技術隨筆” 博客,謝絕轉載!

Redis中Key相關的常用指令詳解