天天看點

Redis:二、資料類型

本文介紹下redis支援的各種資料類型包括string,list ,set ,sorted set 和hash

Technorati 标簽: 

redis cache list 存儲

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可讀性好。

下面介紹下key相關的指令

exits 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,此方法不會失敗。更加慎用

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多很多啊。如下:

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。下面是個實驗,首先清空目前資料庫,然後

設定k1,k2.擷取時k3對應傳回nil

redis> flushdb
OK
redis> dbsize
(integer) 0
redis> set k1 a
OK
redis> set k2 b
OK
redis> mget k1 k2 k3
1. "a"
2. "b"
3. (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一個負值來實作同樣效果,反之一樣。

substr 傳回截取過的key的字元串值,注意并不修改key的值。下标是從0開始的.(redis在2.0版本以後不包括2.0,使用的方法是getrange 參數相同。)

append key value  給指定key的字元串值追加value,傳回新字元串值的長度。下面給個例子

redis> set k hello
OK
redis> append k ,world
(integer) 11
redis> get k
"hello,world"
substr key start end
redis> substr k 0 8
"hello,wor"
redis> get k
"hello,world"      

3. list

redis的list類型其實就是一個每個子元素都是string類型的雙向連結清單。是以[lr]push和[lr]pop指令的算法時間複雜度都是O(1)

另外list會記錄連結清單的長度。是以llen操作也是O(1).連結清單的最大長度是(2的32次方-1)。我們可以通過push,pop操作從連結清單的頭部

或者尾部添加删除元素。這使得list既可以用作棧,也可以用作隊列。有意思的是list的pop操作還有阻塞版本的。當我們[lr]pop一個

list對象是,如果list是空,或者不存在,會立即傳回nil。但是阻塞版本的b[lr]pop可以則可以阻塞,當然可以加逾時時間,逾時後也會傳回nil

。為什麼要阻塞版本的pop呢,主要是為了避免輪詢。舉個簡單的例子如果我們用list來實作一個工作隊列。執行任務的thread可以調用阻塞版本的pop去

擷取任務這樣就可以避免輪詢去檢查是否有任務存在。當任務來時候工作線程可以立即傳回,也可以避免輪詢帶來的延遲。ok下面介紹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

4. set

redis的set是string類型的無序集合。set元素最大可以包含(2的32次方-1)個元素。set的是通過hash table實作的,是以添加,删除,查找的複雜度都是O(1)。hash table會随着添加或者删除自動的調整大小。需要注意的是調整hash table大小時候需要同步(擷取寫鎖)會阻塞其他讀寫操作。可能不久後就會改用跳表(skip list)來實作

跳表已經在sorted set中使用了。關于set集合類型除了基本的添加删除操作,其他有用的操作還包含集合的取并集(union),交集(intersection),

差集(difference)。通過這些操作可以很容易的實作sns中的好友推薦和blog的tag功能。下面詳細介紹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的所有元素,結果是無序的

5 sorted set

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

當元素被添加到集合中時,一個元素到score的映射被添加到hash table中,是以給定一個元素擷取score的開銷是O(1),另一個score到元素的映射被添加到skip list

并按照score排序,是以就可以有序的擷取集合中的元素。添加,删除操作開銷都是O(log(N))和skip list的開銷一緻,redis的skip list實作用的是雙向連結清單,這樣就

可以逆序從尾部取元素。sorted set最經常的使用方式應該是作為索引來使用.我們可以把要排序的字段作為score存儲,對象的id當元素存儲。下面是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在給定區間的元素

6. hash 

redis 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實作. 這個限制可以在配置檔案中指定

redis> set test dsf
OK
redis> set tast dsaf
OK
redis> set tist adff
OK
redis> keys t*
1. "tist"
2. "tast"
3. "test"
redis> keys t[ia]st
1. "tist"
2. "tast"
redis> keys t?st
1. "tist"
2. "tast"
3. "test"      

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

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

本文介紹下redis支援的各種資料類型包括string,list ,set ,sorted set 和hash

Technorati 标簽: 

​​redis cache list 存儲​​

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可讀性好。

下面介紹下key相關的指令

exits 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,此方法不會失敗。更加慎用

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多很多啊。如下:

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。下面是個實驗,首先清空目前資料庫,然後

設定k1,k2.擷取時k3對應傳回nil

redis> flushdb
OK
redis> dbsize
(integer) 0
redis> set k1 a
OK
redis> set k2 b
OK
redis> mget k1 k2 k3
1. "a"
2. "b"
3. (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一個負值來實作同樣效果,反之一樣。

substr 傳回截取過的key的字元串值,注意并不修改key的值。下标是從0開始的.(redis在2.0版本以後不包括2.0,使用的方法是getrange 參數相同。)

append key value  給指定key的字元串值追加value,傳回新字元串值的長度。下面給個例子

redis> set k hello
OK
redis> append k ,world
(integer) 11
redis> get k
"hello,world"
substr key start end
redis> substr k 0 8
"hello,wor"
redis> get k
"hello,world"      

3. list

redis的list類型其實就是一個每個子元素都是string類型的雙向連結清單。是以[lr]push和[lr]pop指令的算法時間複雜度都是O(1)

另外list會記錄連結清單的長度。是以llen操作也是O(1).連結清單的最大長度是(2的32次方-1)。我們可以通過push,pop操作從連結清單的頭部

或者尾部添加删除元素。這使得list既可以用作棧,也可以用作隊列。有意思的是list的pop操作還有阻塞版本的。當我們[lr]pop一個

list對象是,如果list是空,或者不存在,會立即傳回nil。但是阻塞版本的b[lr]pop可以則可以阻塞,當然可以加逾時時間,逾時後也會傳回nil

。為什麼要阻塞版本的pop呢,主要是為了避免輪詢。舉個簡單的例子如果我們用list來實作一個工作隊列。執行任務的thread可以調用阻塞版本的pop去

擷取任務這樣就可以避免輪詢去檢查是否有任務存在。當任務來時候工作線程可以立即傳回,也可以避免輪詢帶來的延遲。ok下面介紹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

4. set

redis的set是string類型的無序集合。set元素最大可以包含(2的32次方-1)個元素。set的是通過hash table實作的,是以添加,删除,查找的複雜度都是O(1)。hash table會随着添加或者删除自動的調整大小。需要注意的是調整hash table大小時候需要同步(擷取寫鎖)會阻塞其他讀寫操作。可能不久後就會改用跳表(skip list)來實作

跳表已經在sorted set中使用了。關于set集合類型除了基本的添加删除操作,其他有用的操作還包含集合的取并集(union),交集(intersection),

差集(difference)。通過這些操作可以很容易的實作sns中的好友推薦和blog的tag功能。下面詳細介紹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的所有元素,結果是無序的

5 sorted set

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

當元素被添加到集合中時,一個元素到score的映射被添加到hash table中,是以給定一個元素擷取score的開銷是O(1),另一個score到元素的映射被添加到skip list

并按照score排序,是以就可以有序的擷取集合中的元素。添加,删除操作開銷都是O(log(N))和skip list的開銷一緻,redis的skip list實作用的是雙向連結清單,這樣就

可以逆序從尾部取元素。sorted set最經常的使用方式應該是作為索引來使用.我們可以把要排序的字段作為score存儲,對象的id當元素存儲。下面是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在給定區間的元素

6. hash 

redis 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實作. 這個限制可以在配置檔案中指定

redis> set test dsf
OK
redis> set tast dsaf
OK
redis> set tist adff
OK
redis> keys t*
1. "tist"
2. "tast"
3. "test"
redis> keys t[ia]st
1. "tist"
2. "tast"
redis> keys t?st
1. "tist"
2. "tast"
3. "test"