NoSQL(1)之 Redis的五大数据类型使用方法的详细介绍
Redis的五大數(shù)據(jù)類型也稱五大數(shù)據(jù)對(duì)象;了解過(guò)6大數(shù)據(jù)結(jié)構(gòu),Redis并沒(méi)有直接使用這些結(jié)構(gòu)來(lái)實(shí)現(xiàn)鍵值對(duì)數(shù)據(jù)庫(kù),而是使用這些結(jié)構(gòu)構(gòu)建了一個(gè)對(duì)象系統(tǒng)redisObject;這個(gè)對(duì)象系統(tǒng)包含了五大數(shù)據(jù)對(duì)象:字符串對(duì)象(string)、列表對(duì)象(list)、哈希對(duì)象(hash)、集合(set)對(duì)象和有序集合對(duì)象(zset);而這五大對(duì)象的底層數(shù)據(jù)編碼可以用命令OBJECT ENCODING來(lái)進(jìn)行查看。
文章目錄
- 一、String數(shù)據(jù)類型(字符串對(duì)象)
- 1.1 SET/GET/APPEND/ STRLEN
- 1.2 INCR/DECR/INCRBY/DECRBY
- 1.3 GETSET
- 1.4 SETEX
- 1.5 SETNX
- 1.6 MSET/MGET/MSETNX
- 二、List數(shù)據(jù)類型(列表對(duì)象)
- 2.1 LPUSH/LPUSHX/LRANGE
- 2.2 LPOP/LLEN
- 2.3 LREM/LSET/LINDEX/LTRIM
- 2.4 LINSERT
- 2.5 RPUSH/ RPUSHX/RPOP/RPOPLPUSH
- 三、Hash數(shù)據(jù)類型(哈希對(duì)象)
- 3.1 HSET/HGET/HDEL/HEXISTS/HLEN/HSETNX
- 3.2 HINCRBY
- 3.3 HGETALL/ HKEYS/HVALS/HMGET /HMSET
- 四、Set數(shù)據(jù)類型(集合對(duì)象)
- 4.1 SADD/ SMEMBERS/ SCARD/ SISMEMBER
- 4.2 SPOP/SREM/ SRANDMEMBER/ SMOVE
- 五、Stored Set數(shù)據(jù)類型(有序集合對(duì)象)
- 5.1 ZADD/ ZCARD/ ZCOUNT / ZREM/ ZINCRBY/ ZSCORE/ ZRANGE/ ZRANK
- 5.2 ZRANGEBYSCORE/ ZREMRANGEBYRANK/ ZREMRANGEBYSCORE
- 5.3 ZREVRANGE/ ZREVRANGEBYSCORE/ ZREVRANK
- 總結(jié):
- 1 . string類型
- 2 . list列表類型
- 3 . 哈希(hash)
- 4 . 集合(set)
- 5 . 有序集合對(duì)象(zset)
一、String數(shù)據(jù)類型(字符串對(duì)象)
概述:String是 redis 最基本的類型,最大能存儲(chǔ) 512MB的數(shù)據(jù),String類型是二進(jìn)制安全的,即可以存儲(chǔ)任何數(shù)據(jù)、比如數(shù)字、圖片、序列化對(duì)象等.
1.1 SET/GET/APPEND/ STRLEN
APPEND key value追加鍵值,并返回追加后的長(zhǎng)度(若鍵不存在,則相當(dāng)于創(chuàng)建)
redis-cli
redis 127.0.0.1:6379> exists mykey #判斷該鍵是否存在,存在返回1,否則返回0。
(integer) 0
redis 127.0.0.1:6379> append mykey “hello” #該鍵并不存在,因此append命令返回當(dāng)前Value的長(zhǎng)度。
(integer) 5
redis 127.0.0.1:6379> append mykey " world" #該鍵已經(jīng)存在,因此返回追加后Value的總長(zhǎng)度。
(integer) 11
redis 127.0.0.1:6379> get mykey #通過(guò)get命令獲取該鍵,以判斷append的結(jié)果。
“hello world”
redis 127.0.0.1:6379> set mykey “this is a test!” #通過(guò)set命令為鍵設(shè)置新值,并覆蓋原有值。
OK
redis 127.0.0.1:6379> get mykey
“this is a test!”
redis 127.0.0.1:6379> strlen mykey #獲取指定Key的字符長(zhǎng)度。
(integer) 14
1.2 INCR/DECR/INCRBY/DECRBY
INCR key:key值遞增加1(key值必須為整數(shù))
DECR key:key值遞增減1(key值必須為整數(shù))
redis 127.0.0.1:6379> set mykey 20 #設(shè)置Key的值為20
OK
redis 127.0.0.1:6379> incr mykey #該Key的值遞增1
(integer) 21
redis 127.0.0.1:6379> decr mykey #該Key的值遞減1
(integer) 20
redis 127.0.0.1:6379> del mykey #刪除已有鍵。返回1說(shuō)明刪除成功
(integer) 1
redis 127.0.0.1:6379> decr mykey #對(duì)空值執(zhí)行遞減操作,其原值被設(shè)定為0,遞減后的值為-1
(integer) -1
redis 127.0.0.1:6379> del mykey
(integer) 1
redis 127.0.0.1:6379> incr mykey #對(duì)空值執(zhí)行遞增操作,其原值被設(shè)定為0,遞增后的值為1
(integer) 1
redis 127 .0.0.1:6379> set mykey test #將該鍵的Value設(shè)置為不能轉(zhuǎn)換為整型的普通字符串。
OK
redis 127.0.0.1:6379> incr mykey
(error) ERR value is not an integer or out of range
redis 127.0.0.1:6379> set mykey 100
OK
redis 127.0.0.1:6379> decrby mykey 10 #減少指定的整數(shù)
(integer) 90
redis 127.0.0.1:6379> incrby mykey 20 #增加指定的整數(shù)
(integer) 110
1.3 GETSET
GETSET key value:獲取key值并返回,同時(shí)給key設(shè)置新值。
redis 127.0.0.1:6379> incr mytest #將計(jì)數(shù)器的值原子性的遞增1
(integer) 1
redis 127.0.0.1:6379> getset mytest 0 #在獲取計(jì)數(shù)器原有值的同時(shí),并將其設(shè)置為新值,這兩個(gè)操作原子性的同時(shí)完成。
redis 127.0.0.1:6379> get mytest #查看設(shè)置后的結(jié)果。
“0”
1.4 SETEX
SETEX key seconds value:設(shè)置指定key的過(guò)期時(shí)間為seconds。
redis 127.0.0.1:6379> setex mytest 20 “test setex” #設(shè)置指定Key的過(guò)期時(shí)間為20秒。
redis 127.0.0.1:6379> ttl mytest #通過(guò)tt1命令查看指定Key的剩余存活時(shí)間(秒數(shù)),-2代表過(guò)期,-1表示永不過(guò)期。
(integer) 10
redis 127.0.0.1:6379> get mytest #在該鍵的存活期內(nèi)我們?nèi)匀豢梢垣@取到它的Value。
“hello”
redis 127.0.0.1:6379> ttl mytest #該ttl命令的返回值顯示,該Key已經(jīng)過(guò)期。
(integer) -2
redis 127.0.0.1:6379> get mytest #獲取已過(guò)期的Key將返回nil
(nil)
1.5 SETNX
SETNX key value:不存在鍵的話執(zhí)行set操作,存在的話不執(zhí)行
redis 127 .0.0.1:6379> del mytest #刪除該鍵,以便于下面的測(cè)試驗(yàn)證。
(integer) 1
redis 127.0.0.1:6379> setnx mytest “hello” #該鍵并不存在,因此setnx命令執(zhí)行成功。
(integer) 1
redis 127.0.0.1:6379> setnx mytest “world” #該鍵已經(jīng)存在,因此本次設(shè)置沒(méi)有產(chǎn)生任何效果。
(integer) 0
redis 127 .0.0.1:6379> get mytest #從結(jié)果可以看出,返回的值仍為第一次設(shè)置的值。
“hello”
1.6 MSET/MGET/MSETNX
MSET key value [ key value …] :批量設(shè)置鍵-值對(duì)
MGET key [ key …] :批量獲取鍵值對(duì)
MSETNX key value [ key value …] :批量設(shè)置鍵值對(duì),都不存在就執(zhí)行并返回1,只要有一個(gè)存在就不執(zhí)行并返回0
redis 127.0.0.1:6379> mset key1 “hello” key2 “world” #批量設(shè)置了key1和key2兩個(gè)鍵。
redis 127.0.0.1:6379> mget key1 key2 #批量獲取了key1和key2兩個(gè)鍵的值。
redis 127.0.0.1:6379> msetnx key3 “zhang” key4 “san” #批量設(shè)置了key3和key4兩個(gè)鍵,因?yàn)橹八麄儾⒉淮嬖?#xff0c;所以msetnx命令執(zhí)行成功并返回1。
(integer) 1
redis 127.0.0.1:6379> mget key3 key4
redis 127.0.0.1:6379> msetnx key3 “hello” key5 “world” #批量設(shè)置了key3和key5兩個(gè)鍵,但是key3已經(jīng)存在,所以msetnx命令執(zhí)行失敗并返回0。
(integer) 0
redis 127.0.0.1:6379> mget key3 key5 #批量獲取key3和key5,由于key5沒(méi)有設(shè)置成功,所以返回nil
二、List數(shù)據(jù)類型(列表對(duì)象)
概述:列表的元素類型為string,按照插入順序排序,在列表的頭部或尾部添加元素
2.1 LPUSH/LPUSHX/LRANGE
LPUSH key value [ value … ] 在頭部(左側(cè)依次插入列表元素 LPUSH key)
value:鍵必須存在才能執(zhí)行,在頭部插入元素值并返回列表元素?cái)?shù)量
LRANGE key start stop :取從位置索引start到位置索引stop的所有元素(索引是從0開(kāi)始)
redis 127.0.0.1:6379> del mytest
(integer) 1
redis 127.0.0.1:6379> lpush mytest a b c d
#mytest鍵并不存在,該命令會(huì)創(chuàng)建該鍵及與其關(guān)聯(lián)的List,之后在將參數(shù)中的values從左到右依次插入。
(integer) 4
redis 127.0.0.1:6379> lrange mytest 0 2 #取從位置0開(kāi)始到位置2結(jié)束的3個(gè)元素。
redis 127.0.0.1:6379> lrange mytest 0 -1 #取鏈表中的全部元素,其中0表示第一個(gè)元素,-1表示最后一個(gè)元素。
redis 127.0.0.1:6379> lpushx mytest2 e #mytest2鍵此時(shí)并不存在,因此lpushx命令將不會(huì)進(jìn)行任何操作,其返回值為0。
(integer) 0
redis 127.0.0.1:6379> lrange mytest2 0 -1 #可以看到mytest2沒(méi)有關(guān)聯(lián)任何List Value。
(empty list or set)
redis 127.0.0.1:6379> lpushx mytest e #mytest鍵此時(shí)已經(jīng)存在,所以lpushx命令插入成功,并返回鏈表中當(dāng)前元素的數(shù)量。
(integer) 5
redis 127.0.0.1:6379> lrange mytest 0 0 #獲取該鍵的List Value的頭部元素。
2.2 LPOP/LLEN
LPOP key :移除并返回鏈表中的第一個(gè)元素,從右往左的第一個(gè)。
redis 127.0.0.1:6379> del mytest
(integer) 1
redis 127.0.0.1:6379> lpush mytest a b c d
(integer) 4
redis 127.0.0.1:6379> lpop mytest #移除并返回mytest鍵的第一個(gè)元素,即從右往左第一個(gè)
“d”
redis 127.0.0.1:6379> lpop mytest
“c”
redis 127.0.0.1:6379> llen mytest #獲取表中元素?cái)?shù)量,在執(zhí)行l(wèi)pop命令兩次后,鏈表頭部的兩個(gè)元素已經(jīng)被彈出,此時(shí)鏈表中元素的數(shù)量是2
(integer) 2
2.3 LREM/LSET/LINDEX/LTRIM
LREM key count value:從頭部開(kāi)始刪除count個(gè)值為value的元素,并返回實(shí)際刪除數(shù)量
LSET key index value: 將位置索引為index的元素設(shè)置新值value
LINDEX key index: 獲取索引為index的元素
LTRIM key start stop: 僅保留從位置索引start到索引stop的元素
redis 127.0.0.1:6379> del mytest
(integer) 1
redis 127.0.0.1:6379> lpush mytest a b c d a c #為后面的示例準(zhǔn)備測(cè)試數(shù)據(jù)。
(integer) 6
redis 127.0.0.1:6379> lrem mytest 2 a #從頭部(left)向尾部(right)變量鏈表,刪除2個(gè)值等于a的元素,返回值為實(shí)際刪除的數(shù)量。
(integer) 2
redis127.0.0.1:6379>lrange mytest 0 -1 #看出刪除后鏈表中的全部元素。
redis 127.0.0.1:6379> lindex mytest 1 #獲取索引值為1(頭部的第二個(gè)元素)的元素值。
“d”
redis 127.0.0.1:6379> lset mytest 1 e #將索引值為1(頭部的第二個(gè)元素)的元素值設(shè)置為新值e。
OK
redis 127.0.0.1:6379> lindex mytest 1 #查看是否設(shè)置成功。
“e”
redis 127.0.0.1:6379> lindex mytest 6 #索引值6超過(guò)了鏈表中元素的數(shù)量,該命令返回nil。
(nil)
redis 127.0.0.1:6379> lset mytest 6 hh #設(shè)置的索引值6超過(guò)了鏈表中元素的數(shù)量,設(shè)置失敗,該命令返回錯(cuò)誤信息。
(error) ERR index out of range
redis 127 .0.0.1:6379> ltrim mytest 0 2 #僅保留索引值0到2之間的3個(gè)元素,注意第0個(gè)和第2個(gè)元素均被保留。
OK
redis 127.0.0.1:6379> lrange mytest 0 -1 #查看ltrim后的結(jié)果。
l) “c”
2.4 LINSERT
LINSERT key BEFORE | AFTER pivot value :在元素pivot的前面(左)或者后面(右)插入新元素value
redis 127.0.0.1:6379> del mytest #刪除該鍵便于后面的測(cè)試。
(integer) 1
redis 127.0.0.1:6379> lpush mytest a b c d e #為后面的示例準(zhǔn)備測(cè)試數(shù)據(jù)。
(integer) 1
redis 127.0.0.1:6379> linsert mytest before a a1 #在a的前面插入新元素a1。
(integer) 6。
redis 127.0.0.1:6379> lrange mytest 0 -1 #查看是否插入成功,從結(jié)果看已經(jīng)插入
redis 127.0.0.1:6379> linsert mytest after e e2 #在e的后面插入新元素e2,從返回結(jié)果看已經(jīng)插入成功。
(integer) 7
redis 127.0.0.1:6379> lindex mytest 1 #再次查看是否插入成功。
“e2”
redis 127.0.0.1:6379> linsert mytest after k a #在不存在的元素之前或之后插入新元素,linsert 命令操作失敗,并返回-1。
(integer) -1
redis 127.0.0.1:6379> linsert mykey1 after a a2 #為不存在的Key插入新元素,linsert命 令操作失敗,返回0。.
(integer) 0
2.5 RPUSH/ RPUSHX/RPOP/RPOPLPUSH
RPUSH key value [value …]在列表的尾部依次插入value
RPUSHX key value: key必須存在才可執(zhí)行,將value從尾部插入,并返回所有元素?cái)?shù)量
RPOP key: 在尾部彈出(移除) 一個(gè)元素,并返回該元素
RPOPLPUSH source dest ination:在key1的尾部彈出一個(gè)元素并返回,將它插入key2的頭部
redis 127.0.0.1:6379> del mytest #刪除該鍵,以便于后而的測(cè)試。
(integer) 1
redis 127.0.0.1:6379> rpush mytest a b c d #從鏈表的尾部插入?yún)?shù)中給出的values,插入順序是從右到左依次插入。
(integer) 4
redis 127.0.0.1:6379> lrange mytest 0 -1 #通過(guò)lrange命令可以獲悉rpush在插入多值時(shí)的插入順序。
redis 127.0.0.1:6379> rpushx mytest e #該鍵已經(jīng)存在并且包含4個(gè)元素,rpushx命令將執(zhí)行成功,并將元素e插入到鏈表的尾部。
(integer) 5
redis 127.0.0.1:6379> lindex mytest 4 #通過(guò)lindex命令可以看出之前的rpushx命令確實(shí)執(zhí)行成功,因?yàn)樗饕禐?的元素已經(jīng)是新元素了。
“e”
redis 127.0.0.1:6379> rpushx mykey2 e #由于mykey2鍵并不存在,因此rpushx命令不會(huì)插入數(shù)據(jù),其返回值為0。
(integer) 0
redis 127.0.0.1:6379> lrange mytest 0 -1 #在執(zhí)行rpoplpush命令前,先看一下 mykey中鏈表的元素有哪些,注意他們的位置關(guān)系。
“e”
127.0.0.1:6379> LRANGE mytest 0 -1
redis 127.0.0.1:6379> rpoplpush mytest mykey2 #將mytest的尾部元素e彈出,同時(shí)再插入到mykey2的頭部(原子性的完成這兩步操作)。
“d”
redis 127.0.0.1:6379> lrange mytest 0 -1 #通過(guò)lrange命令查看mytest在彈出尾部元素后的結(jié)果。
redis 127.0.0.1:6379> lrange mykey2 0 -1 #通過(guò)lrange命令查看mykey2在插入元素后的結(jié)果。
redis 127.0.0.1:6379> rpoplpush mytest mytest #將source和destination設(shè)為同一鍵,將mykey中的尾部元素移到其頭部。
“c”
redis 127.0.0.1:6379> lrange mytest 0 -1 #查看移動(dòng)結(jié)果。
三、Hash數(shù)據(jù)類型(哈希對(duì)象)
概述:hash用于存儲(chǔ)對(duì)象。可以采用這樣的命名方式:對(duì)象類別和ID構(gòu)成鍵名,使用字段表示對(duì)象的屬性,而字段值則存儲(chǔ)屬性值。
如:存儲(chǔ)ID為2的汽車對(duì)象。
如果Hash中包含很少的字段,那么該類型的數(shù)據(jù)也將僅占用很少的磁盤空間。每一個(gè)Hash可以存儲(chǔ)4294967295個(gè)鍵值對(duì)。
3.1 HSET/HGET/HDEL/HEXISTS/HLEN/HSETNX
redis 127.0.0.1:6379> del mytest #刪除該鍵,以便于后而的測(cè)試。
(integer) 1
redis 127.0.0.1:6379> hset mytest name1 “cheng” #給鍵值為mytest的鍵設(shè)置字段為name1,值為cheng。
(integer) 1
redis 127.0.0.1:6379> hget mytest name1 #獲取鍵值為mytest,字段為name1的值。
“cheng”
redis 127.0.0.1:6379> hget mytest name2 #mytest鍵中不存在name2字段,因此返回nil.
(nil)
redis 127.0.0.1:6379> hset mytest name2 “jun” #給mytest添加一個(gè)新的字段name2,其值為jun。
(integer) 1
redis 127.0.0.1:6379> hlen mytest #hlen命令獲取mytest鍵的字段數(shù)量。
(integer) 2
redis 127.0.0.1:6379> hexists mytest name1 #判斷mytest鍵中是否存在字段名為name1的字段,由于存在,返回值為1。
(integer) 1
redis 127.0.0.1:6379> hdel mytest name1 #刪除mytest鍵中字段名為name1的字段,刪除成功返回1。
(integer) 1
redis 127 .0.0.1:6379> hdel mytest name1 #再次刪除mytest鍵中字段名為name1的字段,由于上一條命令已經(jīng)將其刪除,因?yàn)闆](méi)有刪除,返回0
redis 127 .0.0.1:6379> hexists mytest name1 #判斷mytest鍵中是否存在name1字段,由于上一條命令已經(jīng)將其刪除,因?yàn)榉祷?。
(integer) 0
redis 127.0.0.1:6379> hsetnx mytest name1 cheng #通過(guò)hsetnx命令給mytest添加新字段name1,其值為cheng,因?yàn)樵撟侄我呀?jīng)被刪除,所以該命令添加成功并返回1
(integer) 1
redis 127.0.0.1:6379> hsetnx mytest name1 cheng #由于mytest的name1字段已經(jīng)通過(guò)上一條命令添加成功,因?yàn)楸緱l命令不做任何操作后返回0。
(integer) 0
3.2 HINCRBY
redis 127.0.0.1:6379> del mytest #刪除該鍵,便于后面示例的測(cè)試。
(integer) 1
redis 127.0.0.1:6379> hset mytest name 5 #準(zhǔn)備測(cè)試數(shù)據(jù),該mytest的name字段設(shè)定值5。
(integer) 1
redis 127.0.0.1:6379> hincrby mytest name 1 #hincrby命令給mytest的name字段的值加1,返回加后的結(jié)果。
(integer) 6
redis 127.0.0.1:6379> hincrby mytest name -1 #hincrby命令給mytest的name字段的值加-1,返回加后的結(jié)果。
(integer) 5
redis 127.0.0.1:6379> hincrby mytest name -10 #hincrby命令給mytest的name字段的值加-10,返回加后的結(jié)果。
(integer) -5
3.3 HGETALL/ HKEYS/HVALS/HMGET /HMSET
redis 127.0.0.1:6379> del mytest #刪除該鍵,便于后面示例測(cè)試。
(integer) 1
redis 127.0.0.1:6379> hmset mytest name1 “hello” name2 “world”
#hmset命令為該鍵mytest,一次性設(shè)置多個(gè)字段,分別是name1=“hello”,name2=“world”。
OK
redis 127.0.0.1:6379> hmget mytest name1 name2 name3
#hmget命令獲取mytest鍵的多個(gè)字段,其中name3并不存在,因?yàn)樵诜祷亟Y(jié)果中與該字段對(duì)應(yīng)的值為nil。
redis 127.0.0.1:6379> hgetall mytest #hgetall命令返回mytest鍵的所有字段及其值,從結(jié)果中可以看出,他們是逐對(duì)列出的。
redis 127.0.0.1:6379> hkeys mytest #hkeys命令僅獲取mytest鍵中所有字段的名字。
redis 127.0.0.1:6379> hvals mytest #hvals命令僅獲取mytest鍵中所有字段的值。
四、Set數(shù)據(jù)類型(集合對(duì)象)
概述:無(wú)序集合,元素類型為string類型,元素具有唯一性, 不允許存在重復(fù)的成員。多個(gè)集合類型之間可以進(jìn)行并集、交集和差集運(yùn)算
應(yīng)用范圍:
1、可以使用Redis的Set數(shù)據(jù)類型跟蹤一些唯一性數(shù)據(jù),比如訪問(wèn)某一博客的唯一IP地址信息。對(duì)于此場(chǎng)景,我們僅需在每次訪問(wèn)該博客時(shí)將訪問(wèn)者的IP存入Redis中,Set數(shù)據(jù)類型會(huì)自動(dòng)保證IP地址的唯一性。
2、充分利用Set類型的服務(wù)端聚合操作方便、高效的特性,可以用于維護(hù)數(shù)據(jù)對(duì)象之間的關(guān)聯(lián)關(guān)系。比如所有購(gòu)買某–電子設(shè)備的客戶ID被存儲(chǔ)在一個(gè)指定的Set中,而購(gòu)買另外一種電子產(chǎn)品的客戶ID被存儲(chǔ)在另外一個(gè)Set中,如果此時(shí)我們想獲取有哪些客戶同時(shí)購(gòu)買了這兩種商品時(shí),Set的intersections 命令就可以充分發(fā)揮它的方便和效率的優(yōu)勢(shì)了。
4.1 SADD/ SMEMBERS/ SCARD/ SISMEMBER
redis 127.0.0.1:6379> sadd mytest a b c #插入測(cè)試數(shù)據(jù),由于該鍵mytest之前并不存在,因此參數(shù)中的三個(gè)成員都被正常插入。
(integer) 3
redis 127.0.0.1:6379> sadd mytest a d e #由于參數(shù)中的a在mytest中已經(jīng)存在,因此本次操作僅僅插入了d和e兩個(gè)新成員。
(integer) 2
redis 127.0.0.1:6379> sismember mytest a #判斷a是否已經(jīng)存在,返回值為1表示存在。
(integer) 1
redis 127.0.0.1:6379> sismember mytest f #判斷f是否已經(jīng)存在,返回值為0表示不存在。
(integer) 0
redis 127.0.0.1:6379> smembers mytest #通過(guò)smembers命令查看插入的結(jié)果,從結(jié)果可以看出,輸出的順序和插入順序無(wú)關(guān)。
redis 127.0.0.1:6379> scard mytest #獲取Set集合中元素的數(shù)量
(integer) 5
4.2 SPOP/SREM/ SRANDMEMBER/ SMOVE
redis 127.0.0.1:6379> del mytest #刪除該鍵,便于后而的測(cè)試。
(integer) 1
redis 127.0.0.1:6379> sadd mytest a b c d #為后面的示例準(zhǔn)備測(cè)試數(shù)據(jù)。
(integer) 4
redis 127.0.0.1:6379> smembers mytest #查看Set中成員的位置。
redis 127.0.0.1: 6379> srandmember mytest #從結(jié)果可以看出,該命令確實(shí)是隨機(jī)的返回了某一成員
“c”
redis 127.0.0.1:6379> spop mytest #隨機(jī)的移除并返回Set中的某一成員。
“d”
redis 127.0.0.1:6379> smembers mytest #查看移出后set的成員信息。
redis 127.0.0.1:6379> srem mytest a d f #從Set中移出a、d和f三個(gè)成員,其中f并不存在,因此只有a和d兩個(gè)成員被移出,返回為2。
(integer) 1
redis 127.0.0.1:6379> smembers mytest #查看移出后的輸出結(jié)果。
redis 127.0.0.1:6379> sadd mytest a b #為后面的smove命令準(zhǔn)備數(shù)據(jù)。
(integer) 1
redis 127.0.0.1:6379> sadd mytest2 c d
(integer) 2
redis 127.0.0.1:6379> smove mytest mytest2 a #將a從mytest移到mytest2,從結(jié)果可以看出移動(dòng)成功。
(integer) 1
redis 127.0.0.1:6379> smove mytest mytest2 a #再次將a從mytest移到mytest2,由于此時(shí)a已經(jīng)不是mytest的成員了,因此移動(dòng)失敗并返回0。
(integer) 0
redis 127.0.0.1:6379> smembers mytest #分別查看mytest和mytest2的成員,確認(rèn)移動(dòng)是否真的成功。
redis 127.0.0.1:6379> smembers mytest2
五、Stored Set數(shù)據(jù)類型(有序集合對(duì)象)
概述:
a、有序集合,元素類型為Sting,元素具有唯一性, 不能重復(fù)。
b、每個(gè)元素都會(huì)關(guān)聯(lián)–個(gè)double類型的分?jǐn)?shù)score(表示權(quán)重),可以通過(guò)權(quán)重的大小排序,元素的score可以相同。
應(yīng)用范圍:
可以用于一個(gè)大型在線游戲的積分排行榜。每當(dāng)玩家的分?jǐn)?shù)發(fā)生變化時(shí),可以執(zhí)行ZADD命 令更新玩家的分?jǐn)?shù),此后再通過(guò)ZRANGE命令獲取積分TOP10的用戶信息。當(dāng)然我們也可以利用ZRANK命令通過(guò)username來(lái)獲取玩家的排行信息。最后我們將組合使用ZRANGE和ZRANK命令快速的獲取和某個(gè)玩家積分相近的其他用戶的信息。
Sorted-Set類型還可用于構(gòu)建索引數(shù)據(jù)。
5.1 ZADD/ ZCARD/ ZCOUNT / ZREM/ ZINCRBY/ ZSCORE/ ZRANGE/ ZRANK
redis 127.0.0.1:6379> zadd mytest 1 “one” #添加一個(gè)分?jǐn)?shù)為1的成員。
(integer) 1
redis 127.0.0.1:6379> zadd mytest 2 “two” 3 “three” #添加兩個(gè)分?jǐn)?shù)分別是2和3的兩個(gè)成員。
(integer) 2
redis 127.0.0.1:6379> zrange mytest 0 -1 WITHSCORES #0表示第一個(gè)成員,-1表示最后一個(gè)成員。WITHSCORES選 項(xiàng)表示返回的結(jié)果中包含每個(gè)成員及其分?jǐn)?shù),否則只返回成員。
redis 127.0.0.1:6379> zrank mytest one #獲取成員one在Sorted-Set中的位置索引值。0表示第一個(gè)位置。
(integer) 0
redis 127.0.0.1:6379> zrank mytest four #成員four并不存在,因此返回nil。
(nil)
redis 127.0.0.1:6379> zcard mytest #獲取mytest鍵中成員的數(shù)量。
(integer) 3
redis 127.0.0.1:6379> zcount mytest 1 2 #zcount key min max,分?jǐn)?shù)滿足表達(dá)式1 <= score <= 2的成員的數(shù)量。
(integer) 2
redis 127.0.0.1:6379> zrem mytest one two #刪除成員one和two,返回實(shí)際刪除成員的數(shù)量
(integer) 2
redis 127.0.0.1:6379> zcard mytest #查看是否刪除成功。
(integer) 1
redis 127.0.0.1:6379> zscore mytest three #獲取成員three的分?jǐn)?shù)。返回值是字符串形式。
“3”
redis 127.0.0.1:6379> zscore mytest two #由于成員two已經(jīng)被刪除,所以該命令返回nil。
(nil)
redis 127 .0.0.1:6379> zincrby mytest 2 one #成員one不存在,zincrby命令將添加該成員并假設(shè)其初始分?jǐn)?shù)為0,將成員one的分?jǐn)?shù)增加2,并返回該成員更新后的分?jǐn)?shù)。
“2”
redis 127.0.0.1:6379> zincrby mytest -1 one #將成員one的分?jǐn)?shù)增加-1,并返回該成員更新后的分?jǐn)?shù)。
“1”
redis 127.0.0.1:6379> zrange mytest 0 -1 WITHSCORES #查看在更新了成員的分?jǐn)?shù)后是否正確。
5.2 ZRANGEBYSCORE/ ZREMRANGEBYRANK/ ZREMRANGEBYSCORE
redis 127.0.0.1:6379> del mytest
(integer) 1
redis 127.0.0.1:6379> zadd mytest 1 one 2 two 3 three 4 four
(integer) 4
redis 127.0.0.1:6379> zrangebyscore mytest 1 2 #zrangebyscore key min max,獲取分?jǐn)?shù)滿足表達(dá)式1 <= score <= 2的成員。
redis 127.0.0.1:6379> zrangebyscore mytest (1 2 #獲取分?jǐn)?shù)滿足表達(dá)式1 < score <= 2的成員。
redis 127.0.0.1:6379> zrangebyscore mytest -inf +inf limit 2 3
#-inf表示第一個(gè)成員(位置索引值最低的,即0),+inf表示最后一個(gè)成員(位置索引值最高的),limit后面的參數(shù)用于限制返回成員的值,2表示從位置索引等于2的成員開(kāi)始,取后而3個(gè)成員。
redis 127.0.0.1:6379> zrangebyscore mytest 0 4 limit 2 3
redis 127.0.0.1:6379> zremrangebyscore mytest 1 2 #刪除分?jǐn)?shù)滿足表達(dá)式1 <= score <= 2的成員,并返回實(shí)際刪除的數(shù)量。
(integer) 2
redis 127.0.0.1:6379> zrange mytest 0 -1 #查看一下.上面的刪除是否成功。
redis 127.0.0.1:6379> zremrangebyrank mytest 0 1 #刪除位置索引滿足表達(dá)式0 <= rank <= 1的成員。
(integer) 2
redis 127 .0.0.1:6379> zcard mytest #查看上–條命令是否刪除成功。
(integer) 0
5.3 ZREVRANGE/ ZREVRANGEBYSCORE/ ZREVRANK
redis 127.0.0.1:6379> del mytest #為后面的示例準(zhǔn)備測(cè)試數(shù)據(jù)。
(integer) 1
redis 127.0.0.1:6379> zadd mytest 1 one 2 two 3 three 4 four
(integer) 4
redis 127.0.0.1:6379> zrevrange mytest 0 -1 WITHSCORES #以位置索引從高到低的方式獲取并返回此區(qū)間內(nèi)的成員。
redis 127.0.0.1:6379> zrevrange mytest 1 3 #由于是從高到低的排序,所以位置等于0的是four,1是three,并以此類推。
redis 127.0.0.1:6379> zrevrank mytest one #由于是從高到低的排序,所以one的位置是3。
(integer) 3
redis 127.0.0.1:6379> zrevrank mytest four #由于是從高到低的排序,所以four的位置是0。
(integer) 0
redis 127.0.0.1:6379> zrevrangebyscore mytest 3 0 # zrevrangebyscore key max min,獲取分?jǐn)?shù)滿足表達(dá)式3 >= score >= 0的成員,并以從高到底的順序輸出。
redis 127.0.0.1:6379> zrevrangebyscore mytest 4 0 limit 1 2 #zrevrangebyscore命令支持limit選項(xiàng),其含義等同于zrangebyscore中的該選項(xiàng),只是在計(jì)算位置時(shí)按照相反的順序計(jì)算和獲取。
192.168.80.10:6379> zrevrangebyscore mytest +inf -inf limit 1 3
總結(jié):
1 . string類型
寫命令通過(guò)set關(guān)鍵字實(shí)現(xiàn),set [key] [value] 讀命令通過(guò)get關(guān)鍵字實(shí)現(xiàn),get [key]2 . list列表類型
通過(guò)rpush、lpush,將一個(gè)或多個(gè)值向右或向左推入。 rpush [key] [value1] [value2],將value值推入到列表的右端。 lpush [key] [value1] [value2],將value值推入到列表的左端 lrange level 0 -1 ,查看列表key為level的所有元素3 . 哈希(hash)
hmset命令可寫入hash類型的值,hmset [key] [field1] [value1] [field2] [value2] hgetall okevin #返回所有的鍵值對(duì),奇數(shù)列為field,偶數(shù)列為value4 . 集合(set)
sadd命令將一個(gè)或多個(gè)元素添加到集合里,并返回被添加元素中原本并不存在集合中的元素?cái)?shù)量,sadd [key] [member] [member] smembers命令返回集合中包含的所有元素,smembers [key]5 . 有序集合對(duì)象(zset)
zadd用于有序集合的寫入操作,zadd [key] [score1] [member1] [score2] [member2]…… zcard命令用于返回有序集合中的成員數(shù)量,zcard [key]希望和悲傷,都是一縷光。總有一天,我們會(huì)再相遇。
總結(jié)
以上是生活随笔為你收集整理的NoSQL(1)之 Redis的五大数据类型使用方法的详细介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Squid 代理服务器应用大全
- 下一篇: NoSQL(2)之 Redis配置与优化