缓存中间件服务Redis 集群
【摘要】 Redis 是一种开源的、高性能的 NoSQL 键值对数据库,广泛应用于缓存、消息队列等场景。它支持多种数据类型,如字符串、哈希、列表、集合、有序集合等,每种数据类型都有其独特的存储结构和操作方法。
在华为云上,可以通过多种方式部署 Redis,例如使用华为云提供的 Redis 服务,或者通过华为云容器集群 CCE 结合 NAS 存储来部署 Redis 服务。这些部署方式都具有高度的灵活性和可扩
一、Redis 简介
Redis 是一个使用 ANSI C 编写的开源、支持网络、基于内存、可选持久性的键值对(key-value)存储数据库。从2015年6月开始,Redis的开发由 Redis Labs 赞助,而2013年5月至2015年6月期间,其开发由Pivotal赞助。在2013年5月之前,其开发由VMware赞助。根据月度排行网站DB-Engines.com的数据显示,Redis是最流行的键值对存储数据库。。
数据来源:https://db-engines.com/en/ranking
-
Redis采用内存(In-Memory)数据集(DataSet) 。
-
支持多种数据类型,支持字符串(string)、列表(list)、集合(set)、散列(hash)、有序集合(zset) 五种数据类型
-
运行于大多数 POSIX 系统,如Linux、*BSD、OS X等。
-
Redis作者: Salvatore Sanfilippo
-
作者GitHUB: https://github.com/antirez/redis
1、Redis 软件获取和帮助
-
官方网站:
-
官方各版本下载地址:http://download.redis.io/releases/
-
Redis 中文命令参考:
-
中文网站1:
-
中文网站2:
2、Redis 特性
-
高速读写,数据类型丰富
-
支持持久化,多种内存分配及回收策略
-
支持弱事务,消息队列、消息订阅
-
支持高可用,支持分布式分片集群
3、企业缓存数据库解决方案对比
1、Memcached
-
优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性hash多核结构、多线程读写性能高。
-
缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨房数据同步困难、架构扩容复杂度高
2、Redis
-
优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高
-
缺点:多线程读写较Memcached慢
3、Tair
-
官方网站:
-
优点:高性能读写、支持三种存储引擎(ddb、rdb、ldb)、支持高可用、支持分布式分片集群、支撑了几乎所有淘宝业务的缓存。
-
缺点:单机情况下,读写性能较其他两种产品较慢。
4、Redis应用场景
-
数据高速缓存,web会话缓存(Session Cache)
-
排行榜应用
-
消息队列,发布订阅
-
附录 - Redis的企业应用
二、Redis 基本部署
1、Yum 方式安装最新版本 Redis
1、安装 redis-rpm源
[root@qfedu.com ~]# yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
2、安装 Redis
[root@qfedu.com ~]# yum --enablerepo=remi install redis
3、开机自启 Redis
[root@qfedu.com ~]# systemctl enable redis
4、设置redis.conf
允许远程登录: bind 127.0.0.1 改为 bind 0.0.0.0 (可选)
[root@qfedu.com ~]# vim /etc/redis.conf
2、编译安装最新版本redis
1、编译安装 Redis
[root@qfedu.com ~]# wget http://download.redis.io/releases/redis-5.0.5.tar.gz
[root@qfedu.com ~]# tar -zxvf redis-5.0.5.tar.gz -C /usr/local
[root@qfedu.com ~]# yum install gcc -y # gcc -v查看,如果没有需要安装
[root@qfedu.com ~]# cd /usr/local/redis-5.0.5
[root@qfedu.com redis-5.0.5]# make MALLOC=lib
[root@qfedu.com redis-5.0.5]# cd src && make all
[root@qfedu.com src]# make install
2、启动 Redis 实例
[root@qfedu.com src]# ./redis-server
21522:C 17 Jun 2019 15:36:52.038 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
21522:C 17 Jun 2019 15:36:52.038 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=21522, just started
21522:C 17 Jun 2019 15:36:52.038 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 5.0.5 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 21522
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
出现以上界面说明安装成功
[root@qfedu.com src]# ./redis-cli --version # 查询是安装的最新版本的redis
redis-cli 5.0.5
[root@qfedu.com src]# ./redis-server --version
Redis server v=5.0.5 sha=00000000:0 malloc=libc bits=64 build=4db47e2324dd3c5
3、配置启动数据库
1、开启 Redis 服务守护进程
# 以./redis-server 启动方式,需要一直打开窗口,不能进行其他操作,不太方便,以后台进程方式启动 redis
[root@qfedu.com src]# vim /usr/local/redis-5.0.5/redis.conf # 默认安装好的配置文件并不在这个目录下,需要找到复制到该目录下
daemonize no 改为 daemonize yes # 以守护进程运行
[root@qfedu.com src]# ./redis-server /usr/local/redis-5.0.5/redis.conf
21845:C 17 Jun 2019 15:44:14.129 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
21845:C 17 Jun 2019 15:44:14.129 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=21845, just started
21845:C 17 Jun 2019 15:44:14.129 # Configuration loaded
2、关闭redis进程
[root@qfedu.com src]# ps -ef|grep redis
root 21846 1 0 15:44 ? 00:00:00 ./redis-server 127.0.0.1:6379
root 22042 6950 0 15:46 pts/1 00:00:00 grep --color=auto redis
[root@qfedu.com src]# kill -9 21846
# 此方法启动关闭较为麻烦,且不能设置开机自启动
4、设置系统进程启动 Redis
1、编辑Redis 配置文件
# 先编辑配置文件,然后在把配置文件拷贝到/etc/redis下
[root@qfedu.com ~]# vim /usr/local/redis-5.0.5/redis.conf
#bind 127.0.0.1 # 将bind 127.0.0.1注释掉,否则数据库只有本机能够使用 或者 修改为 0.0.0.0
daemonize yes # 将no改为yes,使数据库能够以后台守护进程运行
protected-mode no # 把保护模式的yes改为no,否则会阻止远程访问
requirepass redis # 打开注释,设置密码
[root@qfedu.com ~]# cp /root/redis-5.0.5/redis.conf /etc/redis/
2、添加 Redis 系统启动
# 开机自启动,将redis的启动脚本复制一份放到/etc/init.d目录下
[root@qfedu.com ~]# cp /usr/local/redis-5.0.5/utils/redis_init_script /etc/init.d/redis
[root@qfedu.com ~]# vim /etc/init.d/redis
CONF="/usr/local/redis-5.0.5/redis.conf" # 将conf的变量修改下,否则读不到配置文件
[root@qfedu.com ~]# cd /etc/init.d
[root@qfedu.com init.d]# chkconfig redis on
# 通过 systemctl 管理 redis
[root@qfedu.com ~]# systemctl start redis
[root@qfedu.com ~]# systemctl status redis
● redis.service - LSB: Redis data structure server
Loaded: loaded (/etc/rc.d/init.d/redis; bad; vendor preset: disabled)
Active: active (running) since Mon 2019-06-24 11:10:48 CST; 54s ago
Docs: man:systemd-sysv-generator(8)
Process: 3184 ExecStop=/etc/rc.d/init.d/redis stop (code=exited, status=0/SUCCESS)
Process: 3187 ExecStart=/etc/rc.d/init.d/redis start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/redis.service
└─3189 /usr/local/bin/redis-server *:6379
Jun 24 11:10:48 test systemd[1]: Starting LSB: Redis data structure server...
Jun 24 11:10:48 test redis[3187]: Starting Redis server...
Jun 24 11:10:48 test redis[3187]: 3188:C 24 Jun 2019 11:10:48.203 # oO0OoO0OoO0Oo R...0Oo
Jun 24 11:10:48 test redis[3187]: 3188:C 24 Jun 2019 11:10:48.203 # Redis version=5...ted
Jun 24 11:10:48 test redis[3187]: 3188:C 24 Jun 2019 11:10:48.203 # Configuration loaded
Jun 24 11:10:48 test systemd[1]: Started LSB: Redis data structure server.
Hint: Some lines were ellipsized, use -l to show in full.
3、Redis多实例配置
注意:本次多实例配置基于单实例配置完成后
1、创建程序目录
[root@qfedu.com ~]# mkdir /application/redis -p
[root@qfedu.com ~]# cd /application/redis/
2、修改配置文件
[root@qfedu.com redis]# vim install-redis.sh
#!/bin/bash
for i in 0 1 2 3
do
# 创建多实例(端口命名)目录
mkdir -p 638$i
# 复制启动程序到各实例
\cp /usr/local/redis-5.0.5/src/redis-server /application/redis/638$i/
# 复制配置文件。注意:此处基于单实例配置完成
\cp /usr/local/redis-5.0.5/redis.conf /application/redis/638$i/
# 修改程序存储目录
sed -i "s#^dir .*#dir /application/redis/638$i/#g" /application/redis/638$i/redis.conf
# 修改其他端口信息
sed -i "s#6379#638$i#g" /application/redis/638$i/redis.conf
# 允许远程连接redis
sed -i '/protected-mode/s#yes#no#g' /application/redis/638$i/redis.conf
done
3、启动实例
[root@qfedu.com redis]# vim start-redis.sh
#!/bin/bash
for i in 0 1 2 3
do
/application/redis/638$i/redis-server /application/redis/638$i/redis.conf
done
4、连接 redis
[root@qfedu.com redis]# redis-cli -h 192.168.152.161 -p 6379
192.168.152.161:6379>
4、Redis.conf 配置说明
1、是否后台运行
daemonize no/yes
2、默认端口
port 6379
3、AOF 日志开关是否打开
appendonly no/yes
4、日志文件位置
logfile /var/log/redis.log
5、RDB 持久化数据文件
dbfilename dump.rdb
6、指定IP进行监听
bind 10.0.0.51 ip2 ip3 ip4
7、禁止protected-mode
protected-mode yes/no (保护模式,是否只允许本地访问)
8、增加requirepass {password}
requirepass root
9、在redis-cli中使用
auth {password} 进行认证
5、在线变更配置
1、获取当前配置
CONFIG GET *
2、变更运行配置
CONFIG SET loglevel "notice"
3、修改密码为空
192.168.152.161:6379> config set requirepass ""
192.168.152.161:6379> exit
192.168.152.161:6379> config get dir
1) "dir"
2) "/usr/local/redis/data"
三、Redis 数据持久化
1、持久化策略
redis 提供了两种不同级别的持久化方式:一种是RDB,另一种是AOF.
1、RDB 持久化
可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。
2、AOF 持久化
记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以Redis 协议的格式来保存,新命令会被追加到文件的末尾。
Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。
你甚至可以关闭持久化功能,让数据只在服务器运行时存在。
2、RDB 持久化
1、RDB 的优点
-
RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集。 这种文件非常适合用于进行备份: 比如说,你可以在最近的 24 小时内,每小时备份一次 RDB 文件,并且在每个月的每一天,也备份一个 RDB 文件。 这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。
-
RDB 非常适用于灾难恢复(disaster recovery):它只有一个文件,并且内容都非常紧凑,可以(在加密后)将它传送到别的数据中心,或者亚马逊 S3 中。
-
RDB 可以最大化 Redis 的性能:父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O 操作。
-
RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
2、RDB 的缺点
-
如果你需要尽量避免在服务器故障时丢失数据,那么 RDB 不适合你。
-
虽然 Redis 允许你设置不同的保存点(save point)来控制保存 RDB 文件的频率, 但是, 因为RDB 文件需要保存整个数据集的状态, 所以它并不是一个轻松的操作。 因此你可能会至少 5 分钟才保存一次 RDB 文件。 在这种情况下, 一旦发生故障停机, 你就可能会丢失好几分钟的数据。
-
每次保存 RDB 的时候,Redis 都要 fork() 出一个子进程,并由子进程来进行实际的持久化工作。 在数据集比较庞大时,fork() 可能会非常耗时,造成服务器在某某毫秒内停止处理客户端;如果数据集非常巨大,并且 CPU 时间非常紧张的话,那么这种停止时间甚至可能会长达整整一秒。 虽然 AOF 重写也需要进行 fork() ,但无论 AOF 重写的执行间隔有多长,数据的耐久性都不会有任何损失。
3、AOF 持久化
1、AOF 优点
-
使用 AOF 会让你的 Redis 更加耐久: 你可以使用不同的fsync策略:无fsync,每秒fsync,每次写的时候fsync.使用默认的每秒fsync策略,Redis的性能依然很好(fsync是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据.
-
Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。
-
一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。
-
AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export) AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。
2、AOF 缺点
-
对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。
-
在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。 不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间(latency)。
-
AOF 在过去曾经发生过这样的 bug :因为个别命令的原因,导致 AOF 文件在重新载入时,无法将数据集恢复成保存时的原样。 (举个例子,阻塞命令 BRPOPLPUSH 就曾经引起过这样的 bug 。) 测试套件里为这种情况添加了测试: 它们会自动生成随机的、复杂的数据集, 并通过重新载入这些数据来确保一切正常。虽然这种 bug 在 AOF 文件中并不常见, 但是对比来说, RDB 几乎是不可能出现这种 bug 的。
4、如何选择使用哪种持久化方式
-
一般来说, 如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能。
-
如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。
-
有很多用户都只使用 AOF 持久化, 但我们并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快, 除此之外, 使用 RDB 还可以避免之前提到的 AOF 程序的 bug 。
-
Note: 因为以上提到的种种原因, 未来redis可能会将 AOF 和 RDB 整合成单个持久化模型(这是一个长期计划)。
5、RDB 快照实现持久化
在默认情况下, Redis 将数据库快照保存在名字为 dump.rdb的二进制文件中。你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。
你也可以通过调用 SAVE或者 BGSAVE , 手动让 Redis 进行数据集保存操作。
比如说, 以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次数据集: save 60 1000
这种持久化方式被称为快照 snapshotting.
当 Redis 需要保存 dump.rdb 文件时, 服务器执行以下操作:
1、Redis 调用forks. 同时拥有父进程和子进程。
2、子进程将数据集写入到一个临时 RDB 文件中。
3、当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。
这种工作方式使得 Redis 可以从写时复制(copy-on-write)机制中获益。
6、AOF 持久化
只进行追加操作的文件(append-only file,AOF)
快照功能并不是非常耐久:如果 Redis 因为某些原因而造成故障停机,那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。尽管对于某些程序来说,数据的耐久性并不是最重要的考虑因素,但是对于那些追求完全耐久能力的程序员来说,快照功能就不太适用了。
从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化。
你可以通过修改配置文件来打开 AOF 功能: appendonly yes
从现在开始,每当 Redis 执行一个改变数据集的命令式(比如 SET),这个命令就会被追加到 AOF 文件的末尾。
这样的话,当 redis 重新启动时,程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的
7、AOF 日志重写
因为 AOF 的运作方式是不断地将命令追加到文件的末尾, 所以随着写入命令的不断增加, AOF 文件的体积也会变得越来越大。
举个例子, 如果你对一个计数器调用了 100 次 INCR , 那么仅仅是为了保存这个计数器的当前值, AOF 文件就需要使用 100 条记录(entry)。然而在实际上, 只使用一条 SET 命令已经足以保存计数器的当前值了, 其余 99 条记录实际上都是多余的。
为了处理这种情况, Redis 支持一种有趣的特性: 可以在不打断服务客户端的情况下, 对 AOF 文件进行重建(rebuild)。执行 BGREWRITEAOF 命令, Redis 将生成一个新的 AOF 文件, 这个文件包含重建当前数据集所需的最少命令。Redis 2.2 需要自己手动执行 BGREWRITEAOF 命令.
8、AOF有多耐用?
你可以配置 Redis 多久才将数据 fsync 到磁盘一次。有三种方式:
1、每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全
2、每秒 fsync 一次:足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失 1 秒钟的数据。
3、从不 fsync :将数据交给操作系统来处理。更快,也更不安全的选择。
4、推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。
9、如果AOF文件损坏了怎么办?
服务器可能在程序正在对 AOF 文件进行写入时停机, 如果停机造成了 AOF 文件出错(corrupt), 那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。当发生这种情况时, 可以用以下方法来修复出错的 AOF 文件:
-
为现有的 AOF 文件创建一个备份。
-
使用 Redis 附带的 redis-check-aof 程序,对原来的 AOF 文件进行修复: $ redis-check-aof –fix
-
使用 diff -u 对比修复后的 AOF 文件和原始 AOF 文件的备份,查看两个文件之间的不同之处。(可选)
-
重启 Redis 服务器,等待服务器载入修复后的 AOF 文件,并进行数据恢复。
10、AOF 和 RDB 之间的相互作用
-
在版本号大于等于 2.4 的 Redis 中,BGSAVE 执行的过程中, 不可以执行 BGREWRITEAOF 。
-
反过来说, 在 BGREWRITEAOF 执行的过程中, 也不可以执行 BGSAVE。这可以防止两个 Redis 后台进程同时对磁盘进行大量的 I/O 操作。
-
如果 BGSAVE 正在执行, 并且用户显示地调用 BGREWRITEAOF 命令, 那么服务器将向用户回复一个 OK 状态, 并告知用户, BGREWRITEAOF 已经被预定执行: 一旦 BGSAVE 执行完毕, BGREWRITEAOF 就会正式开始。
-
当 Redis 启动时, 如果 RDB 持久化和 AOF 持久化都被打开了, 那么程序会优先使用 AOF 文件来恢复数据集, 因为AOF 文件所保存的数据通常是最完整的。
11、备份 redis 数据
Redis 对于数据备份是非常友好的, 因为你可以在服务器运行的时候对 RDB 文件进行复制:
RDB 文件一旦被创建, 就不会进行任何修改。 当服务器要创建一个新的 RDB 文件时, 它先将文件的内容保存在一个临时文件里面, 当临时文件写入完毕时, 程序才使用 rename(2) 原子地用临时文件替换原来的 RDB 文件。
这也就是说, 无论何时, 复制 RDB 文件都是绝对安全的。
-
创建一个定期任务(cron job), 每小时将一个 RDB 文件备份到一个文件夹, 并且每天将一个 RDB 文件备份到另一个文件夹。
-
确保快照的备份都带有相应的日期和时间信息, 每次执行定期任务脚本时, 使用 find 命令来删除过期的快照: 比如说, 你可以保留最近 48 小时内的每小时快照, 还可以保留最近一两个月的每日快照。
-
至少每天一次, 将 RDB 备份到你的数据中心之外, 或者至少是备份到你运行 Redis 服务器的物理机器之外。
12、RDB 持久化配置
1、RDB 持久化基本配置
1、修改配置文件
save 900 1
save 300 10
save 60 10000
以上配置分别表示:
• 900秒(15分钟)内有1个更改 • 300秒(5分钟)内有10个更改 • 60秒内有10000个更改 • 当达到以上定义的配置时间时,就将内存数据持久化到磁盘。
2、RDB 持久化高级配置
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./clsn/redis/data/6379
以上配置分别表示:
• 后台备份进程出错时,主进程停不停止写入? 主进程不停止容易造成数据不一致 • 导出的rdb文件是否压缩 如果rdb的大小很大的话建议这么做 • 导入rbd恢复时数据时,要不要检验rdb的完整性 验证版本是不是一致 • 导出来的rdb文件名 • rdb的放置路径
13、AOF 持久化配置
1、AOF 持久化基本配置
appendonly yes/no
appendfsync always
appendfsync everysec
appendfsync no
以上配置分别表示:
• 是否打开aof日志功能
• 每1个命令,都立即同步到aof
• 每秒写1次
• 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof.
2、AOF 持久化高级配置
no-appendfsync-on-rewrite yes/no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
以上配置分别表示:
• 正在导出rdb快照的过程中,要不要停止同步 aof
• aof文件大小比起上次重写时的大小,增长率100%时重写,缺点:业务开始的时候,会重复重写多次。
• aof文件,至少超过64M时,重写
14、RDB 到 AOF 切换
在 Redis 2.2 或以上版本,可以在不重启的情况下,从 RDB 切换到 AOF :
1、为最新的 dump.rdb 文件创建一个备份。
2、将备份放到一个安全的地方。
3、执行以下两条命令:
redis-cli config set appendonly yes
redis-cli config set save “”
4、确保写命令会被正确地追加到 AOF 文件的末尾。
执行说明
执行的第一条命令开启了 AOF 功能: Redis 会阻塞直到初始 AOF 文件创建完成为止, 之后 Redis 会继续处理命令请求, 并开始将写入命令追加到 AOF 文件末尾。
执行的第二条命令用于关闭 RDB 功能。 这一步是可选的, 如果你愿意的话, 也可以同时使用 RDB 和 AOF 这两种持久化功能。
注意:别忘了在 redis.conf 中打开 AOF 功能! 否则的话, 服务器重启之后, 之前通过 CONFIG SET 设置的配置不会生效, 程序会按原来的配置来启动服务器。
四、Redis 管理实战
1、Redis 基本数据类型
类型 | 说明 |
---|---|
String 字符串 | Redis 字符串数据类型的相关命令用于管理 redis 字符串值 |
Hash 哈希 | Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。 |
List 列表 | Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。 |
Set 集合 | Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。 |
Sorted set 有序集合 | Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。 |
1、全局 Key 操作
命令 | 含义 |
---|---|
KEYS * | 查看KEY支持通配符 |
DEL | 删除给定的一个或多个key |
EXISTS | 检查是否存在 |
RENAME | 变更KEY名 |
SORT | 键值排序,有非数字时报错 |
TYPE | 返回键所存储值的类型 |
DUMP RESTORE | 序例化与反序列化 |
EXPIRE\ PEXPIRE | 以秒\毫秒设定生存时间 |
TTL\ PTTL | 以秒\毫秒为单位返回生存时间 |
PERSIST | 取消生存实现设置 |
RANDOMKEY | 返回数据库中的任意键 |
2、String(字符串)
string是redis最基本的类型,一个key对应一个value。一个键最大能存储 512MB。
命令 | 描述 |
---|---|
SET key value | 设置指定 key 的值 |
GET key | 获取指定 key 的值。 |
GETRANGE key start end | 返回 key 中字符串值的子字符 |
GETSET key value | 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 |
GETBIT key offset**对 key** | 所储存的字符串值,获取指定偏移量上的位(bit)。 |
MGET key1 [key2..] | 获取所有(一个或多个)给定 key 的值。 |
SETBIT key offset value | 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 |
SETEX key seconds value | 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。 |
SETNX key value | 只有在 key 不存在时设置 key 的值。 |
SETRANGE key offset value | 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。 |
STRLEN key | 返回 key 所储存的字符串值的长度。 |
MSET key value [key value ...] | 同时设置一个或多个 key-value 对。 |
MSETNX key value [key value ...] | 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。 |
PSETEX key milliseconds value | 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。 |
INCR key | 将 key 中储存的数字值增一。 |
INCRBY key increment | 将 key 所储存的值加上给定的增量值(increment) 。 |
INCRBYFLOAT key increment | 将 key 所储存的值加上给定的浮点增量值(increment) 。 |
DECR key | 将 key 中储存的数字值减一。 |
DECRBY key decrementkey | 所储存的值减去给定的减量值(decrement) 。 |
APPEND key value | 如果 key 已经存在并且是一个字符串, APPEND 命令将 指定value 追加到改 key 原来的值(value)的末尾。 |
应用场景
常规计数:微博数,粉丝数等。
3、Hash(字典)
我们可以将Redis中的Hashes类型看成具有String Key和String Value的map容器。
所以该类型非常适合于存储值对象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储995701749 个键值对。
命令 | 描述 |
---|---|
HDEL key field1 [field2] | 删除一个或多个哈希表字段 |
HEXISTS key field | 查看哈希表 key 中,指定的字段是否存在。 |
HGET key field | 获取存储在哈希表中指定字段的值。 |
HGETALL key | 获取在哈希表中指定 key 的所有字段和值 |
HINCRBY key field increment | 为哈希表 key 中的指定字段的整数值加上增量 increment 。 |
HINCRBYFLOAT key field increment | 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。 |
HKEYS key | 获取所有哈希表中的字段 |
HLEN key | 获取哈希表中字段的数量 |
HMGET key field1 [field2] | 获取所有给定字段的值 |
HMSET key field1 value1 [field2 value2 ] | 同时将多个 field-value (域-值)对设置到哈希表 key 中。 |
HSET key field value | 将哈希表 key 中的字段 field 的值设为 value 。 |
HSETNX key field value | 只有在字段 field 不存在时,设置哈希表字段的值。 |
HVALS key | 获取哈希表中所有值 |
HSCAN key cursor [MATCH pattern] [COUNT count] | 迭代哈希表中的键值对。 |
应用场景:
存储部分变更的数据,如用户信息等。
4、LIST(列表)
List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。
在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。
List中可以包含的最大元素数量是4294967295。
命令 | 描述 |
---|---|
BLPOP key1 [key2 ] timeout | 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
BRPOP key1 [key2 ] timeout | 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
BRPOPLPUSH source destination timeout | 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
LINDEX key index | 通过索引获取列表中的元素 |
LINSERT key BEFORE|AFTER pivot value | 在列表的元素前或者后插入元素 |
LLEN key | 获取列表长度 |
LPOP key | 移出并获取列表的第一个元素 |
LPUSH key value1 [value2] | 将一个或多个值插入到列表头部 |
LPUSHX key value | 将一个值插入到已存在的列表头部 |
LRANGE key start stop | 获取列表指定范围内的元素 |
LREM key count value | 移除列表元素 |
LSET key index value | 通过索引设置列表元素的值 |
LTRIM key start stop | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 |
RPOP key | 移除并获取列表最后一个元素 |
RPOPLPUSH source destination | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
RPUSH key value1 [value2] | 在列表中添加一个或多个值 |
RPUSHX key value | 为已存在的列表添加值 |
应用场景
消息队列系统,比如sina微博
在Redis中我们的最新微博ID使用了常驻缓存,这是一直更新的。但是做了限制不能超过5000个ID,因此获取ID的函数会一直询问Redis。只有在start/count参数超出了这个范围的时候,才需要去访问数据库。
系统不会像传统方式那样“刷新”缓存,Redis实例中的信息永远是一致的。SQL数据库(或是硬盘上的其他类型数据库)只是在用户需要获取“很远”的数据时才会被触发,而主页或第一个评论页是不会麻烦到硬盘上的数据库了。
5、SET(集合)
Set类型看作为没有排序的字符集合。Set可包含的最大元素数量是4294967295。如果多次添加相同元素,Set中将仅保留该元素的一份拷贝。
命令 | 描述 |
---|---|
SADD key member1 [member2] | 向集合添加一个或多个成员 |
SCARD key | 获取集合的成员数 |
SDIFF key1 [key2] | 返回给定所有集合的差集 |
SDIFFSTORE destination key1 [key2] | 返回给定所有集合的差集并存储在 destination 中 |
SINTER key1 [key2] | 返回给定所有集合的交集 |
SINTERSTORE destination key1 [key2] | 返回给定所有集合的交集并存储在 destination 中 |
SISMEMBER key member | 判断 member 元素是否是集合 key 的成员 |
SMEMBERS key | 返回集合中的所有成员 |
SMOVE source destination member | 将 member 元素从 source 集合移动到 destination 集合 |
SPOP key | 移除并返回集合中的一个随机元素 |
SRANDMEMBER key [count] | 返回集合中一个或多个随机数 |
SREM key member1 [member2] | 移除集合中一个或多个成员 |
SUNION key1 [key2] | 返回所有给定集合的并集 |
SUNIONSTORE destination key1 [key2] | 所有给定集合的并集存储在 destination 集合中 |
SSCAN key cursor [MATCH pattern] [COUNT count] | 迭代集合中的元素 |
应用场景:
在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。
Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
6、SortedSet(有序集合)
Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。成员是唯一的,但是分数(score)却是可以重复的。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
命令 | 描述 |
---|---|
ZADD key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
ZCARD key | 获取有序集合的成员数 |
ZCOUNT key min max | 计算在有序集合中指定区间分数的成员数 |
ZINCRBY key increment member | 有序集合中对指定成员的分数加上增量 increment |
ZINTERSTORE destination numkeys key [key ...] | 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 |
ZLEXCOUNT key min max | 在有序集合中计算指定字典区间内成员数量 |
ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合成指定区间内的成员 |
ZRANGEBYLEX key min max [LIMIT offset count] | 通过字典区间返回有序集合的成员 |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] | 通过分数返回有序集合指定区间内的成员 |
ZRANK key member | 返回有序集合中指定成员的索引 |
ZREM key member [member ...] | 移除有序集合中的一个或多个成员 |
ZREMRANGEBYLEX key min max | 移除有序集合中给定的字典区间的所有成员 |
ZREMRANGEBYRANK key start stop | 移除有序集合中给定的排名区间的所有成员 |
ZREMRANGEBYSCORE key min max | 移除有序集合中给定的分数区间的所有成员 |
ZREVRANGE key start stop [WITHSCORES] | 返回有序集中指定区间内的成员,通过索引,分数从高到底 |
ZREVRANGEBYSCORE key max min [WITHSCORES] | 返回有序集中指定分数区间内的成员,分数从高到低排序 |
ZREVRANK key member | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
ZSCORE key member | 返回有序集中,成员的分数值 |
ZUNIONSTORE destination numkeys key [key ...] | 计算给定的一个或多个有序集的并集,并存储在新的 key 中 |
ZSCAN key cursor [MATCH pattern] [COUNT count] | 迭代有序集合中的元素(包括元素成员和元素分值) |
应用场景:
排行榜应用,取TOP N操作这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。
总结
Redis 是一种开源的、高性能的 NoSQL 键值对数据库,广泛应用于缓存、消息队列等场景。它支持多种数据类型,如字符串、哈希、列表、集合、有序集合等,每种数据类型都有其独特的存储结构和操作方法。
在华为云上,可以通过多种方式部署 Redis,例如使用华为云提供的 Redis 服务,或者通过华为云容器集群 CCE 结合 NAS 存储来部署 Redis 服务。这些部署方式都具有高度的灵活性和可扩展性,可以满足不同业务场景的需求。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)