Redis-数据类型

Redis中所有数据都是以key-value存储的,value支持的数据类型包括stringhashlistsetzset(sorted_set)

每种数据类型内部使用了不同的编码,并且Redis会根据存储的值自动选择合适的编码,这对使用者是透明的,object encoding key这个命令可以查看编码。了解各种数据类型的内部编码可以帮助理解各数据类型相关命令的时间复杂度,从而在使用过程中避免执行耗时命令引起阻塞。

Redis数据结构和内部编码.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类型的所有用法。帮助信息里面都是非常通俗的英文描述,不难看懂,其它数据类型不再照抄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、计数器

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的数量
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数量

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的数量
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的数量

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 应用场景

标签、随机数(spot、srandmember)

5 zset(sorted_set)

zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(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范围内的member数量
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范围内的member数量
如果不包含给定的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.其它数据类型

Bitmaps
HyperLogLog
GEO

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350