Redis使用入门
Redis数据结构
redis支持的数据类型:
- string(字符串)
- string是redis基本数据类型,一个key对应一个value,最大可以存储512MB
- 是二进制安全的,可以包含任何数据,比如图片比如序列化对象
- 使用如下:
1
2
3
4redis 127.0.0.1:6379> SET testkey" testValue"
OK
redis 127.0.0.1:6379> GET testKey
"testValue"
Hash(哈希)
- 是键值对key->value的集合
- 即string类型的filed和value的映射表,适合存储对象。
- 使用如下:
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
30redis> HMSET myhash testfield1 "testValue" testField2 "testValue2"
"OK"
redis> HGET myhash testField1
"testValue"
```
- List(列表)
就是简单的字符串列表,但是可以方便地添加在列表头或者尾。使用如下:
```cmd
redis 127.0.0.1:6379> lpush testList element1
(integer) 1
redis 127.0.0.1:6379> lpush testList element2
(integer) 2
redis 127.0.0.1:6379> lpush testList element3
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 4
1) "element3"
2) "element2"
3) "element1"
redis 127.0.0.1:6379>
```
- Set(集合)
string类型的无序集合通过哈希表实现,时间复杂度都是O(1),使用如下:
```cmd
redis 127.0.0.1:6379> sadd test redis
(integer) 1
redis 127.0.0.1:6379> sadd test mongodb
(integer) 1
redis 127.0.0.1:6379> smembers test
1) "redis"
2) "mongodb"
zSet(sorted set: 有序集合)
与set的区别主要在于有序,每一个元素都会关联一个double对类型的分数,redis通过这个分数为集合中的成员进行升序排序,其中的成员必须唯一的,但是其分数(score)却是可以重复的,以下查看使用区别:1
2
3
4
5
6
7
8
9
10
11
12redis 127.0.0.1:6379> zadd testZset 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd testZset 0 mongodb
(integer) 1
redis 127.0.0.1:6379> > ZRANGEBYSCORE testZset 0 1000
1) "mongodb"
3) "redis"
```
## Redis命令
redis命令需要redis客户端环境才可以使用。其客户端语法为:
```cmd
redis-cli //此命令即可进入redis客户端环境在远程服务上使用命令
1
redis-cli -h host -p port -a password//该形式即利用redis-cli客户端远程使用其他主机的redis服务
还有许多关乎集合的命令网上的手册。
redis HyPerLogLog
用于做基数统计的算法,优点是在输入元素的数量或者体积特别大的时候,计算基数所偶需要的空间总是固定的,并且很小。HyperLogLog只会根据输入元素来计算基数,而不会存储输入元素本身,所以不能返回各个元素。使用如下:1
2
3
4
5
6
7
8
9
10
11
12
13redis 127.0.0.1:6379> PFADD runoobkey "redis"
1) (integer) 1
redis 127.0.0.1:6379> PFADD runoobkey "mongodb"
1) (integer) 1
redis 127.0.0.1:6379> PFADD runoobkey "mysql"
1) (integer) 1
redis 127.0.0.1:6379> PFCOUNT runoobkey
redis 发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。使用如下: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//首先订阅redisChat频道
redis 127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
//重开一个redis客户端,然后在同一频道redisChat发布两次消息,订阅者就额可以收到
redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"
(integer) 1
redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by runoob.com"
(integer) 1
//订阅者的客户端会显示如下消息
1) "message"
2) "redisChat"
3) "Redis is a great caching technique"
1) "message"
2) "redisChat"
3) "Learn redis by runoob.com"
```
### redis事务
1. 批量操作在发送 EXEC 命令前被放入队列缓存。
2. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
3. 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中
4. 使用如下:
```cmd
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
2) "C++"
3) "Programming"
值得注意的是虽然单个redis的命令执行是原子性的,但是其事务却不是原子性的