《Redis 初探(1)——Redis 的安装》中,我们说过,Redis支持以下五种数据类型,本章进行详解:

  • String类型
  • List类型
  • Set类型
  • SortedSet类型
  • Hash类型
存储极限 大小
String类型的value大小 512M
Hash类型key的键值对个数 4294967295
List类型key个数 4294967295
Set/SortedSet类型key个数 4294967295

一、String(字符串)类型

在前面两章中,我们存储的都是 String 类型。该类型增加和删除一个键值对十分简单,如下:

含义 方法
获取值 get key
添加一个键值对 set key value
获取并重置一个键值对 getset key value
删除一个键值对 del key

前面两个我们之前都使用过了,getset key value 有点陌生,它是先获取 key 的 value,然后将该 key 修改为输入的 value,相当于将 get keyset key value这两步合为了一步,看看下面这个例子你就明白了:

1
2
3
4
127.0.0.1:6379> getset age 10
"20"
127.0.0.1:6379> get age
"10"

删除一个键值对也很简单,如下:

1
2
3
4
127.0.0.1:6379> del age
(integer) 1
127.0.0.1:6379> get age
(nil)

字符串也可以进行数值操作(Redis内部自动将value转换为数值型),方法如下:

含义 方法
值加一 incr key
值减一 decr key
值加n incrby key n
值减n decrby key n

注意: 如果 key 值不存在,当作0处理;如果 value 值无法转换为整型时,会返回错误信息:

介绍一下字符串拼接方法,如下:

含义 方法
拼接 append key

二、Hash(散列)类型

散列,即 Hash,Redis 中的 Hash 类型可以看成Map集合。Hash 类型的每一个 key 的 value 对应于一个 Map,该Map包含多个键值对的数据,如下图所示:

2.1 赋值

含义 方法
为指定key设置一个键值对 hset key field value
为指定key设置多个键值对 hmset key field value[field2 value2…]
1
2
3
4
5
127.0.0.1:6379> hset myHash name jitwxs
(integer) 1
127.0.0.1:6379> hmset myHash age 20 sex male
(integer) 2
127.0.0.1:6379>

2.2 取值

含义 方法
返回指定 key 中 field 的值 hget key field
返回指定 key 中多个 field 的值 hmget key filed[field2…]
返回指定 key 中所有 field-value hgetall key
1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6379> hget myHash name
"jitwxs"
127.0.0.1:6379> hmget myHash age sex
1) "20"
2) "male"
127.0.0.1:6379> hgetall myHash
1) "name"
2) "jitwxs"
3) "age"
4) "20"
5) "sex"
6) "male"

2.3 删除

含义 方法
删除指定 key 一个或多个 field hdel key field[field2…]
清空 Hash del key
1
2
3
4
127.0.0.1:6379> hdel myHash name
(integer) 1
127.0.0.1:6379> hdel myHash age sex
(integer) 2
1
2
3
4
5
6
127.0.0.1:6379> hmset myHash name jitwxs age 20 sex male
OK
127.0.0.1:6379> del myHash
(integer) 1
127.0.0.1:6379> hgetall myHash
(empty list or set)

2.4 扩展命令

含义 方法
判断指定 key 中 field 是否存在 hexists key field
返回指定 key 中 field 的数量 hlen key
获取指定 key 中所有的 field hkeys key
获取指定 key 中所有的 value hvals key
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> hmset myHash name jitwxs age 20 sex male
OK
127.0.0.1:6379> hexists myHash name
(integer) 1
127.0.0.1:6379> hexists myHash unknown
(integer) 0
127.0.0.1:6379> hlen myHash
(integer) 3
127.0.0.1:6379> hkeys myHash
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hvals myHash
1) "jitwxs"
2) "20"
3) "male"

三、List 类型

Redis 的 List 类型有点像 Java 中的 LinkList,内部实现是一个双向链表,双向链表的知识点参考文章:《数据结构 第二章 线性表》

3.1 添加

含义 方法
从左端添加多个value lpush key value[value2…]
从右端添加多个value rpush key value[value2…]

注: 如果 key 不存在会先创建 key,然后添加。

1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6379> lpush myList a b c
(integer) 3
127.0.0.1:6379> lrange myList 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> rpush myList2 1 2 3
(integer) 3
127.0.0.1:6379> lrange myList2 0 -1
1) "1"
2) "2"
3) "3"

3.2 查看

含义 方法
获取 list 从 start 到 end 的值 lrange key start end
获取 list 中元素数量 llen key

因为 List 内部是一个双向链表,因此链表首元素下标为0,尾元素下标为-1,因此查看所有元素即:lrange key 0 -1

3.3 删除

含义 方法
返回并弹出左端元素 lpop key
返回并弹出右端元素 rpop key

注: 如果 key 不存在,返回nil。

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> lpush myList a b c
(integer) 3
127.0.0.1:6379> lrange myList 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> lpop myList
"c"
127.0.0.1:6379> rpop myList
"a"

3.4 扩展命令

3.4.1 添加前检查 key 的存在性

含义 方法
从左端添加多个 value lpushx key value[value2…]
从右端添加多个 value rpushx key value[value2…]

这两个方法加了 x 的和之前不加 x 的不同之处是:如果 key 不存在,将不进行插入

1
2
3
4
5
6
127.0.0.1:6379> del myList
(integer) 1
127.0.0.1:6379> lpushx myList a b c
(integer) 0
127.0.0.1:6379> lrange myList 0 -1
(empty list or set)

3.4.2 根据 value 删除

含义 方法
删除 count 个值为 value 的元素 lrem key count value

若 count > 0,则从左到右删除:

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

若 count < 0,则从右向左删除:

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

若 count = 0,删除所有:

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

3.4.3 根据下标设置 value

含义 方法
设置下标为 index 的元素值。0代表最左边元素,-1代表最右边元素,下标不存在时抛出异常。 lset key index value
1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> rpush myList 1 2 3
(integer) 3
127.0.0.1:6379> lset myList 1 5
OK
127.0.0.1:6379> lrange myList 0 -1
1) "1"
2) "5"
3) "3"
127.0.0.1:6379> lset myList 3 5
(error) ERR index out of range

3.4.4 相对于某元素插入 value

含义 方法
在 pivot 元素前插入value linsert key before pivot value
在p ivot 元素后插入value linsert key after pivot value

注:如果 pivot 不存在,不插入。

1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6379> rpush myList 1 2 3
(integer) 3
127.0.0.1:6379> linsert myList before 2 a
(integer) 4
127.0.0.1:6379> linsert myList after 2 b
(integer) 5
127.0.0.1:6379> lrange myList 0 -1
1) "1"
2) "a"
3) "2"
4) "b"
5) "3"

3.4.5 将链表 A 右边元素移出并添加到链表B 左边

含义 方法
将链表 A 右边元素移出并添加到链表 B 左边 rpoplpush listA listB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
127.0.0.1:6379> rpush myListA 1 2 3
(integer) 3
127.0.0.1:6379> rpush myListB a b c
(integer) 3
127.0.0.1:6379> rpoplpush myListA myListB
"3"
127.0.0.1:6379> lrange myListA 0 -1
1) "1"
2) "2"
127.0.0.1:6379> lrange myListB 0 -1
1) "3"
2) "a"
3) "b"
4) "c"
127.0.0.1:6379> rpoplpush myListA myListA
"2"
127.0.0.1:6379> lrange myListA 0 -1
1) "2"
2) "1"

四、Set 类型

Redis 的 Set 类型和 Java 中的 Set 类型一样,它具有两个重要的特点:无序性唯一性,具体不再赘述。

4.1 基本操作

含义 方法
向 set 中添加成员,如果成员已存在,不再添加 sadd key member[member2…]
向 set 中删除成员 srem key member[member2…]
获取 set 中所有成员 smembers key
判断指定成员是否存在于 set 中 sismember key member
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> sadd mySet 1 2 3
(integer) 3
127.0.0.1:6379> smembers mySet
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> srem mySet 2 3 5
(integer) 2
127.0.0.1:6379> smembers mySet
1) "1"
127.0.0.1:6379> sismember mySet 1
(integer) 1
127.0.0.1:6379> sismember mySet 2
(integer) 0

4.2 集合操作

含义 方法
集合的差集 sdiff key1 key2[key3…]
集合的交集 sinter key1 key2[key3…]
集合的并集 sunion key1 key2[key3…]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
127.0.0.1:6379> sadd mySet1 a b c 1
(integer) 4
127.0.0.1:6379> sadd mySet2 1 2 3 b
(integer) 4
127.0.0.1:6379> sdiff mySet1 mySet2
1) "a"
2) "c"
127.0.0.1:6379> sdiff mySet2 mySet1
1) "2"
2) "3"
127.0.0.1:6379> sinter mySet1 mySet2
1) "1"
2) "b"
127.0.0.1:6379> sunion mySet1 mySet2
1) "c"
2) "1"
3) "b"
4) "2"
5) "a"
6) "3"

4.3 扩展命令

含义 方法
求 set 中成员数量 scard key
随即返回一个成员 srandmember key
将多个集合的差集存储在 desc 中 sdiffstore desc key1 key2[key3…]
将多个集合的交集存储在 desc 中 sinterstore desc key1 key2[key3…]
将多个集合的并集存储在 desc 中 sunionstore desc key1 key2[key3…]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
127.0.0.1:6379> smembers mySet1
1) "a"
2) "c"
3) "1"
4) "b"
127.0.0.1:6379> smembers mySet2
1) "3"
2) "b"
3) "2"
4) "1"
127.0.0.1:6379> scard mySet1
(integer) 4
127.0.0.1:6379> srandmember mySet1
"c"
127.0.0.1:6379> sdiffstore mySet3 mySet1 mySet2
(integer) 2
127.0.0.1:6379> smembers mySet3
1) "a"
2) "c"

五、SortedSet 类型

SortedSet 和 Set 的区别是,SortedSet 中每一个成员都有一个 score(分数)与之关联,Redis 通过 score 来为集合中的元素进行排序(默认为升序)。

5.1 添加/获取元素

含义 方法
添加成员。如果成员存在,会用新的 score 替代原有的 score,返回值是新加入到集合中的成员个数 zadd key score member[score2 member2… ]
获取指定成员的 score zscore key member
获取 key 中成员个数 scard key
获取集合中下标从 start 到 end 的成员,[withscores]表明返回的成员包含其 score zrange key start end[withscores]
上面方法的反转 zrevrange key start end[withscores]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
127.0.0.1:6379> zadd mySort 82 wangnima 100 cat 33 dog 43 jitwxs 80 zhouyang 60 liuchang
(integer) 6
127.0.0.1:6379> zscore mySort jitwxs
"100"
127.0.0.1:6379> zcard mySort
(integer) 6
127.0.0.1:6379> zrange mySort 0 -1
1) "dog"
2) "liuchang"
3) "zhouyang"
4) "wangnima"
5) "cat"
6) "jitwxs"
127.0.0.1:6379> zrange mySort 0 -1 withscores
1) "dog"
2) "33"
3) "liuchang"
4) "60"
5) "zhouyang"
6) "80"
7) "wangnima"
8) "82"
9) "cat"
10) "100"
11) "jitwxs"
12) "100"
127.0.0.1:6379> zrevrange mySort 0 -1 withscores
1) "jitwxs"
2) "100"
3) "cat"
4) "100"
5) "wangnima"
6) "82"
7) "zhouyang"
8) "80"
9) "liuchang"
10) "60"
11) "dog"
12) "33"

5.2 删除元素

含义 方法
删除成员 zrem key member[member2…]
按照下标范围删除成员 zremrangebyrank key start stop
按照 score 范围删除成员 zremrangebyscore key min max
1
2
3
4
127.0.0.1:6379> zrem mySort wangnima
(integer) 1
127.0.0.1:6379> zcard mySort
(integer) 5
1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6379> zrange mySort 0 -1
1) "dog"
2) "liuchang"
3) "zhouyang"
4) "cat"
5) "jitwxs"
127.0.0.1:6379> zremrangebyrank mySort 0 2
(integer) 3
127.0.0.1:6379> zrange mySort 0 -1
1) "cat"
2) "jitwxs"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
127.0.0.1:6379> zrange mySort 0 -1 withscores
1) "dog"
2) "33"
3) "jitwxs"
4) "43"
5) "liuchang"
6) "60"
7) "zhouyang"
8) "80"
9) "wangnima"
10) "82"
11) "cat"
12) "100"
127.0.0.1:6379> zremrangebyscore mySort 50 85
(integer) 3
127.0.0.1:6379> zrange mySort 0 -1 withscores
1) "dog"
2) "33"
3) "jitwxs"
4) "43"
5) "cat"
6) "100"

5.3 扩展方法

含义 方法
返回 score 在[min,max]的成员并按照 score 排序。[withscores]:显示 score;[limit offset count]:从 offst 开始返回 count 个成员 zrangebyscore key min max[withscores][limit offset count]
设置指定成员增加的分数,返回值是修改后的分数 zincrby key increment member
获取分树在[min,max]的成员数量 zcount key min max
返回成员在集合中的排名(升序) zrank key member
返回成员在集合中的排名(降序) zrevrank key member
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
127.0.0.1:6379> zrange mySort 0 -1 withscores
1) "dog"
2) "33"
3) "jitwxs"
4) "43"
5) "liuchang"
6) "60"
7) "zhouyang"
8) "80"
9) "wangnima"
10) "82"
11) "cat"
12) "100"
127.0.0.1:6379> zrangebyscore mySort 30 86 limit 2 3
1) "liuchang"
2) "zhouyang"
3) "wangnima"
127.0.0.1:6379> zcount mySort 0 60
(integer) 3
127.0.0.1:6379> zincrby mySort 17 jitwxs
"60"
127.0.0.1:6379> zrank mySort jitwxs
(integer) 1
127.0.0.1:6379> zrevrank mySort jitwxs
(integer) 4

六、key 的通用命令

含义 方法
获取所有于 pattern 匹配的 key。*:任意一个或多个字符,?:任意一个字符 keys pattern
删除指定 key del key[key2…]
判断 key 是否存在 exists key
为 key 重命名 rename key newKey
设置过期时间(单位s) expire key
获 取key 剩余的过期时间(单位s)。若没有设置过期时间,返回-1;超时不存在返回-2 ttl key
获取 key 类型,key 不存在返回none type key

注:如果你设置了一个 key 的过期时间,如果又不想让它过期,可以执行命令 persist key

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
127.0.0.1:6379> keys *
1) "unknown"
2) "mySet2"
3) "float_num"
4) "myListB"
5) "mySet3"
6) "userName"
7) "myListA"
8) "int_num"
9) "mySort"
10) "mySet1"
127.0.0.1:6379> del unknown
(integer) 1
127.0.0.1:6379> type myListA
list
127.0.0.1:6379> rename myListA myList
OK
127.0.0.1:6379> exists myListA
(integer) 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> ttl mySort
(integer) -1
127.0.0.1:6379> expire mySort 30
(integer) 1
127.0.0.1:6379> ttl mySort
(integer) -2
127.0.0.1:6379> keys *
1) "mySet2"
2) "myList"
3) "float_num"
4) "myListB"
5) "mySet3"
6) "userName"
7) "int_num"
8) "mySet1"