配置
Redis可通过命令行的方式进行数据库配置,也可以通过配置文件的方式进行数据库配置。由于数据库的配置选项较多,使用命令行的方式并不简便,因此数据库开发和管理人员大多采用修改配置文件的方式进行数据库配置。
Redis配置文件位于Redis安装目录下,名为redis.conf。在本书前面章节中已经介绍过Redis配置文件中的部分配置项,如参数port修改端口号,参数daemonize启动守护进程,参数databases修改数据库的数量。除此之外Redis还支持其他配置选项,如是否开启持久化、日志级别等。
Redis多个数据库之间并不是完全隔离的,且Redis并不支持为每个数据库设置不同的访问密码。客户端访问数据库时,要么没有权限访问任意一个数据库,要么能访问所有数据库。使用FLUSHALL命令可以清空一个Redis实例中所有数据库中的数据。
备份与恢复
Redis非常轻量级,一个空的Redis占用的内存只有1MB左右,即使多个Redis实例也不存在额外占用很多内存的问题,因此建议不同的应用使用不同的Redis实例存储数据。
由于Redis所有数据都存储在内存中,当Redis数据备份定期地通过异步方式保存到磁盘上时,该方式称为半持久化模式。当每一次的数据变化都写入aof文件里面时,则称为全持久化模式。
Redis提供的两种不同的持久化方法中,半持久化RDB(Redis DataBase)方式,是在不同的时间点,将Redis存储的数据生成快照并存储到磁盘等介质中;而全持久化AOF(Append Only File)方式,是将Redis执行过的所有写指令(每秒钟)记录在日志中,在下次Redis重新启动时,将这些指令从前到后再重复执行一遍,恢复数据。
RDB更适合数据备份,默认开启;而AOF更适合用来保存数据,默认关闭。具体的持久化方式可以根据业务的特点来定,单独使用其中一种方式或者组合使用都可以。这里讲解一下单独采用RDB或AOF进行数据持久化的缺点,读者在具体使用中应根据业务承受的能力进行选择,如下所示。
(1)单独使用RDB时。因为RDB持久化方式是周期性地进行快照备份,若在两个备份节点间服务器意外宕机,所有从上次进行快照的时间节点到服务器宕机时所产生的数据将全部丢失。
(2)单独使用AOF时。AOF机制将Redis执行的每一条命令全部追加到磁盘中,大量数据的写入会降低服务器及Redis的性能,服务器可能会反应迟钝或出现卡顿现象。
除此之外,Redis也支持同时开启RDB和AOF。系统重启后,Redis会优先使用AOF来恢复数据,将数据的损失降低到最小。RDB可以视为冷备,在AOF文件丢失或损坏不可用的时候,使用RDB来进行数据的快速恢复。
1.半持久化RDB模式
开启自动快照。在redis.conf配置文件中SAVE配置项有2个值,具体如下所示。
# Save the DB to disk.
#
# save [ ...]
#save <指定时间间隔> <执行指定次数更新操作>
……省略部分代码……
save 300 5
SAVE参数的两个值分别为:指定间隔时间和改动的键的个数,表示300秒内有5个更改,则将内存中的数据快照写入磁盘。该配置项的意义为,当在指定的时间内被更改的键的个数大于指定的个数时,Redis会自动将内存中的所有数据进行快照,并创建dump.rdb文件存储在硬盘上,以此完成数据备份。
禁用自动快照,只需要将所有的SAVE参数删除即可。使用SAVE命令创建当前数据库的备份,,具体如下所示。
127.0.0.1:6379> SAVE
输出结果:
OK
SAVE命令默认将备份文件dump.rdb保存至Redis的安装目录,查看备份文件所在的Redis安装目录具体如下所示。
127.0.0.1:6379> CONFIG GET dir
输出结果:
1) "dir"
2) "/"
也可以使用BGSAVE命令,将SAVE命令放至后台运行,具体如下所示。
127.0.0.1:6379> BGSAVE
输出结果:
Background saving started
两个命令的区别在于,SAVA命令执行时会阻塞Redis服务器进程,直至备份过程结束。而BGSAVE命令则会创建一个子程序,不影响Redis服务器的父进程。
进行数据备份前查看数据库包含键的数量及具体情况,具体如下所示。
127.0.0.1:6379> DBSIZE
输出结果:
(integer) 17
127.0.0.1:6379> KEYS *
输出结果:
1) "city2"
2) "subject2"
3) "website3"
4) "website4"
5) "city3"
6) "website2"
7) "city1"
8) "newbook"
9) "computer"
10) "website9"
11) "fruits"
12) "subject1"
13) "website"
14) "web"
15) "drinks"
16) "website1"
17) "stock"
由上述结果可知,当前数据库中含有17条数据。
为了演示备份数据的恢复,先将备份数据移动到其他文件夹,防止丢失,然后使用FLUSHDB命令删除当前数据库的数据,具体如下所示。
[root@qfedu ~]# mv /dump.rdb /data/
//清空当前数据库
127.0.0.1:6379> FLUSHDB
输出结果:
OK
127.0.0.1:6379> KEYS *
输出结果:
(empty array)
由上述结果可知,当前数据库为空。
使用systemctl stop redis命令模拟数据库宕机。恢复数据时,将备份文件dump.rdb移动到Redis的安装目录下,然后启动服务即可完成,具体如下所示。
[root@qfedu ~]# systemctl stop redis
[root@qfedu ~]# cp /tmp/dump.rdb /
[root@qfedu ~]# systemctl start redis
最后,查看Redis数据库,验证数据是否恢复,具体如下所示。
127.0.0.1:6379> ping
输出结果:
PONG
127.0.0.1:6379> KEYS *
输出结果:
1) "city2"
2) "subject2"
3) "website3"
4) "website4"
5) "city3"
6) "website2"
7) "city1"
8) "newbook"
9) "computer"
10) "website9"
11) "fruits"
12) "subject1"
13) "website"
14) "web"
15) "drinks"
16) "website1"
17) "stock"
由上述结果可知,数据已经被成功恢复。
2.全持久化AOF模式
AOF方式通过日志记录每个写操作,并追加到文件中。AOF文件的保存位置是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改该名称。
AOF持久化的参数配置如下所示。
(1) appendonly yes:开启AOF持久化功能;
(2) appendfilename appendonly.aof:AOF持久化保存文件名;
(3) appendfsync always:每次执行写入都会执行同步,最安全也最慢;
(4) #appendfsync everysec:每秒执行一次同步操作;
(5) #appendfsync no:不主动进行同步操作,而是完全交由操作系统来做,每30秒一次,最快也最不安全;
(6) auto-aof-rewrite-percentage 100:当AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据;
(7) auto-aof-rewrite-min-size 64mb:允许重写的最小AOF文件大小,配置写入AOF文件后,要求系统刷新硬盘缓存的机制。
若只配置了AOF,当重启Redis服务时,Redis会加载AOF文件,通过逐个执行AOF文件中的命令将数据载入到内存中。
批量执行
在实际应用中,会出现大量用户在一定时间内产生大量数据的状况,而这些数据需要被快速的创建与装载。前文已经讲解了如何通过一条条指令实现插入数据以及管理数据,接下来讲解如何批量的执行多条Redis命令。
创建一个txt文件,将需要执行的命令写入文件中,每一行即代表一条命令。假设命令如下所示。
SET k1 v1
SET k2 "www.fengyunedu.cn"
RPUSH list3 "a1" "b2" "c3" "d4"
SADD sset4 one two three
HSET hash5 hsk1 "hsv1"
ZADD zset6 300 "E" 200 "F" 400 "G"
MSET k3 v3 k4 v4 k5 v5
假设将该文件命名为data1.txt,并存储在“/”目录下。为达到更明显的实验效果,需清空数据库中的所有数据,具体如下所示。
127.0.0.1:6379> FLUSHALL
输出结果:
OK
127.0.0.1:6379> KEYS *
输出结果:
(empty array)
使用cat命令批量执行命令文件,具体如下所示。
[root@qfedu ~]# cat /data1.txt | redis-cli
OK
OK
(integer) 4
(integer) 3
(integer) 1
(integer) 3
OK
为了进一步验证命令文件是否执行成功,可通过KEYS命令查看Redis数据库中的全部数据,具体如下所示。
127.0.0.1:6379> KEYS *
输出结果:
1) "sset4"
2) "k3"
3) "zset6"
4) "k5"
5) "k2"
6) "k1"
7) "hash5"
8) "list3"
9) "k4"
图形化管理工具
Redis数据库管理不仅支持Redis-cli命令行工具,还支持多种交互性友好的图形化管理工具。针对Redis数据库存储数据为键值对类型的特点,简单介绍5个知名的Redis图型化管理工具,如下所示。
(1)Redis Desktop Manager是一款基于Qt5的跨平台Redis可视化桌面管理工具,也是目前为止使用率最广的可视化工具。它支持全平台,例如Windows(Windows 7以上版本)、Linux、MacOS等。
(2)Another Redis Desktop Manager是GitHub上的一个开源项目,不仅开源,而且提供在Windows、macOS上平台的安装包,体积小,完全免费。
(3)Medis是Mac系统上一款界面美观,而且易于使用的Redis数据库管理工具。
(4)RedisView是一个开源跨平台的国产Redis图形化界面工具。
(5)FastoRedis是一个跨平台的Redis数据库管理软件,也是收费软件,方便进行Redis集群监控和管理。
接下来以Another Redis Desktop Manager为例,演示使用图形化工具管理Redis数据库。
在GitHub或者Gitee(开源中国)网站下载Another Redis Desktop Manager软件包,然后安装该软件。双击打开该软件,通过设置选项将页面设置为简体中文,利于用户操作界面。
单击“确定”按钮,然后新建一个连接,填写Redis数据库信息,连接Redis数据库。
该软件正在对Redis数据库进行远程连接,因此需要提前开启Redis数据库的端口,关闭本地保护模式以及关闭仅限本地连接的配置项,最后关闭系统的防火墙,具体如下所示。
[root@qfedu ~]# vim /etc/redis/6379.conf
……
protected-mode no #将值yes改为no
#bind 127.0.0.1 -::1 #注释该配置项
……
[root@qfedu ~]# systemctl stop firewalld
[root@qfedu ~]# systemctl disable firewalld
回到软件连接界面,连接Redis数据库
单击刷新按钮,可呈现Redis数据库及所在系统的相关信息。至此,Redis数据库图形管理工具已经安装并成功连接数据库,用户可通过相关提示对数据库进行自主操作。