吃透Redis:琳瑯滿目的數(shù)據(jù)類型
Redis提供了豐富的數(shù)據(jù)類型,包括了五種基本數(shù)據(jù)類型和五種擴(kuò)展數(shù)據(jù)類型(非官方分類,僅個(gè)人總結(jié),方便記憶):
圖片
本文介紹5種基本數(shù)據(jù)類型,在列出常用的命令之外,還附以實(shí)例操作和適用場(chǎng)景說(shuō)明,方便大家參考閱讀。后續(xù)文章會(huì)介紹另外5種擴(kuò)展數(shù)據(jù)類型,敬請(qǐng)期待。
1、String
String是最基本的也是最常用的數(shù)據(jù)類型,它是一個(gè)key-value鍵值對(duì)的結(jié)構(gòu),key是鍵,字符串類型,而value是對(duì)應(yīng)的值,可以是字符串,也可以是二進(jìn)制數(shù)據(jù),包括序列化對(duì)象、圖片等。
字符串類型的應(yīng)用非常廣泛,包括緩存、計(jì)數(shù)器、分布式鎖、Session共享等場(chǎng)景。
下面我們來(lái)看看String的一些常用操作:
#設(shè)置鍵值對(duì),如果key不存在,則新增
SET key value
#設(shè)置key的過(guò)期時(shí)間
SET key value EX [過(guò)期時(shí)間]
SETEX key [過(guò)期時(shí)間] value
#獲取key對(duì)應(yīng)的value
GET key
#判斷key是否存在
EXISTS key
#刪除key
DEL key
#獲取key對(duì)應(yīng)的過(guò)期時(shí)間
TTL key
#將key中存儲(chǔ)的數(shù)字加1
INCR key
#將key中存儲(chǔ)的數(shù)字減1
DECR key
記得很早以前去面試,面試官問(wèn)了一個(gè)關(guān)于redis key過(guò)期的小問(wèn)題:如果設(shè)置了一個(gè)key的過(guò)期時(shí)間,過(guò)一段時(shí)間再重新設(shè)置這個(gè)key的值,那么它的過(guò)期時(shí)間會(huì)變嗎?我們來(lái)試驗(yàn)一下:
127.0.0.1:6379> SET hello world EX 30
OK
127.0.0.1:6379> TTL hello
(integer) 15
127.0.0.1:6379> SET hello ok
OK
127.0.0.1:6379> TTL hello
(integer) -1
可以看出,如果重新設(shè)置key的值(不指定過(guò)期時(shí)間),那么這個(gè)key的過(guò)期時(shí)間就變成了永不過(guò)期。
2、List
List字符串列表,按照插入的順序進(jìn)行排序,可以從頭部或者尾部向List添加元素。List主要用于消息隊(duì)列,或者一些需要實(shí)現(xiàn)隊(duì)列或者棧結(jié)構(gòu)的場(chǎng)景。
List的一些常用操作如下:
#在列表最左邊(頭部)添加一些新元素
LPUSH key element [element ...]
#在列表最右邊(尾部)添加一些新元素
RPUSH key element [element ...]
#從頭部移除一個(gè)或者多個(gè)元素
LPOP key [count]
#從尾部移除一個(gè)或者多個(gè)元素
RPOP key [count]
#返回列表的長(zhǎng)度
LLEN key
#獲取指定范圍的值
LRANGE key start stop
#在某個(gè)值的前/后插入新值
LINSERT key <BEFORE | AFTER> pivot element
#刪除指定數(shù)量的某個(gè)元素
LREM key count element
演示一下常用的一些操作,先在列表中插入一些元素,然后再刪除,最后確認(rèn)刪除成功:
127.0.0.1:6379> LPUSH mylist "order:0001" "order:0002" "order:0003"
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 3
1) "order:0003"
2) "order:0002"
3) "order:0001"
127.0.0.1:6379> LREM mylist 1 "order:0003"
(integer) 1
127.0.0.1:6379> LRANGE mylist 0 3
1) "order:0002"
2) "order:0001"
127.0.0.1:6379>
3、Hash
Hash用于存儲(chǔ)鍵值對(duì),類似于Java中的HashMap,它非常適用于將一些相關(guān)的數(shù)據(jù)存儲(chǔ)在一起,比如一個(gè)學(xué)生,他有姓名、年齡、身高等信息,類似這樣的場(chǎng)景,可以把數(shù)據(jù)存儲(chǔ)在redis的Hash中。
Hash的一些常用操作如下:
#設(shè)置一個(gè)或者多個(gè)字段的值
HSET key field value [field value ...]
#返回對(duì)應(yīng)字段的值
HGET key field
#返回多個(gè)字段對(duì)應(yīng)的值
HMGET key field [field ...]
#返回所有的字段和值
HGETALL key
#判斷一個(gè)字段是否存在
HEXISTS key field
#刪除一個(gè)或者多字段及其對(duì)應(yīng)的值
HDEL key field [field ...]
#返回Hash中所有的key
HKEYS key
#返回Hash中所有的value
HVALS key
看一下簡(jiǎn)單的實(shí)例,對(duì)一個(gè)用戶的基本信息進(jìn)行操作:
127.0.0.1:6379> HSET user-info "name" "Tom" "age" "32" "height" "178"
(integer) 3
127.0.0.1:6379> HGET user-info height
"178"
127.0.0.1:6379> HMGET user-info name age
1) "Tom"
2) "32"
127.0.0.1:6379> HGETALL user-info
1) "name"
2) "Tom"
3) "age"
4) "32"
5) "height"
6) "178"
127.0.0.1:6379> HDEL user-info height
(integer) 1
127.0.0.1:6379> HEXISTS user-info height
(integer) 0
127.0.0.1:6379> HKEYS user-info
1) "name"
2) "age"
127.0.0.1:6379> HVALS user-info
1) "Tom"
2) "32"
4、Set
Set提供了與List類似的列表功能,但它可以自動(dòng)去重,也就是說(shuō)元素具有唯一性,另外,Set還提供了很多集合操作的功能,像多個(gè)集合之間的并集、交集和差集等運(yùn)算。
Set很適合以下一些場(chǎng)景:比如交友軟件中,找到兩位用戶的共同好友;電商平臺(tái)中,用戶瀏覽過(guò)的商品(需要去重)等。
Set的常見(jiàn)命令:
#設(shè)置一個(gè)或者多個(gè)字段的值
HSET key field value [field value ...]
#返回對(duì)應(yīng)字段的值
HGET key field
#返回多個(gè)字段對(duì)應(yīng)的值
HMGET key field [field ...]
#返回所有的字段和值
HGETALL key
#判斷一個(gè)字段是否存在
HEXISTS key field
#刪除一個(gè)或者多字段及其對(duì)應(yīng)的值
HDEL key field [field ...]
#返回Hash中所有的key
HKEYS key
#返回Hash中所有的value
HVALS key
示例:
127.0.0.1:6379> SADD key1 "a" "b" "c" "d"
(integer) 4
127.0.0.1:6379> SMEMBERS key1
1) "c"
2) "d"
3) "b"
4) "a"
127.0.0.1:6379> SCARD key1
(integer) 4
127.0.0.1:6379> SMEMBERS key1
1) "c"
2) "d"
3) "b"
4) "a"
127.0.0.1:6379> SADD key2 "c" "d"
(integer) 2
127.0.0.1:6379> SINTER key1 key2
1) "c"
2) "d"
5、Sorted Set
Sorted Set為有序集合,元素類型為String,元素具有唯一性,每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)分?jǐn)?shù),這個(gè)分?jǐn)?shù)被用來(lái)按照從低到高的方式排序。集合中的成員是唯一的,但分?jǐn)?shù)可以重復(fù),此時(shí)就按照字符串的字典順序排列。
它的應(yīng)用也很廣泛,比如在線游戲中的排行榜,按照分?jǐn)?shù)進(jìn)行排序就很方便;也可以使用它來(lái)進(jìn)行限流,防止對(duì)于API的過(guò)度請(qǐng)求。
Sorted Set的常見(jiàn)命令:
#添加一個(gè)或者多個(gè)元素
ZADD key score member [score member...]
#返回指定索引范圍的元素(升序),降序?yàn)閆REVRANGE
ZRANGE key start stop
#返回指定score范圍的元素(升序),降序?yàn)閆REVRANGEBYSCORE
ZRANGEBYSCORE key min max
#為指定元素加上指定的數(shù)量
ZINCRBY key increment member
#刪除有序集合中的一個(gè)或者多個(gè)元素
ZREM key member [member ...]
#返回指定score范圍的元素個(gè)數(shù)
ZCOUNT key min max
#返回某個(gè)元素在集合中的排名(升序),降序是ZREVRANK
ZRANK key member
#返回某個(gè)元素的分?jǐn)?shù)
ZSCORE key member
有序集合常用操作的演示:
127.0.0.1:6379> ZADD mygame 10 "John" 12 "Tom" 8 "Tony" 7 "Hank"
(integer) 4
127.0.0.1:6379> ZRANGE mygame 0 -1
1) "Hank"
2) "Tony"
3) "John"
4) "Tom"
127.0.0.1:6379> ZRANGEBYSCORE mygame 10 15
1) "John"
2) "Tom"
127.0.0.1:6379> ZINCRBY mygame 8 "Hank"
"15"
127.0.0.1:6379> ZSCORE mygame "Hank"
"15"
127.0.0.1:6379> ZRANK mygame "John"
(integer) 1
6、總結(jié)
Redis提供了5種基本數(shù)據(jù)類型,功能非常強(qiáng)大,涵蓋面也比較廣,可以適用于很多的實(shí)際場(chǎng)景,而Memcached僅提供了簡(jiǎn)單的key-value,相比之下,Redis就強(qiáng)大得多。另外,Redis還提供了其他擴(kuò)展的5種數(shù)據(jù)類型,我們會(huì)在后續(xù)的文章中進(jìn)行介紹,敬請(qǐng)關(guān)注。謝謝!