0%

Redis基础学习

Redis简介

Redis为Remote dictionary server的简称,所谓的redis是一种很常用的NoSQL,可用于数据库,缓存和消息队列等场景

与传统的MySQL这种关系型数据库相比,NoSQL的内存存储读写速度比关系型数据库的磁盘存储读写速度快很多,而且在大量的访问下,MySQL常常受限于磁盘I/O读写速度

Redis基于内存读写,性能极高,数据类型丰富,单键值对最大支持512M大小的数据,而且支持目前所有的主流编程语言,支持数据持久化,主从复制,哨兵模式等高可用特性

包含了以下十种数据类型

  • 五种基本数据类型
  1. 字符串String

  2. 列表List

  3. 集合Set

  4. 有序集合SortedSet

  5. 哈希Hash

  • 五种高级数据类型
  1. 消息队列Stream

  2. 地理空间Geospatial

  3. HyperLogLog

  4. 位图 Bitmap

  5. 位域 Bitfield

这里主要介绍CLI与API,图形化管理界面就不详细的说

Redis安装

最简单的就是apt包管理器安装

1
apt install redis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启动 Redis 服务
sudo systemctl start redis-server

# 停止 Redis 服务
sudo systemctl stop redis-server

# 重启 Redis 服务
sudo systemctl restart redis-server

# 设置开机自启
sudo systemctl enable redis-server

# 查看服务状态
sudo systemctl status redis-server

然后启动后在终端内输入以下内容即可连接到redis服务

1
redis-cli

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
56
57
58
59
60
61
62
63
64
65
66
67
# 查看服务器信息
info
info memory # 只查看内存信息
info stats # 只查看统计信息

# 查看数据库信息
dbsize # 键数量

# 清空当前数据库
flushdb # 小心使用!

# 清空所有数据库
flushall # 非常小心使用!

# 选择数据库(0-15,默认0)
select 1

# 保存数据到磁盘(如果配置了持久化)
save

# 后台保存
bgsave

# 查看配置
config get *
config get maxmemory
config get requirepass

# 查看客户端连接
client list
client info

# 查看慢查询日志
slowlog get
# 如果设置了密码,需要先认证
AUTH yourpassword

# 更改密码(需要配置文件支持)
CONFIG SET requirepass "newpassword"

# 退出连接
quit
exit
# 备份当前数据库
redis-cli save
# 或
redis-cli bgsave

# 备份文件位置(通常是)
# /var/lib/redis/dump.rdb

# 从备份恢复(停止 Redis,替换 dump.rdb,重启)
sudo systemctl stop redis-server
sudo cp backup.rdb /var/lib/redis/dump.rdb
sudo systemctl start redis-server
# 监视所有命令(实时查看操作)
monitor

# 性能测试
redis-benchmark -q -n 1000

# 查看内存使用
info memory
memory usage keyname

# 查看键的类型
type keyname

字符串Strings操作

redis中默认都是通过字符串来存储数据的,这意味我们可用把很多类型的数据都存储到redis中,如数值,布尔值,序列化后的对象等等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 设置键值对
SET name Twansh
# 读取键对应的值
GET name
# 设置数字键值对,读取的时候数字是以字符串的形式返回
SET num 42
# 删除键值对
DEL name
# 判断键值对是否存在
EXISTS name
# 查找所有的键值对与特殊匹配的键值对(跟Linux的那个匹配模式差不多)
KEYS *
KEYS nu*
# 删除掉所有的键值对
FLUSHALL
# 查看键值对的过期时间
TTL name
# 设置一个带有过期时间的键值对(10是指10s)
EXPIRE name 10
# 或者
SETEX name 10 周杰伦
# 当键值对不存在时设置新的键值对,存在的时候则不进行任何操作
SETNX name 周杰伦

实操一手

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
127.0.0.1:6379> SET name Twansh
OK
127.0.0.1:6379> SET number 42
OK
127.0.0.1:6379> GET name
"Twansh"
127.0.0.1:6379> GET number
"42"
127.0.0.1:6379> DEL name
(integer) 1
127.0.0.1:6379> GET name
(nil)
127.0.0.1:6379> EXISTS name
(integer) 0
127.0.0.1:6379> EXISTS number
(integer) 1
127.0.0.1:6379> KEYS *
1) "num"
2) "number"
3) "name"
127.0.0.1:6379> KEYS nu*
1) "num"
2) "number"
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> KEYS *
(empty array)
127.0.0.1:6379> SETNX name 周杰伦
(integer) 0
127.0.0.1:6379> EXPIRE name 10
(integer) 1
127.0.0.1:6379> TTL name
(integer) 7
127.0.0.1:6379>
127.0.0.1:6379> TTL name
(integer) 3

redis并不原生支持中文,示例如下

1
2
3
4
127.0.0.1:6379> SET name 周杰伦
OK
127.0.0.1:6379> GET name
"\xe5\x91\xa8\xe6\x9d\xb0\xe4\xbc\xa6"

要是想以原本数据的形式进行输出,在启动redis-cli的时候需要加上参数

1
redis-cli --raw

这样子就可以输出原文

列表List操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 把a值填入列表letter首位
LPUSH letter a
# 这个数据结构类似栈,把b压入列表,所以此处列表内的排序是b a
LPUSH letter b
# 自然也是可用一次性写入多个元素的
# 利用LRANGE来读取列表内的所有内容(0代表列表开始的位置,-1代表列表结束的位置)
LRANGE letter 0 -1
# 从列表的尾部添加元素
RPUSH letter f
# 利用LPOP和RPOP从列表的头部和尾部删除元素
LPOP letter
RPOP letter
# 利用LPOP和RPOP一次性删除多个元素
LPOP letter 2
RPOP letter 2
# 利用LTRIM删除出了约定范围以外的所有元素(如下是删除1-3以外的所有元素)
LTRIM letter 1 3

实操一下

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
127.0.0.1:6379> LPUSH LETTER A
(integer) 1
127.0.0.1:6379> LPUSH LETTER B
(integer) 2
127.0.0.1:6379> LPUSH LETTER C
(integer) 3
127.0.0.1:6379> LPUSH LETTER D
(integer) 4
127.0.0.1:6379> LRANGE LETTER 0 -1
1) "D"
2) "C"
3) "B"
4) "A"
127.0.0.1:6379> RPUSH LETTER F
(integer) 5
127.0.0.1:6379> LRANGE LETTER 0 -1
1) "D"
2) "C"
3) "B"
4) "A"
5) "F"
127.0.0.1:6379> LPUSH LETTER 1 2 3 4 5 6 7 8 9 10
(integer) 15
127.0.0.1:6379> LRANGE LETTER 0 -1
1) "10"
2) "9"
3) "8"
4) "7"
5) "6"
6) "5"
7) "4"
8) "3"
9) "2"
10) "1"
11) "D"
12) "C"
13) "B"
14) "A"
15) "F"

集合Set操作

1
2
3
4
5
6
7
8
9
10
11
# 向集合jihe中添加元素Twansh
SADD jihe Twansh
# 查看jihe中都有什么元素
SMEMBERS jihe
# 无法添加相同的元素,从集合的定义出发,这也是很好理解的
# 判断一个集合中是否含有某元素,若有则返回1,若无则返回0
SISMEMBERS Twansh
# 删除集合中的元素
SREM jihe Twansh
# 还有一些关于集合的运算
SUNION...

有序集合SortedSet操作

有序集合又被称为ZSort,一般是一个元素关联一个浮点数,然后按照浮点数来对元素进行排序

1
2
3
4
5
6
7
8
9
10
# 添加元素
ZADD result 150 Chinese 140 Math 130 English
# 输出元素
ZRANGE result 0 -1
# 输出元素与其对应的浮点数
ZRANGE result 0 -1 WITHSCORES
# 查看元素所对应的浮点数
ZSCORE result Chinese
# 查看某个元素的排名
ZRANK result Chinese