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 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 类型
- # 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 类型. 这也是非常常用的数据类型.
- 127.0.0.1:6379> hset htest a 1
- (integer) 1
- 127.0.0.1:6379> hget htest a
- "1"
- 127.0.0.1:6379> hmset htest a 1 b 2 c 3
- OK
- 127.0.0.1:6379> hmget htest a b c
- 1) "1"
- 2) "2"
- 3) "3"
- 127.0.0.1:6379> hgetall htest
- 1) "a"
- 2) "1"
- 3) "b"
- 4) "2"
- 5) "c"
- 6) "3"
- 127.0.0.1:6379> hkeys htest
- 1) "a"
- 2) "b"
- 3) "c"
- 127.0.0.1:6379> hvals htest
- 1) "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]: True
- In [6]: r.hgetall(key)
- Out[6]: {'a': '2', 'b': '3'}
- sets
- 127.0.0.1:6379> sadd set_test a b 33
- (integer) 3
- 127.0.0.1:6379> sadd set_test c a b 22
- (integer) 1
- # 可以看到不会有重复的 item
- 127.0.0.1:6379> smembers set_test
- 1) "c"
- 2) "33"
- 3) "a"
- 4) "b"
- # 用于测试 set 中是否包含指定的 item, 如有则返回 1, 没有返回 0
- 127.0.0.1:6379> sismember set_test a
- (integer) 1
- 127.0.0.1:6379> sismember set_test xx
- (integer) 0
- 127.0.0.1:6379> sadd set_test2 a b 56 66
- (integer) 4
- 127.0.0.1:6379> smembers set_test2
- 1) "56"
- 2) "a"
- 3) "66"
- 4) "b"
- # 求交集
- 127.0.0.1:6379> sinter set_test set_test2
- 1) "a"
- 2) "b"
- # 求并集
- 127.0.0.1:6379> 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
- 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 的 (即所有) 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 是一个好的办法.
- # 针对 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 * 查询所有的 keys
exists key: 查询该 key 是否存在
del key: 删除该 key 对应的数据
type key: 查询该 key 对应的 value 的数据类型
expire key: 定义多长时间后 key 对应的数据过期, 过期后数据会被自动删除
ttl key: 查询该 key 对应的剩余存活时间
flushdb/flushall: flushdb 用于清除当前 db 的所有数据, flushall 清除所有数据库的数据
来源: http://www.jianshu.com/p/cd434a19c822