前言
在正式介紹5種數(shù)據(jù)結(jié)構(gòu)之前,了解一下Redis的一些全局命令、數(shù)據(jù)結(jié)構(gòu)和內(nèi)部編碼等。
全局命令
-
查看所有鍵
keys * —o(n) -
鍵總數(shù)
dbsize —o(1) -
檢查鍵是否存在
exists key—o(1)如果鍵存在則返回1,不存在則返回0 -
刪除鍵
del key [key ...]—o(1)通用所有的數(shù)據(jù)結(jié)果 -
鍵過(guò)期
expire key seconds 設(shè)置過(guò)期時(shí)間
ttl key 剩余過(guò)期時(shí)間,它有3種返回值:(1)大于等于0的整數(shù):鍵剩余的過(guò)期時(shí)間。(2)-1:鍵沒設(shè)置過(guò)期時(shí)間。(3)-2:鍵不存在 -
鍵的數(shù)據(jù)結(jié)構(gòu)類型
type key
5種數(shù)據(jù)結(jié)構(gòu)
字符串
字符串類型是Redis最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),字符串類型的值實(shí)際可以是字符串(簡(jiǎn)單的字符串、復(fù)雜的字符串(例如JSON、XML)、數(shù)字(整數(shù)、浮點(diǎn)數(shù)),甚至是二進(jìn)制(圖片、音頻、視頻),但是值最大不能超過(guò)512MB。

(1)設(shè)置值
set key value [ex seconds] [px milliseconds] [nx|xx]
set hello world
OK
set命令有幾個(gè)選項(xiàng):
·ex seconds:為鍵設(shè)置秒級(jí)過(guò)期時(shí)間。
·px milliseconds:為鍵設(shè)置毫秒級(jí)過(guò)期時(shí)間。
·nx:鍵必須不存在,才可以設(shè)置成功,用于添加。
·xx:與nx相反,鍵必須存在,才可以設(shè)置成功,用于更新。
除了set選項(xiàng), Redis還提供了setex和setnx兩個(gè)命令:
setex key seconds value
setnx key value
(2)獲取值
get key
127.0.0.1:6379> get hello
"world"
(3)批量設(shè)置/獲取值
mset/mget key value [key value ...]
(4)計(jì)算相關(guān)
incr key (自增)、decr(自減)、 incrby(自增指定數(shù)字)、decrby(自減指定數(shù)字)、 incrbyfloat(自增浮點(diǎn)數(shù))
(5)不常用命令
append key value(追加)、strlen key(字符長(zhǎng)度)、getset key value(設(shè)置并返回原值)、setrange key offeset value(設(shè)置指定位置的字符)等

-
內(nèi)部編碼
(1)int: 8個(gè)字節(jié)的長(zhǎng)整型。
(2)embstr:小于等于39個(gè)字節(jié)的字符串。
(3)raw:大于39個(gè)字節(jié)的字符串 -
典型使用場(chǎng)景
(1)緩存功能
(2)計(jì)數(shù)
(3)共享Session
(4)限速等
哈希
哈希類型是指鍵值本身又是一個(gè)鍵值對(duì)結(jié)構(gòu),形如value={{field1, value1}, ...{fieldN,valueN}}
-
命令
(1)設(shè)置/獲取值
hset/hget key field value
(2)刪除field
hdel key field [field ...]
(3)批量設(shè)置或獲取field-value
hmget key field [field ...]/hmset key field value [field value ...]
(4)判斷field是否存在
hexists key
(5)獲取所有field/獲取所有value
hkeys/ hvals key
(6)其他等
hgetall key(獲取所有的field-value)、hincrby key field,hincrbyfloat key field(像incrby和incrbyfloat命令一樣,但是它們的作用域是filed)、hstrlen key field(計(jì)算長(zhǎng)度)等哈希類型命令的時(shí)間復(fù)雜度.png -
內(nèi)部編碼
(1)ziplist(壓縮列表):當(dāng)哈希類型元素個(gè)數(shù)小于hash-max-ziplist-entries配置(默認(rèn)512個(gè))、同時(shí)所有值都小于hash-max-ziplist-value配置(默認(rèn)64字節(jié)時(shí), Redis會(huì)使用ziplist作為哈希的內(nèi)部實(shí)現(xiàn), ziplist使用更加緊湊的結(jié)構(gòu)實(shí)現(xiàn)多個(gè)元素的連續(xù)存儲(chǔ),所以在節(jié)省內(nèi)存方面比hashtable更加優(yōu)秀。
(2)hashtable(哈希表):當(dāng)哈希類型無(wú)法滿足ziplist的條件時(shí), Redis會(huì)使用hashtable作為哈希的內(nèi)部實(shí)現(xiàn),因?yàn)榇藭r(shí)ziplist的讀寫效率會(huì)下降,而hashtable的讀寫時(shí)間復(fù)雜度為O(1) -
使用場(chǎng)景
(1)緩存對(duì)象信息,省去string序列化消耗
(2)哈希類型是稀疏的
列表
列表( list)類型是用來(lái)存儲(chǔ)多個(gè)有序且重復(fù)的字符串。
-
命令
(1)添加操作
rpush key value [value ...](右邊添加)、lpush key value [value ...](左邊添加)、linsert key before|after pivot value(向某個(gè)元素前或者后插入元素)
(2)查詢
lrange key start end(指定范圍內(nèi)的元素列表)、lindex key index(列表指定索引下標(biāo)的元素)、llen key(列表長(zhǎng)度)
(3)刪除
lpop key(左邊刪除)、rpop key(右邊刪除)、lrem key count value(刪除指定元素)
(4)修改
lset key index newValue
列表命令時(shí)間復(fù)雜度.png -
內(nèi)部編碼
(1)ziplist(壓縮列表):當(dāng)列表的元素個(gè)數(shù)小于list-max-ziplist-entries配置(默認(rèn)512個(gè)),同時(shí)列表中每個(gè)元素的值都小于list-max-ziplist-value配置時(shí)(默認(rèn)64字節(jié)), Redis會(huì)選用ziplist來(lái)作為列表的內(nèi)部實(shí)現(xiàn)來(lái)減少內(nèi)存的使用。
(2)linkedlist(鏈表):當(dāng)列表類型無(wú)法滿足ziplist的條件時(shí), Redis會(huì)使用linkedlist作為列表的內(nèi)部實(shí)現(xiàn)。 -
使用場(chǎng)景
(1)消息隊(duì)列
(2)文章列表
集合
集合( set)類型也是用來(lái)保存多個(gè)的字符串元素,但和列表類型不一樣的是,集合中不允許有重復(fù)元素,并且集合中的元素是無(wú)序的,不能通過(guò)索引下標(biāo)獲取元素。
-
命令
(1)集合內(nèi)操作
sadd key element [element ...](添加元素)、srem key element [element ...](刪除元素)、scard key(計(jì)算個(gè)數(shù))、sismember key element(判斷是否在集合中)、srandmember key [count](隨即取指定元素)、spop key(隨即彈出元素)、smembers key(獲取所有元素)
(2)集合間操作
sinter key [key ...](交集)、suinon key [key ...](并集)、sdiff key [key ...](差集)
集合常用命令時(shí)間復(fù)雜度.png -
內(nèi)部編碼
(1)intset(整數(shù)集合):當(dāng)集合中的元素都是整數(shù)且元素個(gè)數(shù)小于set-maxintset-entries配置(默認(rèn)512個(gè))時(shí), Redis會(huì)選用intset來(lái)作為集合的內(nèi)部實(shí)
現(xiàn),從而減少內(nèi)存的使用。
(2)hashtable(哈希表):當(dāng)集合類型無(wú)法滿足intset的條件時(shí), Redis會(huì)使用hashtable作為集合的內(nèi)部實(shí)現(xiàn)。 -
使用場(chǎng)景
(1)打標(biāo)簽。
(2)計(jì)算共同愛好用戶等。
有序集合
有序集合相對(duì)于哈希、列表、集合來(lái)說(shuō)會(huì)有一點(diǎn)點(diǎn)陌生,但既然叫有序集合,那么它和集合必然有著聯(lián)系,它保留了集合不能有重復(fù)成員的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下標(biāo)作為排序依據(jù)不同的是,它給每個(gè)元素設(shè)置一個(gè)分?jǐn)?shù)( score)作為排序的依據(jù)。

-
命令
(1)集合內(nèi)操作
zadd key score member [score member...](添加元素)、zscore key member(計(jì)算某個(gè)成員的分?jǐn)?shù))、zcard key(計(jì)算個(gè)數(shù))、zrank/zrevrank key member(排名)等
(2)集合間操作
zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max](交集)、zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max](并集)
這個(gè)命令參數(shù)較多,下面分別進(jìn)行說(shuō)明:
(1)destination:交集計(jì)算結(jié)果保存到這個(gè)鍵。
(2)numkeys:需要做交集計(jì)算鍵的個(gè)數(shù)。
(3)key[key...]:需要做交集計(jì)算的鍵。
(4)weights weight[weight...]:每個(gè)鍵的權(quán)重,在做交集計(jì)算時(shí),每個(gè)鍵中的每個(gè)member會(huì)將自己分?jǐn)?shù)乘以這個(gè)權(quán)重,每個(gè)鍵的權(quán)重默認(rèn)是1。
(5)aggregate sum|min|max:計(jì)算成員交集后,分值可以按照sum(和)、min(最小值)、 max(最大值)做匯總,默認(rèn)值是sum。
eg:
127.0.0.1:6379> zinterstore user:ranking:1_inter_2 2 user:ranking:1
user:ranking:2
(integer) 3

-
內(nèi)部編碼
(1)ziplist(壓縮列表):當(dāng)有序集合的元素個(gè)數(shù)小于zset-max-ziplistentries配置(默認(rèn)128個(gè)),同時(shí)每個(gè)元素的值都小于zset-max-ziplist-value配置(默認(rèn)64字節(jié))時(shí), Redis會(huì)用ziplist來(lái)作為有序集合的內(nèi)部實(shí)現(xiàn),ziplist可以有效減少內(nèi)存的使用。
(2)skiplist(跳躍表):當(dāng)ziplist條件不滿足時(shí),有序集合會(huì)使用skiplist作為內(nèi)部實(shí)現(xiàn),因?yàn)榇藭r(shí)ziplist的讀寫效率會(huì)下降。 -
使用場(chǎng)景
(1)添加用戶贊數(shù)。
(2)取消用戶贊。
(3)展示獲取贊數(shù)最多的十個(gè)用戶。
(4)展示用戶信息以及用戶分?jǐn)?shù)。
列表、集合和有序集合三者的異同點(diǎn).png
注意事項(xiàng):命令遍歷所有的鍵,分別是keys和scan



