【Redis】—03、Redis的五種數(shù)據(jù)類(lèi)型—應(yīng)用場(chǎng)景

1、Strings字符串

主要用戶session,存儲(chǔ)字符串值。

應(yīng)用場(chǎng)景

場(chǎng)景1:session 共享

場(chǎng)景2:計(jì)數(shù)器,常規(guī)計(jì)數(shù):微博數(shù),粉絲數(shù),訂閱、禮物

key:value

----------

(1)

set name zhangsan?

(2)

MSET id 101 name zhangsan age 20 gender m

等價(jià)于以下操作:

SET id 101

set name zhangsan

set age 20

set gender m

(3)計(jì)數(shù)器

每點(diǎn)一次關(guān)注,都執(zhí)行以下命令一次

127.0.0.1:6379> incr num

顯示粉絲數(shù)量:

127.0.0.1:6379> get num

暗箱操作:

127.0.0.1:6379> INCRBY num 10000? ?##鍵key直接+10000,默認(rèn)是+1.

(integer) 10006

127.0.0.1:6379> get num

"10006"

127.0.0.1:6379> DECRBY num 10000

(integer) 6

127.0.0.1:6379> get num

"6"


詳細(xì)的例子:------------------------------------

set mykey "test"? ? ? ? ? ? ? ? 為鍵設(shè)置新值,并覆蓋原有值

getset mycounter 0? ? ? ? ? ? ? 設(shè)置值,取值同時(shí)進(jìn)行

setex mykey 10 "hello"? ? ? ? ? 設(shè)置指定 Key 的過(guò)期時(shí)間為10秒,在存活時(shí)間可以獲取value

setnx mykey "hello"? ? ? ? ? ? 若該鍵不存在,則為鍵設(shè)置新值

mset key3? "zyx"? key4 "xyz"? ? 批量設(shè)置鍵

del mykey? ? ? ? ? ? ? ? ? ? ? ? 刪除已有鍵

append mykey "hello"? ? ? ? ? ? 若該鍵并不存在,返回當(dāng)前 Value 的長(zhǎng)度

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 該鍵已經(jīng)存在,返回追加后 Value的長(zhǎng)度

incr mykey? ? ? ? ? ? ? ? ? ? ? 值增加1,若該key不存在,創(chuàng)建key,初始值設(shè)為0,增加后結(jié)果為1

decrby? mykey? 5? ? ? ? ? ? ? ? 值減少5

setrange mykey 20 dd? ? ? ? ? ? 把第21和22個(gè)字節(jié),替換為dd, 超過(guò)value長(zhǎng)度,自動(dòng)補(bǔ)0

查?

exists mykey? ? ? ? ? ? ? ? ? ? 判斷該鍵是否存在,存在返回 1,否則返回0

get mykey? ? ? ? ? ? ? ? ? ? ? 獲取Key對(duì)應(yīng)的value

strlen mykey? ? ? ? ? ? ? ? ? ? 獲取指定 Key 的字符長(zhǎng)度

ttl mykey? ? ? ? ? ? ? ? ? ? ? 查看一下指定 Key 的剩余存活時(shí)間(秒數(shù))

getrange mykey 1 20? ? ? ? ? ? 獲取第2到第20個(gè)字節(jié),若20超過(guò)value長(zhǎng)度,則截取第2個(gè)和后面所有的

mget key3 key4? ? ? ? ? ? ? ? ? 批量獲取鍵

2、hash類(lèi)型

主要用于存儲(chǔ)對(duì)象,比如存儲(chǔ)mysql數(shù)據(jù)庫(kù)的一行。

應(yīng)用場(chǎng)景:

存儲(chǔ)部分變更的數(shù)據(jù),如用戶信息等。

最接近mysql表結(jié)構(gòu)的一種類(lèi)型

主要是可以做數(shù)據(jù)庫(kù)緩存。

存數(shù)據(jù):

hmset stu? id 101 name zhangsan age 20 gender m

hmset stu1 id 102 name zhangsan1 age 21 gender f

取數(shù)據(jù):

HMGET stu id name age gender

HMGET stu1 id name age gender


mysql數(shù)據(jù)庫(kù)字符串拼接語(yǔ)句,并導(dǎo)出到文件。

select concat("hmset city_",id," id ",id," name ",name," countrycode ",countrycode," district ",district," population ",population) from city limit 10 into outfile '/tmp/hmset.txt'


redis直接導(dǎo)入外部文件直redis庫(kù)中

cat ?/tmp/hmset.txt | redis_cli -a 123456?


---------------------更多的例子

hset myhash field1 "s"? ?

若字段field1不存在,創(chuàng)建該鍵及與其關(guān)聯(lián)的Hashes, Hashes中,key為field1 ,并設(shè)value為s ,若存在會(huì)覆蓋原value

hsetnx myhash field1 s? ?

若字段field1不存在,創(chuàng)建該鍵及與其關(guān)聯(lián)的Hashes, Hashes中,key為field1 ,并設(shè)value為s, 若字段field1存在,則無(wú)效

hmset myhash field1 "hello" field2 "world? ? ? 一次性設(shè)置多個(gè)字段

hdel myhash field1? ? ? ? ? ? ? ? ? ? ? 刪除 myhash 鍵中字段名為 field1 的字段

del myhash? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 刪除鍵

改?

hincrby myhash field 1? ? ? ? ? ? ? ? ? 給field的值加1

hget myhash field1? ? ? ? ? ? ? ? ? ? ? 獲取鍵值為 myhash,字段為 field1 的值

hlen myhash? ? ? ? ? ? ? ? ? ? ? ? ? ? 獲取myhash鍵的字段數(shù)量

hexists myhash field1? ? ? ? ? ? ? ? ? 判斷 myhash 鍵中是否存在字段名為 field1 的字段

hmget myhash field1 field2 field3? ? ? 一次性獲取多個(gè)字段

hgetall myhash? ? ? ? ? ? ? ? ? ? ? ? ? 返回 myhash 鍵的所有字段及其值

hkeys myhash? ? ? ? ? ? ? ? ? ? ? ? ? ? 獲取myhash 鍵中所有字段的名字

hvals myhash? ? ? ? ? ? ? ? ? ? ? ? ? ? 獲取 myhash 鍵中所有字段的值

3、LIST(列表)

主要用于消息隊(duì)列(特點(diǎn)是先進(jìn)后出,類(lèi)型棧)

應(yīng)用場(chǎng)景

消息隊(duì)列系統(tǒng)

比如sina微博

在Redis中我們的最新微博ID使用了常駐緩存,這是一直更新的。

但是做了限制不能超過(guò)5000個(gè)ID,因此獲取ID的函數(shù)會(huì)一直詢問(wèn)Redis。

只有在start/count參數(shù)超出了這個(gè)范圍的時(shí)候,才需要去訪問(wèn)數(shù)據(jù)庫(kù)。

系統(tǒng)不會(huì)像傳統(tǒng)方式那樣“刷新”緩存,Redis實(shí)例中的信息永遠(yuǎn)是一致的。

SQL數(shù)據(jù)庫(kù)(或是硬盤(pán)上的其他類(lèi)型數(shù)據(jù)庫(kù))只是在用戶需要獲取“很遠(yuǎn)”的數(shù)據(jù)時(shí)才會(huì)被觸發(fā),

而主頁(yè)或第一個(gè)評(píng)論頁(yè)是不會(huì)麻煩到硬盤(pán)上的數(shù)據(jù)庫(kù)了。

特點(diǎn):先進(jìn)后出,類(lèi)似棧。

微信朋友圈:

127.0.0.1:6379> LPUSH wechat "today is nice day !"

127.0.0.1:6379> LPUSH wechat "today is bad day !"

127.0.0.1:6379> LPUSH wechat "today is good? day !"

127.0.0.1:6379> LPUSH wechat "today is rainy? day !"

127.0.0.1:6379> LPUSH wechat "today is friday !"

[5,4,3,2,1]

0 1 2 3 4

[e,d,c,b,a]

0 1 2 3? 4

127.0.0.1:6379> lrange wechat? 0 -1? ??##查看所有的值?

127.0.0.1:6379> lrange wechat? 0 0? ?##查看第一個(gè)值

1) "today is friday !"

127.0.0.1:6379> lrange wechat? 0 1? ##查看前兩個(gè)值

1) "today is friday !"

2) "today is rainy? day !"

127.0.0.1:6379> lrange wechat? 0 2

1) "today is friday !"

2) "today is rainy? day !"

3) "today is good? day !"

127.0.0.1:6379> lrange wechat? 0 3

127.0.0.1:6379> lrange wechat? -2 -1

1) "today is bad day !"

2) "today is nice day !"

-----------------

lpush mykey a b? ? ? ? ? ? 若key不存在,創(chuàng)建該鍵及與其關(guān)聯(lián)的List,依次插入a ,b, 若List類(lèi)型的key存在,則插入value中

lpushx mykey2 e? ? ? ? ? ? 若key不存在,此命令無(wú)效, 若key存在,則插入value中

linsert mykey before a a1? 在 a 的前面插入新元素 a1

linsert mykey after e e2? ? 在e 的后面插入新元素 e2

rpush mykey a b? ? ? ? ? ? 在鏈表尾部先插入b,在插入a

rpushx mykey e? ? ? ? ? ? ? 若key存在,在尾部插入e, 若key不存在,則無(wú)效

rpoplpush mykey mykey2? ? ? 將mykey的尾部元素彈出,再插入到mykey2 的頭部(原子性的操作)

del mykey? ? ? ? ? ? ? ? ? 刪除已有鍵

lrem mykey 2 a? ? ? ? ? ? ? 從頭部開(kāi)始找,按先后順序,值為a的元素,刪除數(shù)量為2個(gè),若存在第3個(gè),則不刪除

ltrim mykey 0 2? ? ? ? ? ? 從頭開(kāi)始,索引為0,1,2的3個(gè)元素,其余全部刪除

lset mykey 1 e? ? ? ? ? ? ? 從頭開(kāi)始, 將索引為1的元素值,設(shè)置為新值 e,若索引越界,則返回錯(cuò)誤信息

rpoplpush mykey mykey? ? ? 將 mykey 中的尾部元素移到其頭部

lrange mykey 0 -1? ? ? ? ? 取鏈表中的全部元素,其中0表示第一個(gè)元素,-1表示最后一個(gè)元素。

lrange mykey 0 2? ? ? ? ? ? 從頭開(kāi)始,取索引為0,1,2的元素

lrange mykey 0 0? ? ? ? ? ? 從頭開(kāi)始,取第一個(gè)元素,從第0個(gè)開(kāi)始,到第0個(gè)結(jié)束

lpop mykey? ? ? ? ? ? ? ? ? 獲取頭部元素,并且彈出頭部元素,出棧

lindex mykey 6? ? ? ? ? ? ? 從頭開(kāi)始,獲取索引為6的元素 若下標(biāo)越界,則返回nil

?4、SET 集合類(lèi)型(join union)

主要用戶計(jì)算集合之間的交集、并集、差集的操作。比如共同好友,共同的愛(ài)好。分析找到共性和不通。

例如:數(shù)學(xué)中集合的概念。key 1{1,2,3,4,5,6} key{6,7,8,9,0}

則:并集:{1,2,3,4,5,6,7,8,9,0}? ? ?交集:{6}??

差集:key1與key2的差集:就是key1有,key2沒(méi)有的。{1,2,3,4,5}

key2與key1的差集:就是key2有,key1沒(méi)有的。{7,8,9,0}

應(yīng)用場(chǎng)景:

案例:在微博應(yīng)用中,可以將一個(gè)用戶所有的關(guān)注人存在一個(gè)集合中,將其所有粉絲存在一個(gè)集合。

Redis還為集合提供了求交集、并集、差集等操作,可以非常方便的實(shí)現(xiàn)如共同關(guān)注、共同喜好、二度好友等功能,

對(duì)上面的所有集合操作,你還可以使用不同的命令選擇將結(jié)果返回給客戶端還是存集到一個(gè)新的集合中。

127.0.0.1:6379> sadd lxl pg1 jnl baoqiang gsy alexsb

(integer) 5

127.0.0.1:6379> sadd jnl baoqiang ms bbh yf wxg

(integer) 5

127.0.0.1:6379> SUNION lx jnl? #并集

1) "baoqiang"

2) "yf"

3) "bbh"

4) "ms"

5) "wxg"

127.0.0.1:6379> SUNION lxl? jnl

1) "gsy"

2) "yf"

3) "alexsb"

4) "bbh"

5) "jnl"

6) "pg1"

7) "baoqiang"

8) "ms"

9) "wxg"

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379> SINTER lxl jnl #交集

1) "baoqiang"

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379> SDIFF jnl lxl

1) "wxg"

2) "yf"

3) "bbh"

4) "ms"

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379> SDIFF lxl jnl? #差集

1) "jnl"

2) "pg1"

3) "gsy"

4) "alexsb"

sadd myset a b c?

若key不存在,創(chuàng)建該鍵及與其關(guān)聯(lián)的set,依次插入a ,b,若key存在,則插入value中,若a 在myset中已經(jīng)存在,則插入了 d 和 e 兩個(gè)新成員。

spop myset? ? ? ? ? ? ? 尾部的b被移出,事實(shí)上b并不是之前插入的第一個(gè)或最后一個(gè)成員

srem myset a d f? ? ? ? 若f不存在, 移出 a、d ,并返回2

smove myset myset2 a? ? ? ? 將a從 myset 移到 myset2,

sismember myset a? ? ? ? ? 判斷 a 是否已經(jīng)存在,返回值為 1 表示存在。

smembers myset? ? ? ? ? 查看set中的內(nèi)容

scard myset? ? ? ? ? ? 獲取Set 集合中元素的數(shù)量

srandmember myset? ? ? 隨機(jī)的返回某一成員

sdiff myset1 myset2 myset3? ? ? 1和2得到一個(gè)結(jié)果,拿這個(gè)集合和3比較,獲得每個(gè)獨(dú)有的值

sdiffstore diffkey myset myset2 myset3? ? ? 3個(gè)集和比較,獲取獨(dú)有的元素,并存入diffkey 關(guān)聯(lián)的Set中

sinter myset myset2 myset3? ? ? ? ? ? ? 獲得3個(gè)集合中都有的元素

sinterstore interkey myset myset2 myset3? 把交集存入interkey 關(guān)聯(lián)的Set中

sunion myset myset2 myset3? ? ? ? ? ? ? 獲取3個(gè)集合中的成員的并集

sunionstore unionkey myset myset2 myset3? 把并集存入unionkey 關(guān)聯(lián)的Set中


例如:數(shù)學(xué)中集合的概念。key 1{1,2,3,4,5,6} key{6,7,8,9,0} 。

? 則:

? 并集:{1,2,3,4,5,6,7,8,9,0}? ?

? 交集:{6}?

? 差集:

? key1與key2的差集:就是key1有,key2沒(méi)有的。{1,2,3,4,5}

? key2與key1的差集:就是key2有,key1沒(méi)有的。{7,8,9,0}


127.0.0.1:6379> SADD key1 1 2 3 4 5 6

(integer) 6

127.0.0.1:6379> SADD key2 6 7 8 9 0

(integer) 5

127.0.0.1:6379>

127.0.0.1:6379> SUNION key1 key2

1) "0"

2) "1"

3) "2"

4) "3"

5) "4"

6) "5"

7) "6"

8) "7"

9) "8"

10) "9"

127.0.0.1:6379> SINTER key1 key2

1) "6"

127.0.0.1:6379>

127.0.0.1:6379> SDIFF key1 key2

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

127.0.0.1:6379> SDIFF key2 key1

1) "0"

2) "7"

3) "8"

4) "9"

127.0.0.1:6379>?


5、SortedSet(有序集合)

主要用于排行榜,比如歌曲排行榜,英雄排行榜等。

應(yīng)用場(chǎng)景:

排行榜應(yīng)用,取TOP N操作

這個(gè)需求與上面需求的不同之處在于,前面操作以時(shí)間為權(quán)重,這個(gè)是以某個(gè)條件為權(quán)重,比如按頂?shù)拇螖?shù)排序,

這時(shí)候就需要我們的sorted set出馬了,將你要排序的值設(shè)置成sorted set的score,將具體的數(shù)據(jù)設(shè)置成相應(yīng)的value,

每次只需要執(zhí)行一條ZADD命令即可。

127.0.0.1:6379> zadd topN 0 smlt 0 fskl 0 fshkl 0 lzlsfs 0 wdhbx 0 wxg? ?#初始定義的有序集合

(integer) 6

127.0.0.1:6379> ZINCRBY topN 100000 smlt? ? #給內(nèi)部的鍵賦值

"100000"

127.0.0.1:6379> ZINCRBY topN 10000 fskl

"10000"

127.0.0.1:6379> ZINCRBY topN 1000000 fshkl

"1000000"

127.0.0.1:6379> ZINCRBY topN 100 lzlsfs

"100"

127.0.0.1:6379> ZINCRBY topN 10 wdhbx

"10"

127.0.0.1:6379> ZINCRBY topN 100000000 wxg

"100000000"

127.0.0.1:6379> ZREVRANGE topN 0 2? ?#ZREVRANGE topN 0 -1? ?獲取有序集合的所有key

1) "wxg"

2) "fshkl"

3) "smlt"

127.0.0.1:6379> ZREVRANGE topN 0 2 withscores? #獲取所有key的值,且會(huì)自動(dòng)排序。

1) "wxg"

2) "100000000"

3) "fshkl"

4) "1000000"

5) "smlt"

6) "100000"

127.0.0.1:6379>

zadd myzset 2 "two" 3 "three"? ? ? 添加兩個(gè)分?jǐn)?shù)分別是 2 和 3 的兩個(gè)成員

zrem myzset one two? ? ? ? ? ? ? ? 刪除多個(gè)成員變量,返回刪除的數(shù)量

zincrby myzset 2 one? ? ? ? ? ? ? ? 將成員 one 的分?jǐn)?shù)增加 2,并返回該成員更新后的分?jǐn)?shù)

zrange myzset 0 -1 WITHSCORES? ? ? 返回所有成員和分?jǐn)?shù),不加WITHSCORES,只返回成員

zrank myzset one? ? ? ? ? ? ? ? ? ? 獲取成員one在Sorted-Set中的位置索引值。0表示第一個(gè)位置

zcard myzset? ? ? ? ? ? ? ? ? ? ? ? 獲取 myzset 鍵中成員的數(shù)量

zcount myzset 1 2? ? ? ? ? ? ? ? ? 獲取分?jǐn)?shù)滿足表達(dá)式 1 <= score <= 2 的成員的數(shù)量

zscore myzset three? ? ? ? ? ? ? ? 獲取成員 three 的分?jǐn)?shù)

zrangebyscore myzset? 1 2? ? ? ? ? ? ? 獲取分?jǐn)?shù)滿足表達(dá)式 1 < score <= 2 的成員

#-inf 表示第一個(gè)成員,+inf最后一個(gè)成員

#limit限制關(guān)鍵字

#2? 3? 是索引號(hào)

zrangebyscore myzset -inf +inf limit 2 3? 返回索引是2和3的成員

zremrangebyscore myzset 1 2? ? ? ? 刪除分?jǐn)?shù) 1<= score <= 2 的成員,并返回實(shí)際刪除的數(shù)量

zremrangebyrank myzset 0 1? ? ? ? ? ? ? 刪除位置索引滿足表達(dá)式 0 <= rank <= 1 的成員

zrevrange myzset 0 -1 WITHSCORES? ? ? ? 按位置索引從高到低,獲取所有成員和分?jǐn)?shù)

#原始成員:位置索引從小到大

? ? ? one? 0?

? ? ? two? 1

#執(zhí)行順序:把索引反轉(zhuǎn)

? ? ? 位置索引:從大到小

? ? ? one 1

? ? ? two 0

#輸出結(jié)果: two?

? ? ? one

zrevrange myzset 1 3? ? ? ? ? ? ? ? 獲取位置索引,為1,2,3的成員

#相反的順序:從高到低的順序

zrevrangebyscore myzset 3 0? ? ? ? ? ? 獲取分?jǐn)?shù) 3>=score>=0的成員并以相反的順序輸出

zrevrangebyscore myzset 4 0 limit 1 2? ? 獲取索引是1和2的成員,并反轉(zhuǎn)位置索引

127.0.0.1:6379> ZADD topn 0 a 0 b 0 c 0 d 0 e

(integer) 5

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379> KEYS *

1) "age"

2) "name"

3) "stu1"

4) "woman"

5) "wo"

6) "key2"

7) "key1"

8) "gender"

9) "1"

10) "topn"

11) "stu2"

127.0.0.1:6379>

127.0.0.1:6379> TYPE topn

zset

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379> ZINCRBY topn 100 a

"100"

127.0.0.1:6379> ZINCRBY topn 200 b

"200"

127.0.0.1:6379> ZINCRBY topn 200 c

"200"

127.0.0.1:6379> ZINCRBY topn 2000 e

"2000"

127.0.0.1:6379>

127.0.0.1:6379> ZINCRBY topn 20000 f

"20000"

127.0.0.1:6379>

127.0.0.1:6379> ZINCRBY topn 20000 g

"20000"

127.0.0.1:6379>

127.0.0.1:6379> ZINCRBY topn 20000 h

"20000"

127.0.0.1:6379>

127.0.0.1:6379> ZINCRBY topn 20000 k

"20000"

127.0.0.1:6379>

127.0.0.1:6379> ZRANGE topn 0 -1

1) "d"

2) "a"

3) "b"

4) "c"

5) "e"

6) "f"

7) "g"

8) "h"

9) "k"

127.0.0.1:6379>



常用操作:

127.0.0.1:6379> KEYS *? ?redis獲取所有的key

1) "age"

2) "name"

3) "gender"

4) "woman"

5) "stu1"

6) "wo"

7) "stu2"

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379> TYPE stu1 #查看key的類(lèi)型

hash

127.0.0.1:6379>

127.0.0.1:6379> TYPE wo

list

127.0.0.1:6379> TYPE name

string

127.0.0.1:6379> LRANGE wo 0 -1? ?#list獲取一個(gè)key的所有元素值

1) "today is 4"

2) "today is 3"

3) "today is 2"

4) "today is 1"

127.0.0.1:6379>

127.0.0.1:6379> HGETALL stu1? ? #hash獲取所有的對(duì)象的鍵值對(duì)

1) "name"

2) "lisi"

3) "age"

4) "88"

5) "gender"

6) "m"

127.0.0.1:6379> KEYS name? #字符串獲取所有的key的值

1) "name"

127.0.0.1:6379>



參考:

http://www.itdecent.cn/p/8af6177f4c23

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容