初识Redis

什么是Redis?

Redis 是一个使用 C 语言写成的高性能非关系型数据库。它支持存储的多种数据 类型,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和 hash(哈希类型)。Redis的数据都基于缓存的,所以很快,每秒可以处理超过 10万次读写操 作。为保证数据的安全不丢失,也可以实现数据写入磁盘中,而且Redis的操作是原子性(对数据的更改要么全部执行,要么全部不执行 )的。

优缺点

  • 优点:
    • 读写性能优异,Redis能读的速度是11万次/s,写的速度是81000次/s
    • 支持数据的持久化(AOF和RDB)
    • 支持事务,redis所有操作都是原子性的
    • 数据结构丰富
  • 缺点:
    • 数据库容量受到物理内存的限制
    • 不具备恢复功能,最怕主机宕机

Redis为什么这么快

  1. 完全基于内存,速度非常快
  2. 采用单线程,避免了上下文切换所耗费的时间,也不会有各种锁问题的性能消耗
  3. 使用多路I/O复用模型,非阻塞IO
  4. 底层模型是Redis自己构建了VM机制

Redis基本命令

清除当前数据库

1
flushdb

清除所有数据库

1
flushall

设置过期时间

1
2
3
4
-- key在10秒后过期,一般用于设置用户的cookie
expire name 10
-- 查看当前key 的剩余时间
ttl name
1
2
3
4
5
6
7
8
9
10
-- 判断key是否存在
exists name

-- 移动当前key到某个数据库
move key db
-- 删除当前key
del key

-- 查看key 的类型
type key

String类型的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
127.0.0.1:6379> set stu zhangsan
OK
127.0.0.1:6379> get stu
"zhangsan"
127.0.0.1:6379> type stu
string
127.0.0.1:6379> exists stu
(integer) 1

-- 追加字符串,若果没有当前key,则set该key
127.0.0.1:6379> append stu name
(integer) 12
127.0.0.1:6379> get stu
"zhangsanname"

-- 获取字符串长度
127.0.0.1:6379> strlen stu
(integer) 12

incr 和decr

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
127.0.0.1:6379> clear
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> decr views
(integer) -1

-- 加步长
127.0.0.1:6379> incrby views 10
(integer) 9
127.0.0.1:6379> incrby views 10
(integer) 19
127.0.0.1:6379> decrby views 5
(integer) 14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1:6379> keys *
1) "stu"
2) "views"
127.0.0.1:6379> get stu
"zhangsanname"

-- 字符串范围
127.0.0.1:6379> getrange stu 0 4
"zhang"
127.0.0.1:6379> getrange stu 0 -1
"zhangsanname"

-- 替换
127.0.0.1:6379> setrange stu 4 xxx
(integer) 12
127.0.0.1:6379> get stu
"zhanxxxnname"
  • setex (set with expire) 设置过期时间
  • setnx (set if not eixst) 不存在再设置,在分布式锁中会常使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
127.0.0.1:6379> setex key2 30 "hello"
OK
127.0.0.1:6379> ttl key2
(integer) 23
127.0.0.1:6379> setnx mykey "jin"
(integer) 1
127.0.0.1:6379> setnx mykey "yolin"
(integer) 0
127.0.0.1:6379> get mykey
"jin"
127.0.0.1:6379> keys *
1) "stu"
2) "mykey"
3) "views"

mset和mget

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> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
3) "k3"
-- 同时获取多个值
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> mset k1 v1
OK
127.0.0.1:6379> msetnx k1 v1
(integer) 0
-- msetnx是一个原子性操作,要么都成功,要么都失败
127.0.0.1:6379> msetnx k1 v1 k4 v4
(integer) 0
127.0.0.1:6379> get k4
(nil)
127.0.0.1:6379>

getset

先get后set

  • 如果不存在值,返回nil,再set
  • 存在值,get原来值,set新的值
    1
    2
    3
    4
    5
    6
    7
    8
    127.0.0.1:6379> getset db redis
    (nil)
    127.0.0.1:6379> get db
    "redis"
    127.0.0.1:6379> getset db mongodb
    "redis"
    127.0.0.1:6379> get db
    "mongodb"

Set类型的使用

Set中的值是不重复的

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
-- set集合中添加元素
127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "yolin"
(integer) 1
127.0.0.1:6379> sadd myset "jin"
(integer) 1

-- 查看指定set的所有值
127.0.0.1:6379> smembers myset
1) "yolin"
2) "hello"
3) "jin"

-- 判断某个值是否在集合中
127.0.0.1:6379> sismember myset "jin"
(integer) 1
127.0.0.1:6379> sismember myset "hhhh"
(integer) 0

-- 获取set集合元素个数
127.0.0.1:6379> scard myset
(integer) 3

-- 元素不可重复
127.0.0.1:6379> sadd myset "hello"
(integer) 0

-- 删除元素
127.0.0.1:6379> srem myset hello
(integer) 1
127.0.0.1:6379> scard myset
(integer) 2


-- 随机抽选出一个元素
127.0.0.1:6379> srandmember myset
"jin"
127.0.0.1:6379> srandmember myset
"yolin"
127.0.0.1:6379> srandmember myset
"yolin"

-- 随机抽选指定个数的元素
127.0.0.1:6379> srandmember myset 2
1) "yolin"
2) "jin"

-- 随机删除
127.0.0.1:6379> spop myset
"jin"


127.0.0.1:6379> sadd myset "florence"
(integer) 1
127.0.0.1:6379> sadd myset "florence2"
(integer) 1
127.0.0.1:6379> sadd myset "florence3"
(integer) 1
127.0.0.1:6379> sadd myset2 "XXXX"
(integer) 1
-- 将一个指定的值移动到另一个set集合
127.0.0.1:6379> smove myset myset2 florence
(integer) 1
127.0.0.1:6379> smembers myset2
1) "XXXX"
2) "florence"


127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
-- 差集
127.0.0.1:6379> sdiff key1 key2
1) "a"
2) "b"
127.0.0.1:6379> sdiff key2 key1
1) "d"
2) "e"
-- 交集
127.0.0.1:6379> sinter key1 key2
1) "c"
-- 并集
127.0.0.1:6379> sunion key1 key2
1) "a"
2) "b"
3) "c"
4) "e"
5) "d"

Hash(哈希)类型的使用

Map集合,key-map(值是map集合),本质和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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
-- set和get一个字段值
127.0.0.1:6379> hset myhash field1 jin
(integer) 1
127.0.0.1:6379> hget myhash field1
"jin"
-- set和get多个字段值
127.0.0.1:6379> hmset myhash field1 hello field2 world
OK
127.0.0.1:6379> hmget myhash field1 field2
1) "hello"
2) "world"
-- 获取全部值(键值对)
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "hello"
3) "field2"
4) "world"
-- 只获得键
127.0.0.1:6379> hkeys myhash
1) "field2"
2) "field1"
-- 只获得值
127.0.0.1:6379> hvals myhash
1) "world"
2) "hello"



-- 删除指定key
127.0.0.1:6379> hdel myhash field1
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
-- 获取字段数量
127.0.0.1:6379> hlen myhash
(integer) 1
-- 判断hash中指定字段是否存在
127.0.0.1:6379> hexists myhash field1
(integer) 0
127.0.0.1:6379> hexists myhash field2
(integer) 1


127.0.0.1:6379> hset myhash field3 5
(integer) 1
-- 指定增量
127.0.0.1:6379> hincrby myhash field3 1
(integer) 6
-- 如果不存在则可以设置
127.0.0.1:6379> hsetnx myhash field4 hello
(integer) 1
-- 存在则不能设置
127.0.0.1:6379> hsetnx myhash field4 world
(integer) 0

Zset类型的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 创建第一组元素mykey
127.0.0.1:6379> pfadd mykey a b c d e f g h i j
(integer) 1
127.0.0.1:6379> pfcount mykey
(integer) 10
-- 创建第二组元素mykey2
127.0.0.1:6379> pfadd mykey2 i j z x c v b n m
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 9
-- 合并两组mykey3(并集)
127.0.0.1:6379> pfmerge mykey3 mykey mykey2
OK
-- 看元素的数量
127.0.0.1:6379> pfcount mykey3
(integer) 15

请我喝杯咖啡吧~

支付宝
微信