您当前的位置:首页 > 电脑百科 > 数据库 > Redis

NoSQL数据库:Redis高级实用技巧

时间:2023-11-30 14:09:47  来源:微信公众号  作者:运维book思议

配置

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以上版本)、linuxmacOS等。

(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数据库图形管理工具已经安装并成功连接数据库,用户可通过相关提示对数据库进行自主操作。



Tags:Redis   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Redis 不再 “开源”,未来采用 SSPLv1 和 RSALv2 许可证
Redis 官方于21日宣布修改开源协议 &mdash;&mdash; 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause...【详细内容】
2024-03-27  Search: Redis  点击:(11)  评论:(0)  加入收藏
Redis“叛逃”开源,得罪了几乎所有人
内存数据库供应商Redis近日在开源界砸下了一块“巨石”。Redis即将转向双许可模式,并实施更为严格的许可条款。官方对此次变更的公告直截了当:从Redis 7.4版本开始,Redis将在Re...【详细内容】
2024-03-25  Search: Redis  点击:(9)  评论:(0)  加入收藏
如何使用 Redis 实现消息队列
Redis不仅是一个强大的内存数据存储系统,它还可以用作一个高效的消息队列。消息队列是应用程序间或应用程序内部进行异步通信的一种方式,它允许数据生产者将消息放入队列中,然...【详细内容】
2024-03-22  Search: Redis  点击:(17)  评论:(0)  加入收藏
Redis不再 “开源”
Redis 官方今日宣布修改开源协议 &mdash;&mdash; 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause 开...【详细内容】
2024-03-21  Search: Redis  点击:(8)  评论:(0)  加入收藏
在Redis中如何实现分布式锁的防死锁机制?
在Redis中实现分布式锁是一个常见的需求,可以通过使用Redlock算法来防止死锁。Redlock算法是一种基于多个独立Redis实例的分布式锁实现方案,它通过协调多个Redis实例之间的锁...【详细内容】
2024-02-20  Search: Redis  点击:(47)  评论:(0)  加入收藏
手动撸一个 Redis 分布式锁
大家好呀,我是楼仔。今天第一天开工,收拾心情,又要开始好好学习,好好工作了。对于使用 Java 的小伙伴,其实我们完全不用手动撸一个分布式锁,直接使用 Redisson 就行。但是因为这些...【详细内容】
2024-02-19  Search: Redis  点击:(39)  评论:(0)  加入收藏
工作中Redis有哪些好用的运维工具
工作中使用 Redis 时,如果大家公司没有专业运维,可能开发人员就会面临这些运维的工作,包括 Redis 的运行状态监控,数据迁移,主从集群、切片集群的部署和运维等等。本文我就从这三...【详细内容】
2024-02-06  Search: Redis  点击:(55)  评论:(0)  加入收藏
深入Go底层原理,重写Redis中间件实战
Go语言以其简洁、高效和并发性能而闻名,深入了解其底层原理可以帮助我们更好地利用其优势。在本文中,我们将探讨如何深入Go底层原理,以及如何利用这些知识重新实现一个简单的Re...【详细内容】
2024-01-25  Search: Redis  点击:(66)  评论:(0)  加入收藏
批量执行Redis命令的四种方式!
前言在我们的印象中Redis命令好像都是一个个单条进行执行的,如果有人问你如何批量执行Redis命令,你能回答的上吗,或者说能答出几种方式呢?最容易想到的是Redis的一些批量命令,例...【详细内容】
2024-01-17  Search: Redis  点击:(57)  评论:(0)  加入收藏
Redis 实现多规则限流的思考与实践
市面上很多介绍redis如何实现限流的,但是大部分都有一个缺点,就是只能实现单一的限流,比如1分钟访问1次或者60分钟访问10次这种,但是如果想一个接口两种规则都需要满足呢,我们的...【详细内容】
2024-01-03  Search: Redis  点击:(109)  评论:(0)  加入收藏
▌简易百科推荐
Redis 不再 “开源”,未来采用 SSPLv1 和 RSALv2 许可证
Redis 官方于21日宣布修改开源协议 &mdash;&mdash; 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause...【详细内容】
2024-03-27  dbaplus社群    Tags:Redis   点击:(11)  评论:(0)  加入收藏
Redis“叛逃”开源,得罪了几乎所有人
内存数据库供应商Redis近日在开源界砸下了一块“巨石”。Redis即将转向双许可模式,并实施更为严格的许可条款。官方对此次变更的公告直截了当:从Redis 7.4版本开始,Redis将在Re...【详细内容】
2024-03-25    51CTO  Tags:Redis   点击:(9)  评论:(0)  加入收藏
如何使用 Redis 实现消息队列
Redis不仅是一个强大的内存数据存储系统,它还可以用作一个高效的消息队列。消息队列是应用程序间或应用程序内部进行异步通信的一种方式,它允许数据生产者将消息放入队列中,然...【详细内容】
2024-03-22  后端Q  微信公众号  Tags:Redis   点击:(17)  评论:(0)  加入收藏
Redis不再 “开源”
Redis 官方今日宣布修改开源协议 &mdash;&mdash; 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause 开...【详细内容】
2024-03-21  OSC开源社区    Tags:Redis   点击:(8)  评论:(0)  加入收藏
在Redis中如何实现分布式锁的防死锁机制?
在Redis中实现分布式锁是一个常见的需求,可以通过使用Redlock算法来防止死锁。Redlock算法是一种基于多个独立Redis实例的分布式锁实现方案,它通过协调多个Redis实例之间的锁...【详细内容】
2024-02-20  编程技术汇    Tags:Redis   点击:(47)  评论:(0)  加入收藏
手动撸一个 Redis 分布式锁
大家好呀,我是楼仔。今天第一天开工,收拾心情,又要开始好好学习,好好工作了。对于使用 Java 的小伙伴,其实我们完全不用手动撸一个分布式锁,直接使用 Redisson 就行。但是因为这些...【详细内容】
2024-02-19  楼仔  微信公众号  Tags:Redis   点击:(39)  评论:(0)  加入收藏
工作中Redis有哪些好用的运维工具
工作中使用 Redis 时,如果大家公司没有专业运维,可能开发人员就会面临这些运维的工作,包括 Redis 的运行状态监控,数据迁移,主从集群、切片集群的部署和运维等等。本文我就从这三...【详细内容】
2024-02-06  waynaqua    Tags:Redis   点击:(55)  评论:(0)  加入收藏
批量执行Redis命令的四种方式!
前言在我们的印象中Redis命令好像都是一个个单条进行执行的,如果有人问你如何批量执行Redis命令,你能回答的上吗,或者说能答出几种方式呢?最容易想到的是Redis的一些批量命令,例...【详细内容】
2024-01-17  小许code  微信公众号  Tags:Redis命令   点击:(57)  评论:(0)  加入收藏
Redis 实现多规则限流的思考与实践
市面上很多介绍redis如何实现限流的,但是大部分都有一个缺点,就是只能实现单一的限流,比如1分钟访问1次或者60分钟访问10次这种,但是如果想一个接口两种规则都需要满足呢,我们的...【详细内容】
2024-01-03  架构精进之路  微信公众号  Tags:Redis   点击:(109)  评论:(0)  加入收藏
一站式Redis解决方案
Redis是一个高效的内存数据库,它支持包括String、List、Set、SortedSet和Hash等数据类型的存储,在Redis中通常根据数据的key查询其value值,Redis没有模糊条件查询,在面对一些需...【详细内容】
2024-01-01  大雷家吃饭    Tags:Redis   点击:(66)  评论:(0)  加入收藏
站内最新
站内热门
站内头条