Redis相较于其它的数据库虽然简单,但是要熟记所有命令的用法也并非易事。一个简单的技巧是通过要操作的数据类型来将这些命令进行结构化。
数据类型和对应命令
所有存储于redis中的数据都对应于一个键值对(key-value pair), key可以是任意二进制序列,通常我们使用字符串来标记一个特定的key。在redis中我们通常称这个key为name或者就叫key, 而对于value,redis支持如下几种类型:
- strings
- lists: list内容只能是string
- sets: set中存储非重复的string
- sorted sets: 与sets类似,但是每个string都会对应一个float类型的score,从而用于排序
- hashes: 键值对hash类型,也就是Python中的dict,注意在redis中最外层的key一般叫做name或者key,而value中数据类型如果是dict,那么这个dict中的key通常被称为field。
- Bit arrays (or simply bitmaps): 实际存储的仍然是string,但是可以针对bit进行操作
- HyperLogLogs: 用于估计unique value的数量
针对不同的数据类型,会有不同的命令,通过如下脑图可以更加清晰地记忆redis的命令
strings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19127.0.0.1:6379> set strtest xyz
OK
127.0.0.1:6379> get strtest
"xyz"
127.0.0.1:6379> mset a 1 b 2 c 3
OK
127.0.0.1:6379> mget a b c
1) "1"
2) "2"
3) "3"
# 注意以下增减操作只能针对整数数字(虽然类型仍然是string类型)
127.0.0.1:6379> incr a
(integer) 2
127.0.0.1:6379> incrby b 5
(integer) 7
127.0.0.1:6379> decr b
(integer) 6
127.0.0.1:6379> decrby b 3
(integer) 3
lists
lists类型中存储的仍然是string类型
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# left push用于从左将item压入到list当中
127.0.0.1:6379> lpush list_test 1 2 3
(integer) 3
# 注意如果想看list中的内容,无法通过get直接去看,get只是针对string,而必须使用lrange
127.0.0.1:6379> get list_test
(error) WRONGTYPE Operation against a key holding the wrong kind of value
# 这里0 -1均为list index,表示从index 0 开始到-1结束,-1即从右数最后一个item
127.0.0.1:6379> lrange list_test 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> rpush list_test 5 7
(integer) 5
127.0.0.1:6379> lrange list_test 0 -1
1) "3"
2) "2"
3) "1"
4) "5"
5) "7"
127.0.0.1:6379> lpop list_test
"3"
127.0.0.1:6379> lrange list_test 0 -1
1) "2"
2) "1"
3) "5"
4) "7"
# 从左trim截断list,以下是截取index 0 到index 2 的item作为新的list
127.0.0.1:6379> ltrim list_test 0 2
OK
127.0.0.1:6379> lrange list_test 0 -1
1) "2"
2) "1"
3) "5"
hashes (dict)
哈希类型,在python中也就是dict类型。这也是非常常用的数据类型。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
251 hset htest a
(integer) 1
hget htest a
"1"
1 b 2 c 3 hmset htest a
OK
hmget htest a b c
1) "1"
2) "2"
3) "3"
hgetall htest
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
hkeys htest
1) "a"
2) "b"
3) "c"
hvals htest
1) "1"
2) "2"
3) "3"
在python程序中使用redis-py driver的时候,通过dict进行操作会非常清晰和简单。
1
2
3
4
5
6
7
8
9
10
11
12
13In [1]: import redis
In [2]: r = redis.StrictRedis(host='localhost', port=6379, db=0)
In [3]: d = {"a": 2, "b": 3}
In [4]: key = "test:2"
In [5]: r.hmset(key, d)
Out[5]: True
In [6]: r.hgetall(key)
Out[6]: {'a': '2', 'b': '3'}
sets
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
4033 sadd set_test a b
(integer) 3
22 sadd set_test c a b
(integer) 1
# 可以看到不会有重复的item
smembers set_test
1) "c"
2) "33"
3) "a"
4) "b"
# 用于测试set中是否包含指定的item,如有则返回1,没有返回0
sismember set_test a
(integer) 1
sismember set_test xx
(integer) 0
56 66 sadd set_test2 a b
(integer) 4
smembers set_test2
1) "56"
2) "a"
3) "66"
4) "b"
# 求交集
sinter set_test set_test2
1) "a"
2) "b"
# 求并集
sunion set_test set_test2
1) "33"
2) "a"
3) "56"
4) "c"
5) "66"
6) "22"
7) "b"
sorted sets
sorted sets与sets类似,可以保证item不重复,区别在于sorted sets中每个item对应一个float类型的score
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24127.0.0.1:6379> zadd sort_set 2.2 a
(integer) 1
127.0.0.1:6379> zadd sort_set 2 bb
(integer) 1
127.0.0.1:6379> zadd sort_set 10 x
(integer) 1
# 获取index 从0 到-1的(即所有) items
127.0.0.1:6379> zrange sort_set 0 -1
1) "bb"
2) "a"
3) "x"
# 获取item bb对应的index
127.0.0.1:6379> zrank sort_set bb
(integer) 0
127.0.0.1:6379> zrank sort_set x
(integer) 2
127.0.0.1:6379> zscore sort_set x
"10"
# 用于获取对应score set中item的数量
127.0.0.1:6379> zcard sort_set
(integer) 3
bit arrays
用于针对指定的key设置位数据为0 或 1。当我们对存储有较高要求,且对于统计为1的item的数量时,使用bit array是一个好的办法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 针对bit 7进行设置,设置为1,返回该位之前存储的值
127.0.0.1:6379> setbit bit_test 7 1
(integer) 0
127.0.0.1:6379> setbit bit_test 7 0
(integer) 1
127.0.0.1:6379> get bit_test
"\x00"
127.0.0.1:6379> setbit bit_test 8 1
(integer) 0
127.0.0.1:6379> setbit bit_test 9 1
(integer) 0
# 统计有多少位为1
127.0.0.1:6379> bitcount bit_test
(integer) 2
HyperLogLogs
redis实现了相应算法可以估计hyperloglog中存储的所有item中非重复的item的数量
1
2
3
4127.0.0.1:6379> pfadd loglog 1 3 5 7 1
(integer) 1
127.0.0.1:6379> pfcount loglog
(integer) 4
通用的命令
- keys pattern: pattern可以为glob风格的通配符格式,最常用的是
keys *
查询所有的keys - exists key: 查询该key是否存在
- del key: 删除该key对应的数据
- type key: 查询该key对应的value的数据类型
- expire key: 定义多长时间后key对应的数据过期,过期后数据会被自动删除
- ttl key: 查询该key对应的剩余存活时间
- flushdb/flushall: flushdb用于清除当前db的所有数据,flushall清除所有数据库的数据