1. 程式人生 > >redis型別講解[string, list, set, sorted set, hash]

redis型別講解[string, list, set, sorted set, hash]

Redis SET 命令 | 菜鳥教程  http://www.runoob.com/redis/strings-set.html

redis型別[string 、list 、 set 、sorted set 、hash] - 【設計改變世界】 果然如此的專欄 - 部落格頻道 - CSDN.NET

  http://blog.csdn.net/guochunyang/article/details/47317851

  1. Keys 
    redis本質上一個key-value db,所以我們首先來看看他的key. 
    首先key也是字串型別,但是key中不能包括邊界字元;由於key不是binary safe的字串,所以像”my key”和”mykey\n”這樣包含空格和換行的key是不允許的 
    注: 
    順便說一下在redis內部並不限制使用binary字元,這是redis協議限制的。”\r\n”在協議格式中會作為特殊字元。 
    redis 1.2以後的協議中部分命令已經開始使用新的協議格式了(比如MSET)。總之目前還是把包含邊界字元當成非法的key吧,免得被bug糾纏。 
    另外關於key的一個格式約定介紹下,object-type:id:field。比如user:1000:password,blog:xxidxx:title 
    還有key的長度最好不要太長。道理很明顯佔記憶體啊,而且查詢時候相對短key也更慢。 
    不過也推薦過短的key,比如u:1000:pwd,這樣的。顯然沒上面的user:1000:password可讀性好。

  2. String 型別 
    string是redis最基本的型別,而且string型別是二進位制安全的。 
    意思是redis的string可以包含任何資料。比如jpg圖片或者序列化的物件。從內部實現來看其實string可以看作byte陣列,最大上限是1G位元組。 
    下面是string型別的定義。 
    struct sdshdr { 
    long len; 
    long free; 
    char buf[]; 
    }; 
    buf是個char陣列用於存貯實際的字串內容。其實char和c#中的byte是等價的,都是一個位元組 
    len是buf陣列的長度,free是陣列中剩餘可用位元組數。 
    由此可以理解為什麼string型別是二進位制安全的了。因為它本質上就是個byte陣列。當然可以包含任何資料了。 
    另外string型別可以被部分命令按int處理.比如incr等命令, 
    redis的其他型別像list,set,sorted set ,hash它們包含的元素與都只能是string型別。 
    如果只用string型別,redis就可以被看作加上持久化特性的memcached.當然redis對string型別的操作比memcached多很多啊。

  3. List 型別 
    redis的list型別其實就是一個每個子元素都是string型別的雙向連結串列。所以[lr]push和[lr]pop命令的演算法時間複雜度都是O 
    另外list會記錄連結串列的長度。所以llen操作也是O.連結串列的最大長度是(2的32次方-1)。 
    我們可以通過push,pop操作從連結串列的頭部或者尾部新增刪除元素。這使得list既可以用作棧,也可以用作佇列。 
    有意思的是list的pop操作還有阻塞版本的。當我們[lr]pop一個list物件,如果list是空,或者不存在,會立即返回nil。但是阻塞版本的b[lr]pop可以則可以阻塞, 
    當然可以加超時時間,超時後也會返回nil。為什麼要阻塞版本的pop呢,主要是為了避免輪詢。 
    例子如果我們用list來實現一個工作佇列。執行任務的thread可以呼叫阻塞版本的pop去 
    獲取任務這樣就可以避免輪詢去檢查是否有任務存在。當任務來時候工作執行緒可以立即返回,也可以避免輪詢帶來的延遲。

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

5.Sorted Set 型別 
和set一樣sorted set也是string型別元素的集合,不同的是每個元素都會關聯一個double型別的score。sorted set的實現是skip list和hash table的混合體

當元素被新增到集合中時,一個元素到score的對映被新增到hash table中,所以給定一個元素獲取score的開銷是O, 
另一個score到元素的對映被新增到skip list並按照score排序,所以就可以有序的獲取集合中的元素。 
新增,刪除操作開銷都是O和skip list的開銷一致,redis的skip list實現用的是雙向連結串列,這樣就可以逆序從尾部取元素。 
sorted set最經常的使用方式應該是作為索引來使用.我們可以把要排序的欄位作為score儲存,物件的id當元素儲存。

6.Hash Set 型別 
redis hash是一個string型別的field和value的對映表.它的新增,刪除操作都是O.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位元組

命令: 
key相關的命令 
exists key 測試指定key是否存在,返回1表示存在,0不存在 
del key1 key2 ….keyN 刪除給定key,返回刪除key的數目,0表示給定key都不存在 
type key 返回給定key的value型別。返回 none 表示不存在key,string字元型別,list 連結串列型別 set 無序集合型別… 
keys pattern 返回匹配指定模式的所有key,下面給個例子 
randomkey 返回從當前資料庫中隨機選擇的一個key,如果當前資料庫是空的,返回空串 
rename oldkey newkey 原子的重新命名一個key,如果newkey存在,將會被覆蓋,返回1表示成功,0失敗。可能是oldkey不存在或者和newkey相同 
renamenx oldkey newkey 同上,但是如果newkey存在返回失敗 
dbsize 返回當前資料庫的key數量 
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不存在,或者已經在指定資料庫中 
flushdb 刪除當前資料庫中所有key,此方法不會失敗。慎用 
flushall 刪除所有資料庫中的所有key,此方法不會失敗。更加慎用

String相關的命令 
set key value 設定key對應的值為string型別的value,返回1表示成功,0失敗 
setnx key value 同上,如果key已經存在,返回0 。nx 是not exist的意思 
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 
incr key 對key的值做加加操作,並返回新的值。注意incr一個不是int的value會返回錯誤,incr一個不存在的key,則設定key為1 
decr key 同上,但是做的是減減操作,decr一個不存在key,則設定key為-1 
incrby key integer 同incr,加指定值 ,key不存在時候會設定key,並認為原來的value是 0 
decrby key integer 同decr,減指定值。decrby完全是為了可讀性,我們完全可以通過incrby一個負值來實現同樣效果,反之一樣。 
append key value 給指定key的字串值追加value,返回新字串值的長度。 
substr key start end 返回擷取過的key的字串值,注意並不修改key的值。

List相關的命令 
lpush key string 在key對應list的頭部新增字串元素,返回1表示成功,0表示key存在且不是list型別 
rpush key string 同上,在尾部新增 
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 從key對應list中刪除count個和value相同的元素。count為0時候刪除全部 
lpop key 從list的頭部刪除元素,並返回刪除元素。如果key對應list不存在或者是空返回nil,如果key對應值不是list返回錯誤 
rpop 同上,但是從尾部刪除 
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,一個是從頭部刪除一個是從尾部刪除 
rpoplpush srckey destkey 從srckey對應list的尾部移除元素並新增到destkey對應list的頭部,最後返回被移除的元素值,整個操作是原子的.如果srckey是空 
或者不存在返回nil

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 同sinter,但是會同時將交集存到dstkey下 
sunion key1 key2…keyN 返回所有給定key的並集 
sunionstore dstkey key1…keyN 同sunion,並同時儲存並集到dstkey下 
sdiff key1 key2…keyN 返回所有給定key的差集 
sdiffstore dstkey key1…keyN 同sdiff,並同時儲存差集到dstkey下 
smembers key 返回key對應set的所有元素,結果是無序的

Sorted Set相關的命令 
zadd 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在給定區間的元素

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 加上給定值 
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