Redis
是一个使用ANSI C
编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库,常用于数据缓存,排行,消息队列等功能
常用命令
命令 | 说明 | 时间复杂度 |
---|---|---|
keys [pattern] | 遍历所有key | O(N) |
dbsize | 查询存储数量 | O(1) |
exists | 检查key是否存在 | O(1) |
del key | 删除指定的key-value | O(1) |
expire key seconds | key在seconds秒后过期 | O(1) |
ttl key | 查看key剩余的过期时间 | O(1) |
persist key | 去掉key的过期时间 | O(1) |
type key | 返回key的类型 | O(1) |
rename key newKey | 修改key的名称 | O(1) |
flushall | 清空所有数据 | O(1) |
演示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➜ redis-cli
127.0.0.1:6379> set msg1 hello
OK
127.0.0.1:6379> set msg2 world
OK
127.0.0.1:6379> keys msg*
1) "msg1"
2) "msg2"
127.0.0.1:6379> del msg2
(integer) 1
127.0.0.1:6379> keys msg*
1) "msg1"
127.0.0.1:6379> dbsize
(integer) 1
127.0.0.1:6379> exists msg1
(integer) 1
127.0.0.1:6379> expire msg1 60
(integer) 1
127.0.0.1:6379> ttl msg1
(integer) 55
127.0.0.1:6379> persist msg1
(integer) 1
127.0.0.1:6379> ttl msg1
(integer) -1
127.0.0.1:6379> type msg1
string
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty list or set)
数据结构
如上图所示,Redis
虽然是键值对存储数据库,但是不仅仅是简单的key-value
格式,它的数据结构分为String
(字符串), Hash
(字典), List
(列表), Set
(集合), ZSet
(有序集合)五种,下面分别介绍一下
String
String
是最常用的key-value
格式,内容可以是字符串(json字符串),数字,以及二进制
API
命令 | 说明 | 时间复杂度 |
---|---|---|
get key | 获取key对应的value | O(1) |
set key value | 设置key value | O(1) |
del key | 删除key-value | O(1) |
incr | key自增1, 如果key不存在,自增后get(key) = 1 | O(1) |
decr | key自减1, 如果key不存在,自增后get(key) = -1 | O(1) |
incrby key k | key自增k, 如果key不存在,自增后get(key) = k | O(1) |
decr key k | key自减k, 如果key不存在,自增后get(key) = -k | O(1) |
setnx key value | key不存在,才设置 | O(1) |
set key value xx | key存在,才设置 | O(1) |
mget key1 key2 key3 | 批量获取key,原子操作 | O(N) |
mset key1 value1 key2 value2 | 批量设置key-value | O(1) |
getset key newvalue | set key newvalue并返回旧的value | O(1) |
append key value | 将value追加到旧的value | O(1) |
strlen key | 返回字符串的长度(注意中文,utf8下一个中文占用3个字符) | O(1) |
incrbyfloat key 3.5 | 增加key对应的值3.5 | O(1) |
getrange key start end | 获取字符串指定下标所有的值 | O(1) |
setrange key index value | 设置指定下标所有对应的值 | O(1) |
演示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➜ redis-cli
127.0.0.1:6379> set msg hello
OK
127.0.0.1:6379> get msg
"hello"
127.0.0.1:6379> incr number
(integer) 1
127.0.0.1:6379> get number
"1"
127.0.0.1:6379> incrby number 10
(integer) 11
127.0.0.1:6379> setnx msg test
(integer) 0
127.0.0.1:6379> set number 20 xx
OK
127.0.0.1:6379> get number
"20"
127.0.0.1:6379> append msg world
(integer) 10
127.0.0.1:6379> get msg
"helloworld"
127.0.0.1:6379> strlen msg
(integer) 10
127.0.0.1:6379> mget msg number
1) "helloworld"
2) "20"
Hash
哈希键值结构区别于String
的key-value
格式,使用了key-filed-value
的形式,如下图
API
命令 | 说明 | 时间复杂度 |
---|---|---|
hset key field | 设置hash key对应field的value | O(1) |
hget key field | 获取hash key对应field的value | O(1) |
hdel key field | 获取hash key对应field的value | O(1) |
hexists key field | 判断hash key 是否有field | O(1) |
hlen key | 获取hash key field的数量 | O(1) |
hmget key field1 field2…fieldN | 批量获取hash key的一批field对应的值 | O(N) |
hset key field1 value1 …fieldN valueN | 批量设置hash key的一批field value | O(1) |
hgetall key | 返回hash key对应所有的field和value | O(N) |
hvals key | 返回hash key对应所有的field的value | O(N) |
hkeys key | 返回hash key对应所有的field | O(N) |
hsetnx key field value | 设置has key 对应的field的value(如果field已经存在,则失败) | O(1) |
hincrby key field intCounter | hash key对应的field的value自增intCounter | O(1) |
hincrbyfloat key field floatCounter | 浮点数版本hincrby | O(1) |
演示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➜ redis-cli
127.0.0.1:6379> hset user name liyu
(integer) 1
127.0.0.1:6379> hset user age 23
(integer) 1
127.0.0.1:6379> hget user name
"liyu"
127.0.0.1:6379> hexists user gender
(integer) 0
127.0.0.1:6379> hexists user name
(integer) 1
127.0.0.1:6379> hlen user
(integer) 2
127.0.0.1:6379> hmget user name age
1) "liyu"
2) "23"
127.0.0.1:6379> hgetall user
1) "name"
2) "liyu"
3) "age"
4) "23"
127.0.0.1:6379> hincrby user age 1
(integer) 24
127.0.0.1:6379> hincrbyfloat user age 1.5
"25.5"
127.0.0.1:6379> hdel user age
(integer) 0
List
List
是一个有序的列表结构,内容可重复,可以从两侧或者中间的任意位置插入,常用于队列功能
API
命令 | 说明 | 时间复杂度 |
---|---|---|
lpush key value1,value2..valueN | 从列表左侧插入value | O(1-N) |
Rpush key value1,value2..valueN | 从列表右侧插入value | O(1-N) |
linsert key before/after value newValue | 在列表指定value前/后插入newValue | O(N) |
lpop key | 删除并返回列表左侧第一个子项 | O(1) |
rpop key | 删除并返回列表右侧第一个子项 | O(1) |
lrem key count value | (1) count>0,从左到右删除count个和value相同的子项 (2) count<0,从右到左删除 (3) count=0,删除所有 | O(N) |
ltrim key start end | 按索引范围修剪列表,不在范围内的子项将被删除 | O(N) |
lrange key start end | 获取所有范围内所有子项,不会修改列表 | O(N) |
lindex key index | 获取列表指定索引的子项 | O(1) |
llen key | 获取列表长度 | O(1) |
lset key index newValue | 设置列表指定索引值为newValue | O(N) |
blpop key timeout | lpop阻塞版本,如果列表没有子项会阻塞列表直到等待超时(timeout)或发现元素为止 | O(1) |
brpop key timeout | rpop阻塞版本 | O(1) |
演示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
40
41
42
43
44
45
46
47
48
49
50➜ redis-cli
127.0.0.1:6379> lpush list a b c d
(integer) 4
127.0.0.1:6379> rpush list e f g h
(integer) 8
127.0.0.1:6379> lrange list 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
5) "e"
6) "f"
7) "g"
8) "h"
127.0.0.1:6379> lpop list
"d"
127.0.0.1:6379> rpop list
"h"
127.0.0.1:6379> linsert list after a b
(integer) 7
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "b"
3) "a"
4) "b"
5) "e"
6) "f"
7) "g"
127.0.0.1:6379> lindex list 5
"f"
127.0.0.1:6379> lrem list 0 a
(integer) 1
127.0.0.1:6379> llen list
(integer) 6
127.0.0.1:6379> ltrim list 1 5
OK
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "b"
3) "e"
4) "f"
5) "g"
127.0.0.1:6379> lset list 1 a
OK
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "a"
3) "e"
4) "f"
5) "g"
Set
Set
是一个string
类型的无序集合,并且集合成员是唯一的不可重复的数据,包含集合间的操作,常用于数据唯一处理,得到交集等功能
API
集合内的操作:
命令 | 说明 | 时间复杂度 |
---|---|---|
sadd key value1,value2…valueN | 向集合key添加value(如果value已经存在,添加失败) | O(1) |
srem key value1,value2…valueN | 将集合key中的value移除掉 | O(1) |
scard key | 计算集合大小 | O(1) |
sismember key value | 判断value 是否在集合中 | O(1) |
srandmember key count | 从集合中随机挑count个元素 | O(1) |
spop key count | 从集合中随机删除并返回count个元素 | O(1) |
smembers key | 获取集合所有元素 | O(1) |
srem key value | 将集合key中的value移除掉 | O(1) |
集合间的操作:
命令 | 说明 | 时间复杂度 |
---|---|---|
sdiff key1 key2 | 差集 | O(1) |
sinter key1 key2 | 交集 | O(1) |
sunion key1 key2 | 并集 | O(1) |
sidff/sinter/suion + store destkey | 将差集、交集、并集保存在destkey中 | O(1) |
演示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➜ redis-cli
127.0.0.1:6379> sadd set a b c d
(integer) 4
127.0.0.1:6379> srem set b
(integer) 1
127.0.0.1:6379> scard set
(integer) 3
127.0.0.1:6379> sismember set a
(integer) 1
127.0.0.1:6379> srandmember set 2
1) "a"
2) "c"
127.0.0.1:6379> spop set 1
1) "c"
127.0.0.1:6379> smembers set
1) "a"
2) "d"
127.0.0.1:6379> srem set a
(integer) 1
127.0.0.1:6379> sadd set b c
(integer) 2
127.0.0.1:6379> sadd set2 c d e f
(integer) 4
127.0.0.1:6379> sdiff set set2
1) "b"
127.0.0.1:6379> sinter set set2
1) "c"
2) "d"
127.0.0.1:6379> sunion set set2
1) "b"
2) "f"
3) "d"
4) "c"
5) "e"
ZSet
有序集合ZSet
和集合一样也是string
类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double
类型的分数,通过分数来为集合中的成员进行从小到大的排序,有序集合的成员是唯一的,但分数(score)却可以重复,常用于排名功能
API
命令 | 说明 | 时间复杂度 |
---|---|---|
zadd key score value | 添加score和value | O(logN) |
zrem key value1,value2…valueN | 将集合中的value移除掉 | O(1) |
zscore key value | 返回元素的分数 | O(1) |
zincrby key increScore value | 增加或减少元素的分数 | O(1) |
zcard key | 返回元素的总个数 | O(1) |
zrank(zrevrank) key member | 返回元素的排名 | O(1) |
zrange(zrevrank) key start end [WITHSCORES] | 返回指定索引范围内的升序元素[分值] | O(logN + m) |
zrangebyscore(zrevrangebyscore) key minScore maxScore | 返回指定分数范围内的升序元素 | O(logN + m) |
zcount key minScore maxScore | 返回有序集合内在指定分数范围内的个数 | O(logN + m) |
zremrangebyrank key start end | 删除指定排名内的升序元素 | O(logN + m) |
zremrangebyscore key minScore maxScore | 删除指定分数内的升序元素 | O(logN + m) |
zintersti=ore destination numkeys(表示key的个数) key [key …] | 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 | |
zunionstore destination numkeys key [key …] | 计算给定的一个或多个有序集的并集,并存储在新的 key 中 |
未完待续