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的命令
Redis数据类型与常用命令
strings
127.0.0.1:6379> set strtest xyzOK127.0.0.1:6379> get strtest"xyz" 127.0.0.1:6379> mset a 1 b 2 c 3OK127.0.0.1:6379> mget a b c1) "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类型
# left push用于从左将item压入到list当中127.0.0.1:6379> lpush list_test 1 2 3(integer) 3# 注意如果想看list中的内容,无法通过get直接去看,get只是针对string,而必须使用lrange127.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即从右数最后一个item127.0.0.1:6379> lrange list_test 0 -11) "3"2) "2"3) "1"127.0.0.1:6379> rpush list_test 5 7(integer) 5127.0.0.1:6379> lrange list_test 0 -11) "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 -11) "2"2) "1"3) "5"4) "7"# 从左trim截断list,以下是截取index 0 到index 2 的item作为新的list127.0.0.1:6379> ltrim list_test 0 2OK127.0.0.1:6379> lrange list_test 0 -11) "2"2) "1"3) "5"
hashes (dict)
哈希类型,在python中也就是dict类型。这也是非常常用的数据类型。
127.0.0.1:6379> hset htest a 1(integer) 1127.0.0.1:6379> hget htest a"1"127.0.0.1:6379> hmset htest a 1 b 2 c 3OK127.0.0.1:6379> hmget htest a b c1) "1"2) "2"3) "3"127.0.0.1:6379> hgetall htest1) "a"2) "1"3) "b"4) "2"5) "c"6) "3"127.0.0.1:6379> hkeys htest1) "a"2) "b"3) "c"127.0.0.1:6379> hvals htest1) "1"2) "2"3) "3"
在python程序中使用redis-py driver的时候,通过dict进行操作会非常清晰和简单。
In [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]: TrueIn [6]: r.hgetall(key) Out[6]: {'a': '2', 'b': '3'}
sets
127.0.0.1:6379> sadd set_test a b 33(integer) 3127.0.0.1:6379> sadd set_test c a b 22(integer) 1# 可以看到不会有重复的item127.0.0.1:6379> smembers set_test1) "c"2) "33"3) "a"4) "b"# 用于测试set中是否包含指定的item,如有则返回1,没有返回0127.0.0.1:6379> sismember set_test a (integer) 1127.0.0.1:6379> sismember set_test xx (integer) 0127.0.0.1:6379> sadd set_test2 a b 56 66(integer) 4127.0.0.1:6379> smembers set_test21) "56"2) "a"3) "66"4) "b"# 求交集127.0.0.1:6379> sinter set_test set_test21) "a"2) "b"# 求并集127.0.0.1:6379> sunion set_test set_test21) "33"2) "a"3) "56"4) "c"5) "66"6) "22"7) "b"
sorted sets
sorted sets与sets类似,可以保证item不重复,区别在于sorted sets中每个item对应一个float类型的score
127.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的(即所有) items127.0.0.1:6379> zrange sort_set 0 -11) "bb" 2) "a" 3) "x" # 获取item bb对应的index127.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是一个好的办法。
# 针对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的数量
127.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 *
查询所有的keysexists key: 查询该key是否存在
del key: 删除该key对应的数据
type key: 查询该key对应的value的数据类型
expire key: 定义多长时间后key对应的数据过期,过期后数据会被自动删除
ttl key: 查询该key对应的剩余存活时间
flushdb/flushall: flushdb用于清除当前db的所有数据,flushall清除所有数据库的数据
References
作者:geekpy
链接:https://www.jianshu.com/p/cd434a19c822