Redis-数据类型

2017-04-02  本文已影响0人  yuanzicheng

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

上一篇下一篇

猜你喜欢

热点阅读