Redis-數(shù)據(jù)類型

Redis中所有數(shù)據(jù)都是以key-value存儲的同衣,value支持的數(shù)據(jù)類型包括string抬闷、hashlist少辣、set凌摄、zset(sorted_set)

每種數(shù)據(jù)類型內(nèi)部使用了不同的編碼,并且Redis會根據(jù)存儲的值自動選擇合適的編碼漓帅,這對使用者是透明的锨亏,object encoding key這個命令可以查看編碼。了解各種數(shù)據(jù)類型的內(nèi)部編碼可以幫助理解各數(shù)據(jù)類型相關命令的時間復雜度忙干,從而在使用過程中避免執(zhí)行耗時命令引起阻塞器予。

Redis數(shù)據(jù)結構和內(nèi)部編碼.png
1.string

string 是redis最基本的類型,一個key對應一個value捐迫。

1.1 常用命令
命令 用途
set key value 設置一個key的value(string類型)
get key 獲取一個key的value(string類型)
append key value 向一個string類型的key追加一個value
strlen key 獲取key中存儲的value的長度
del key [key ...] 刪除key
incr key key的integer類型的value+1
decr key的integer類型的value-1
incrby key increment key的integer類型的vaule+increment
decrby key decrement key的integer類型的vaule-decrement
getrange key start end 截取字符串
setrange key offset value 從指定的位置覆蓋字符串
setex key seconds value 保存含有效期的key-value
setnx key value 設置key-value(僅當key不存在時)
mset key value [key value ...] 設置多個key-value
mget key [key ...] 查詢多個key
msetnx key value [key value ...] 保存多個key-value(所有key均不存在才保存)
1.2 示例

分別通過set乾翔、mset保存key-value(k1-k10)及get、mget獲取key

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> set k4 4
OK
127.0.0.1:6379> set k5 5
OK
127.0.0.1:6379> set k6 6
OK
127.0.0.1:6379> set k7 abcde
OK
127.0.0.1:6379> set k8 edcba
OK
127.0.0.1:6379> mset k9 v9 k10 v10
OK
127.0.0.1:6379> keys *
 1) "k6"
 2) "k8"
 3) "k5"
 4) "k3"
 5) "k1"
 6) "k2"
 7) "k9"
 8) "k7"
 9) "k10"
10) "k4"
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> mget k2 k3 k4 k5 k6 k7 k8 k9 k10
1) "v2"
2) "v3"
3) "4"
4) "5"
5) "6"
6) "abcde"
7) "edcba"
8) "v9"
9) "v10"
127.0.0.1:6379>

使用append追加一個value到key

127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> append k1 v1v1
(integer) 6
127.0.0.1:6379> get k1
"v1v1v1"
127.0.0.1:6379>

使用strlen獲取key中value的長度

127.0.0.1:6379> strlen k1
(integer) 6

刪除key

127.0.0.1:6379> mget k2 k3
1) "v2"
2) "v3"
127.0.0.1:6379> del k2 k3
(integer) 2
127.0.0.1:6379> keys *
1) "k6"
2) "k8"
3) "k5"
4) "k1"
5) "k9"
6) "k7"
7) "k10"
8) "k4"
127.0.0.1:6379>

incr使value+1

127.0.0.1:6379> incr k6
(integer) 7

decr使value-1

127.0.0.1:6379> decr k4
(integer) 3

incrby使value+給定值

127.0.0.1:6379> incrby k5 5
(integer) 10

decrby使value-給定值

127.0.0.1:6379> decrby k5 9
(integer) 1

getrange截取字符串

127.0.0.1:6379> get k7
"abcde"
127.0.0.1:6379> getrange k7 0 3
"abcd"

setrange從指定的位置覆蓋字符串

127.0.0.1:6379> get k7
"abcde"
127.0.0.1:6379> setrange k7 2 xyzopq
(integer) 8
127.0.0.1:6379> get k7
"abxyzopq"

setex設置含有效期的key-value

127.0.0.1:6379> setex k11 20 value
OK
127.0.0.1:6379> ttl k11
(integer) 17
127.0.0.1:6379> ttl k11
(integer) 14
127.0.0.1:6379> ttl k11
(integer) 10
127.0.0.1:6379> ttl k11
(integer) 5
127.0.0.1:6379> ttl k11
(integer) 1
127.0.0.1:6379> ttl k11
(integer) -2
127.0.0.1:6379> get k11
(nil)
127.0.0.1:6379>

setnx保存key-value(若key已存在施戴,不保存)

127.0.0.1:6379> get k1
"v1v1v1"
127.0.0.1:6379> get k2
(nil)
127.0.0.1:6379> setnx k1 xyz
(integer) 0
127.0.0.1:6379> setnx k2 abc
(integer) 1
127.0.0.1:6379> get k2
"abc"
127.0.0.1:6379>

msetnx保存多個key-value(所有key均不存在才保存)

127.0.0.1:6379> msetnx k11 v11 k12 v12 k10 v10
(integer) 0
127.0.0.1:6379> msetnx k11 v11 k12 v12
(integer) 1
127.0.0.1:6379> mget k11 k12
1) "v11"
2) "v12"
127.0.0.1:6379>
1.3 幫助信息

help @string命令查看string類型的所有用法反浓。幫助信息里面都是非常通俗的英文描述,不難看懂赞哗,其它數(shù)據(jù)類型不再照抄redis的幫助信息了雷则,建議直接看自帶的幫助,這是最權威的肪笋,英文直接能看懂的話月劈,效果肯定比看其它資料好。

127.0.0.1:6379> help @string

  APPEND key value
  summary: Append a value to a key
  since: 2.0.0

 ...省略1000字...

  GET key
  summary: Get the value of a key
  since: 1.0.0

  ...省略10,000字...

  SETEX key seconds value
  summary: Set the value and expiration of a key
  since: 2.0.0

  SETNX key value
  summary: Set the value of a key, only if the key does not exist
  since: 1.0.0

  SETRANGE key offset value
  summary: Overwrite part of a string at key starting at the specified offset
  since: 2.2.0

  STRLEN key
  summary: Get the length of the value stored in a key
  since: 2.2.0

127.0.0.1:6379>
1.4 應用場景

緩存涂乌、限速艺栈、分布式session、計數(shù)器

2.hash

hash 是一個string類型的field和value的映射表湾盒,hash特別適合用于存儲對象湿右。

2.1 常用命令
命令 用途
hset key field value 保存一個field到hash
hget key field 獲取hash的一個field值
hmset key field value [field value ...] 保存多個field到hash
hmget key field [field ...] 獲取hash的多個field值
hgetall key 獲取hash的所有field(name & value)
hdel key field [field ...] 刪除hash的field
hlen key 獲取hash中field的數(shù)量
hexists key field 判斷hash中是否存在給定的field
hkeys key 獲取給定hash中的所有field(僅name)
hvals key 獲取給定hash中所有field的值(僅value)
hincrby key field increment hash中指定的field+increment(integer)
hincrbyfloat key field increment hash中指定的field+increment(float)
2.2 示例

hset保存一個field到hash

127.0.0.1:6379> hset h f1 v1
(integer) 1

hget獲取hash的指定field

127.0.0.1:6379> hget h f1
"v1"

hmset保存多個field到hash

127.0.0.1:6379> hmset h f2 2 f3 3 f4 4
OK

hmget獲取hash的多個field

127.0.0.1:6379> hmget h f1 f2 f3 f4 f5
1) "v1"
2) "2"
3) "3"
4) "4"
5) (nil)

hgetall獲取hash的所有filed(包括name和value)

127.0.0.1:6379> hgetall h
1) "f1"
2) "v1"
3) "f2"
4) "2"
5) "f3"
6) "3"
7) "f4"
8) "4"

hdel刪除hash的指定field

127.0.0.1:6379> hdel h f1
(integer) 1

hlen獲取hash中field數(shù)量

127.0.0.1:6379> hlen h
(integer) 3

hexists判斷hash中是否存在指定的field

127.0.0.1:6379> hexists h f1
(integer) 0
127.0.0.1:6379> hexists h f2
(integer) 1

hkeys獲取hash中的所有field(僅name)
127.0.0.1:6379> hkeys h

  1. "f2"
  2. "f3"
  3. "f4"
    hvals獲取hash中所有field的value
127.0.0.1:6379> hvals h
1) "2"
2) "3"
3) "4"

hincrby使hash中指定的field+給定的值(integer)

127.0.0.1:6379> hincrby h f2 5
(integer) 7

hincrbyfloat使hash中指定的field+給定的值(float)

127.0.0.1:6379> hincrbyfloat h f2 5.5
"12.5"
2.3 應用場景

緩存、限速罚勾、session共享

3.list

list 是簡單的字符串列表毅人,按照插入順序排序吭狡。

3.1 常用命令
命令 用途
lpush key value [value ...] 保存一個或多個value到list(向前追加)
rpush key value [value ...] 保存一個或多個value到list(向后追加)
lrange key start stop 從list中獲取一個范圍的元素
lpop key 移除list中的第一個元素
rpop key 一處list中的最后一個元素
lindex key index 通過索引獲取list中的元素
llen key 獲取list的長度
lrem key count value 從list中移除count個value
ltrim key start stop 按指定的范圍截取list
rpoplpush key key 從list中移除最后一個元素,并將該元素lpush到另一個list
lset key index 通過索引設置list中的元素
3.2 示例

lpush丈莺、rpush划煮、lrange

127.0.0.1:6379> lpush l a b c
(integer) 3
127.0.0.1:6379> lrange l 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> rpush l x y z
(integer) 6
127.0.0.1:6379> lrange l 0 -1
1) "c"
2) "b"
3) "a"
4) "x"
5) "y"
6) "z"
127.0.0.1:6379>

lpop

127.0.0.1:6379> lpop l
"c"
127.0.0.1:6379> lrange l 0 -1
1) "b"
2) "a"
3) "x"
4) "y"
5) "z"
127.0.0.1:6379>

rpop

127.0.0.1:6379> rpop l
"z"
127.0.0.1:6379> lrange l 0 -1
1) "b"
2) "a"
3) "x"
4) "y"
127.0.0.1:6379>

lindex通過索引獲取list中的元素

127.0.0.1:6379> lindex l 0
"b"
127.0.0.1:6379>

llen獲取list長度

127.0.0.1:6379> llen l
(integer) 4
127.0.0.1:6379>

lrem從list中移除count個指定的value

127.0.0.1:6379> lrange l2 0 -1
 1) "1"
 2) "2"
 3) "3"
 4) "4"
 5) "5"
 6) "1"
 7) "2"
 8) "3"
 9) "4"
10) "5"
11) "1"
12) "2"
13) "3"
14) "4"
15) "5"
127.0.0.1:6379> lrem l2 2 5
(integer) 2
127.0.0.1:6379> lrange l2 0 -1
 1) "1"
 2) "2"
 3) "3"
 4) "4"
 5) "1"
 6) "2"
 7) "3"
 8) "4"
 9) "1"
10) "2"
11) "3"
12) "4"
13) "5"
127.0.0.1:6379>

ltrim按指定的范圍截取list

127.0.0.1:6379> ltrim l2 0 3
OK
127.0.0.1:6379> lrange l2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379>

rpoplpush從list移除最后一個元素,并將該元素添加到另一個list的左邊

127.0.0.1:6379> rpoplpush l l2
"y"
127.0.0.1:6379> lrange l2 0 -1
1) "y"
2) "1"
3) "2"
4) "3"
5) "4"
127.0.0.1:6379>

lset通過索引設置list的元素

127.0.0.1:6379> lset l2 0 0
OK
127.0.0.1:6379> lrange l2 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
127.0.0.1:6379>
3.3 應用場景

消息隊列(lpush+brpop)

4.set

set 是string類型的無序集合缔俄。

4.1 常用命令
命令 用途
sadd key member [member ...] 添加1個或多個member到set中
smembers key 獲取set中的所有member
sismember key member 判斷給定的值是否時set中的member
scard key 獲取set中member的數(shù)量
srem key member [member ...] 從set中移除member
srandmember key [count] 從set中隨機獲取member
smove key key member 從set移動一個member到另一個set
sdiff key [key ...] 比較多個set的差異
sinter key [key ...] 獲取set的交集
sunion key [key ...] 獲取set的并集
4.2 示例

sadd 添加1個或多個member到set中

127.0.0.1:6379> sadd s1 a b c d e f
(integer) 6

smembers 獲取set中的所有member

127.0.0.1:6379> smembers s1
1) "c"
2) "a"
3) "b"
4) "f"
5) "d"
6) "e"

sismember 判斷給定的值是否時set中的member

127.0.0.1:6379> sismember s1 a
(integer) 1
127.0.0.1:6379> sismember s1 x
(integer) 0

scard 獲取set中member的數(shù)量

127.0.0.1:6379> scard s1
(integer) 6

srem 從set中移除member

127.0.0.1:6379> srem s1 e f
(integer) 2
127.0.0.1:6379> smembers s1
1) "a"
2) "c"
3) "d"
4) "b"

srandmember 從set中隨機獲取member

127.0.0.1:6379> srandmember s1 2
1) "a"
2) "b"
127.0.0.1:6379> srandmember s1 2
1) "c"
2) "a"
127.0.0.1:6379> srandmember s1 2
1) "c"
2) "b"

smove 從set移動一個member到另一個set

127.0.0.1:6379> sadd s2 1 2 3
(integer) 3
127.0.0.1:6379> smove s1 s2 d
(integer) 1
127.0.0.1:6379> smembers s2
1) "d"
2) "3"
3) "1"
4) "2"

sdiff 比較多個set的差異

127.0.0.1:6379> sadd s3 1 2
(integer) 2
127.0.0.1:6379> sdiff s2 s3
1) "3"
2) "d"

sinter 獲取set的交集

127.0.0.1:6379> sinter s2 s3
1) "1"
2) "2"

sunion 獲取set的并集

127.0.0.1:6379> sunion s1 s2
1) "b"
2) "3"
3) "a"
4) "c"
5) "d"
6) "1"
7) "2"
4.3 應用場景

標簽弛秋、隨機數(shù)(spot、srandmember)

5 zset(sorted_set)

zset 和 set 一樣也是string類型元素的集合,且不允許重復的成員俐载。不同的是每個元素都會關聯(lián)一個double類型的分數(shù)蟹略。redis正是通過分數(shù)來為集合中的成員進行從小到大的排序。zset的成員是唯一的,但分數(shù)(score)卻可以重復遏佣。

5.1 常用命令
命令 用途
zadd key socre member [socre member ...] 添加member到sorted set挖炬,如果member已存在則更新它的socre
zrange key start stop [withscores] 從sorted set獲取指定索引范圍的member,按從小到大的順序
zrevrange key start stop [withscores] 從sorted set獲取指定索引范圍的member状婶,按從大到小的順序
zrangebyscore key min max [withscores] [limit offset count] 從sorted set獲取指定score范圍的member
zcount key min max 獲取指定score范圍內(nèi)的member數(shù)量
zrank key member 確定member在sorted set中的索引(從小到大)
zrevrank key member 確定member在sorted set中的索引(從大到幸饬病)
zscore key member 從sorted set中獲取給定member的score
5.2 示例

zadd 添加member到sorted set,如果member已存在則更新它的socre

127.0.0.1:6379> zadd z1 10 aa 20 bb 30 cc 40 dd 50 ee 60 ff
(integer) 6
127.0.0.1:6379> zadd z1 70 gg 15 bb
(integer) 1
127.0.0.1:6379>

zrange 從sorted set獲取指定索引范圍的member膛虫,按從小到大的順序

127.0.0.1:6379> zrange z1 0 2
1) "aa"
2) "bb"
3) "cc"
127.0.0.1:6379>

zrevrange 從sorted set獲取指定索引范圍的member草姻,按從大到小的順序

127.0.0.1:6379> zrevrange z1 0 2
1) "gg"
2) "ff"
3) "ee"
127.0.0.1:6379>

zrangebyscore 從sorted set獲取指定score范圍的member
如果不包含給定的score,需要使用(

127.0.0.1:6379> zrangebyscore z1 10 30
1) "aa"
2) "bb"
3) "cc"
127.0.0.1:6379> zrangebyscore z1 10 (30
1) "aa"
2) "bb"
127.0.0.1:6379> zrangebyscore z1 (10 30
1) "bb"
2) "cc"
127.0.0.1:6379> zrangebyscore z1 (10 (30
1) "bb"
127.0.0.1:6379>

zcount 獲取指定score范圍內(nèi)的member數(shù)量
如果不包含給定的score走敌,需要使用(

127.0.0.1:6379> zcount z1 10 30
(integer) 3
127.0.0.1:6379> zcount z1 10 (30
(integer) 2
127.0.0.1:6379> zcount z1 (10 30
(integer) 2
127.0.0.1:6379> zcount z1 (10 (30
(integer) 1
127.0.0.1:6379>

zrank 確定member在sorted set中的索引(從小到大)

127.0.0.1:6379> zrank z1 cc
(integer) 2
127.0.0.1:6379>

zrevrank 確定member在sorted set中的索引(從大到胁昵恪)

127.0.0.1:6379> zrevrank z1 cc
(integer) 4
127.0.0.1:6379>

zscore 從sorted set中獲取給定member的score

127.0.0.1:6379> zscore z1 bb
"15"
127.0.0.1:6379>
5.3 應用場景

排行榜

6.其它數(shù)據(jù)類型

Bitmaps
HyperLogLog
GEO

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逗噩,一起剝皮案震驚了整個濱河市掉丽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌异雁,老刑警劉巖捶障,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纲刀,居然都是意外死亡项炼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門示绊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锭部,“玉大人,你說我怎么就攤上這事面褐“韬蹋” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵展哭,是天一觀的道長湃窍。 經(jīng)常有香客問我闻蛀,道長,這世上最難降的妖魔是什么您市? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任觉痛,我火速辦了婚禮,結果婚禮上茵休,老公的妹妹穿的比我還像新娘隙姿。我一直安慰自己容燕,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著量愧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪褒搔。 梳的紋絲不亂的頭發(fā)上夷磕,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音亏拉,去河邊找鬼扣蜻。 笑死,一個胖子當著我的面吹牛及塘,可吹牛的內(nèi)容都是我干的莽使。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼笙僚,長吁一口氣:“原來是場噩夢啊……” “哼芳肌!你這毒婦竟也來了?” 一聲冷哼從身側響起肋层,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亿笤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后栋猖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體净薛,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年蒲拉,在試婚紗的時候發(fā)現(xiàn)自己被綠了肃拜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡雌团,死狀恐怖燃领,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锦援,我是刑警寧澤猛蔽,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站雨涛,受9級特大地震影響枢舶,放射性物質(zhì)發(fā)生泄漏懦胞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一凉泄、第九天 我趴在偏房一處隱蔽的房頂上張望躏尉。 院中可真熱鬧,春花似錦后众、人聲如沸胀糜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽教藻。三九已至,卻和暖如春右锨,著一層夾襖步出監(jiān)牢的瞬間括堤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工绍移, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悄窃,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓蹂窖,卻偏偏與公主長得像轧抗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瞬测,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355