【Redis】之安装、配置、持久化~
1、Redis 简介
Redis(Remote Dictionary Server ),即远程字典服务,是一个key-value存储系统。
redis 为 非关系型数据库
,默认的端口号是6379
1.1 redis 术语
- 缓存击穿:某一热点过期,此时又有大量用户访问这个热点
- 缓存穿透:查询不存在的数据。大量请求访问mysql和redis不存在的资源
- 缓存雪崩:redis中大量缓存集体过期,请求全部发送给mysql
1.2 redis 特性
- 纯内存结构
- 单线程
- 多路复用机制
数据读的操作流程:
2、redis 安装和优化
2.1 redis 安装
2.1.1 编译安装
`安装依赖包:`
[root@centos7 ~]#yum -y install gcc jemalloc-devel systemd-devel //安装依赖包,使用systemd去管理
`解压redis:`
[root@localhost ~]#cd /data
************ 加载软件包 ************
[root@centos7 ~]#tar xvf redis-5.0.7.tar.gz
`编译安装:`
[root@centos7 ~]#cd redis-5.0.7/
[root@centos7 redis-5.0.7]#make USE_SYSTEMD=yes PREFIX=/apps/redis install //指定redis安装目录
#支持systemd
`配置变量:`
[root@centos7 ~]#echo 'PATH=/apps/redis/bin:$PATH' > /etc/profile.d/redis.sh
[root@centos7 ~]#. /etc/profile.d/redis.sh
`准备配置文件及目录:`
[root@centos7 ~]#mkdir /apps/redis/{etc,log,data,run}
#创建配置文件、日志、数据等目录
[root@centos7 redis-5.0.7]#cp redis.conf /apps/redis/etc/
#源码包中自带 配置文件
[root@centos7 redis-5.0.7]# cd /apps/redis
[root@centos7 redis]# ls
.
├── bin
│ ├── redis-benchmark
│ ├── redis-check-aof
│ ├── redis-check-rdb
│ ├── redis-cli //客户端工具
│ ├── redis-sentinel -> redis-server
│ └── redis-server
├── data
├── etc
│ └── redis.conf
├── log
└── run
`准备用户 修改权限:`
[root@centos7 ~]#useradd -r -s /sbin/nologin redis
[root@centos7 ~]#chown -R redis.redis /apps/redis/
#设置目录权限
[root@centos7 ~]#ln -sv /apps/redis/bin/redis-* /usr/bin/
#设置软连接
`准备service文件:`
[root@centos7 ~]#vim /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
#Type=notify 如果支持systemd可以启用此行
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
`启动 redis:`
[root@centos7 ~]# systemctl daemon-reload
[root@centos7 ~]# systemctl start redis //打开有问题也不会报错,需要自己检查一下状态
[root@centos7 ~]# systemctl status redis
2.1.2 yum安装
yum安装版本比较旧,不建议使用yum安装
[root@localhost ~]# yum install epel-release.noarch -y
[root@localhost ~]# yum install -y redis
[root@localhost ~]# rpm -qi redis
名称 :redis
架构 :x86_64
版本 :3.2.12
发布 :2.el7
大小 :544 k
2.2 redis 优化
2.2.1 redis 基本配置
[root@7-3 redis]# vim /apps/redis/etc/redis.conf
70行:bind 0.0.0.0 //远程连接
171行:logfile /apps/redis/log/redis.log //指定日志文件的位置,必须要有文件名
264行:dir /apps/redis/data //定义路径,后面不能加文件名
[root@7-3 redis]# systemctl restart redis //改完注意重启
[root@7-3 redis]# systemctl status redis
2.2.2 redis 调优
对log中的三个warning进行调优:
[root@7-2 redis]# vim /apps/redis/log/redis.log
[root@7-2 redis]# vim /etc/sysctl.conf
net.core.somaxconn = 1024 //TCP backlog设置最大连接数
vm.overcommit_memory = 1 //内核参数说明。1表示内核允许分配所有的物理内存,而不管当前的内存状态如何
[root@7-2 redis]# sysctl -p
[root@7-2 redis]# systemctl restart redis
警告:您在内核中启用了透明大页面(THP,不同于一般内存页的4k为2M)支持。 这将在Redis中造成延迟和
内存使用问题。 要解决此问题,请以root 用户身份运行命令“echo never> /sys/kernel/mm/transparent_hugepage/enabled”,并将其添加到您的/etc/rc.local中,以便在重启后保留设置。禁用THP后,必须重新启动Redis。
临时修改:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
永久修改:
[root@centos7 ~]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
[root@centos7 ~]# chmod +x /etc/rc.d/rc.local
3、redis 配置
3.1 redis 工具
[root@centos7 ~]# redis-cli //工具
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> info
3.2 客户端连接 redis
redis 选项:
选项 | 含义 |
---|---|
-p | 端口 |
-h | 主机 |
-a | 密码 |
3.2.1 本机无密码连接
默认无密码验证
redis-cli
127.0.0.1:6379> info
3.2.2 有密码连接
加上密码:-a
修改配置文件:509行
vim /apps/redis/etc/redis.conf
509行:requirepass 123456 //自定义密码
systemctl restart redis
验证:
[root@7-3 ~]# redis-cli
127.0.0.1:6379> info
NOAUTH Authentication required. //需要去验证
#加上密码:
[root@7-3 ~]# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. //会提示不安全
127.0.0.1:6379> set name wxy
OK
127.0.0.1:6379> get wxy
(nil)
小拓展:过滤出 配置文件中非注释、非空行的内容
grep -v "^#" /apps/redis/etc/redis.conf| grep -v "^$"
3.2.3 跨主机密码连接
redis-cli -h 远程主机 -p 端口 -a 密码
小拓展: redis 图形化工具
一共有16个数据库 (0-15)
3.3 redis 多实例
redis是单线程,会造成cpu核数浪费,使用多实例,可以更大的发挥redis的性能
端口号默认是 6379
使用3个端口号6380 6381 6382 进行实验:
`先关闭6379端口:`
[root@7-3 ~]# systemctl stop redis
[root@7-3 ~]# cp -a /apps/redis/etc/redis.conf /apps/redis/etc/redis6380.conf
[root@7-3 ~]# vim /apps/redis/etc/redis6380.conf
70 bind 0.0.0.0 //监听端口,作用是远程连接
93 port 6380
159 pidfile /apps/redis/run/redis_6380.pid //注意修改路径
172 logfile /apps/redis/log/redis6380.log
254 dbfilename dump6380.rdb
[root@7-3 ~]# systemctl restart redis
[root@7-3 ~]# grep 6380 /apps/redis/etc/redis6380.conf
port 6380
pidfile /var/run/redis_6380.pid
logfile /apps/redis/log/redis6380.log
dbfilename dump6380.rdb
# cluster-announce-bus-port 6380
[root@7-3 ~]# cp -a /apps/redis/etc/redis6380.conf /apps/redis/etc/redis6381.conf
[root@7-3 ~]# cp -a /apps/redis/etc/redis6380.conf /apps/redis/etc/redis6382.conf
[root@7-3 ~]# vim /apps/redis/etc/redis6381.conf
:% s/6380/6381/g //全局替换
[root@7-3 ~]# vim /apps/redis/etc/redis6382.conf
:% s/6380/6382/g //全局替换
`修改service文件:`
[root@7-3 ~]# cp -a /lib/systemd/system/redis.service /lib/systemd/system/redis6380.service
[root@7-3 ~]# vim /lib/systemd/system/redis6380.service //编辑6380
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis6380.conf --supervised systemd //加上6380端口,其他无变化。
[root@7-3 ~]# cp -a /lib/systemd/system/redis6380.service /lib/systemd/system/redis6381.service
[root@7-3 ~]# cp -a /lib/systemd/system/redis6380.service /lib/systemd/system/redis6382.service
[root@7-3 ~]# vim /lib/systemd/system/redis6381.service //将6380改为6381
[root@7-3 ~]# vim /lib/systemd/system/redis6382.service //将6380改为6382
[root@7-3 ~]# systemctl daemon-reload
[root@7-3 ~]# systemctl start redis6380
[root@7-3 ~]# systemctl start redis6381
[root@7-3 ~]# systemctl start redis6382
[root@7-3 ~]# ss -natp | grep "63" //过滤63开头的端口号
LISTEN 0 511 *:6380 *:* users:(("redis-server",pid=10829,fd=6))
LISTEN 0 511 *:6381 *:* users:(("redis-server",pid=10839,fd=6))
LISTEN 0 511 *:6382 *:* users:(("redis-server",pid=10849,fd=6))
`登录验证:`
[root@7-3 redis]# tree
.
├── bin
│ ├── redis-benchmark
│ ├── redis-check-aof
│ ├── redis-check-rdb
│ ├── redis-cli
│ ├── redis-sentinel -> redis-server
│ └── redis-server
├── data
│ └── dump.rdb
├── etc
│ ├── redis6380.conf
│ ├── redis6381.conf
│ ├── redis6382.conf
│ └── redis.conf
├── log
│ ├── redis6380.log
│ ├── redis6381.log
│ ├── redis6382.log
│ └── redis.log
└── run
├── redis_6380.pid
├── redis_6381.pid
└── redis_6382.pid
[root@7-3 ~]# redis-cli -p 6380 -a 123456 //使用6380端口登录
127.0.0.1:6380> info //登录成功
3.4 redis 配置总结
3.4.1 主要配置项
自动保存策略:
save 900 1 //在900秒内有1个key内容发生更改,就执行快照机制
save 300 10 //在300秒内有10个key内容发生更改,就执行快照机制
save 60 10000 //60秒内如果有10000个key以上的变化,就自动快照备份
dbfilename dump.rdb //快照文件名,保存备份的名字
dir ./ //快照文件保存的路径
删库(高危命令):
flush //清空当前数据库。一共有16个库,只删除当前的数据库。
flushall //清空,删库,相当于16个库 全部清空。
开启二进制日志(备份):
appendonly no //是否开启AOF日志记录,默认是关闭
appendfilename "appendonly.aof" //指明备份文件的位置
aof重写机制:
no-appendfsync-on-rewrite no //给二进制文件瘦身,同一类型的设置,只保留最新的记录
aof 持久化策略的配置:
ppendfsync everysec //aof持久化策略的配置
#no表示由操作系统保证数据同步到磁盘,Linux的默认fsync策略是30秒,最多会丢失30s的数据
#always表示每次写入都执行fsync,以保证数据同步到磁盘,安全性高,性能较差
#everysec表示每秒执行一次fsync,可能会导致丢失这1s数据,此为默认值,也是生产环境的建议值
requirepass 密码:
requirepass foobared #设置redis连接密码,之后需要AUTH pass,如果有特殊符号,用" "引起来,生产建议设置
配置总结:
配置文件 | 含义 |
---|---|
bind 0.0.0.0 | 监听地址,用于远程连接。多个监听地址之间 用空格隔开 |
port 6379 | 监听端口号,默认是6379/tcp |
pidfile /var/run/redis_6379.pid | pid文件位置 |
logfile “PATH/redis.log” | 日志文件位置 |
dbfilename dump.rdb | 快照文件名 |
dir ./ | 快照文件保存路径 |
appendfilename “appendonly.aof” | aof保存文件的名字 |
requirepass | 设置密码 |
3.5.2 config 动态修改配置
临时修改,不是永久修改!!!
按照上面的配置,改完需要重启,这个可以不用重启,直接动态修改,但这个是临时修改。
注意:不是所有配置都可以动态修改,且此方式无法持久保存
config set 参数值
config get 参数值
3.5.3 慢查询
慢查询 就是一条命令执行的很慢
slow log
slowlog get //查看所有慢查询的情况
slowlog get 2 //查看慢查询的具体情况
slowlog-log-slower-than 1 //指定为超过1us即为慢的指令
slowlog-max-len 1024 //指定保存1024条慢记录
SLOWLOG RESET //清空慢日志
4、持久化⭐
Redis持久化 分为两种:
RDB
:原理是将Redis在内存中的数据库记录 定时保存到磁盘上 ,类似于快照,AOF
:原理是将Redis的 操作日志已追加的方式写入文件,类似于mysql的 binlog(二进制日志)
AOF的优先级 大于 RDB
4.1 RDB 模式
RDB:redis database,基于时间的快照, 其默认只保留当前最新的一次快照,特点是执行速度比较快
执行流程:
(1) Redis父进程首先判断 :当前是否在执行save,或bgsave/bgrewriteaof的子进程,如果在执行则bgsave命令直接返回。
bgsave/bgrewriteaof 的子进程不能同时执行,主要是基于性能方面的考虑:两个并发的子进程同时执行大量的磁盘写操作,可能引起严重的性能问题。
(2) 父进程执行fork操作创建子进程,这个过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令
(3) 父进程fork后,bgsave 命令返回 "Background saving started" 信息并不再阻塞父进程,并可以响应其他命令
(4) 子进程创建RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行替换
(5) 子进程发送信号给父进程表示完成,父进程更新统计信息
4.1.1 实现RDB方式:
方式 | 说明 |
---|---|
save | 同步,会阻塞其它命令,不推荐使用 |
bgsave | 异步,后台执行,不影响其它命令的执行 |
自动 | 制定规则,自动执行 |
4.1.2 RDB持久化触发条件
- 手动触发
save //保存持久化
bgsave //后台执行,不会影响当前操作,建议使用!
当bgsave 在后台备份时,如何查看是否备份完成:
#rdb_bgsave_in_progress:0
#此处为0 表示保存结束 1表示保存没结束
- 自动触发
ave 900 1 //900s内修改了1个key即触发保存RDB
save 300 10 //300s内修改了10个key即触发保存RDB
save 60 10000 //60s内修改了10000个key即触发保存RDB
4.2 AOF 模式
AOF:append only file的简称,类似于二进制日志。 按照操作顺序依次将操作追加到指定的日志文件末尾
aof优先级大于rdb,所以有aof 就不会去读rdb
4.2.1 AOF相关配置
appendonly yes //是否开启AOF日志记录
appendfilename "appendonly.aof" //AOF文件名,存放在dir指令指定的目录中
aof持久化策略的配置:
appendfsync everysec //appendfsync后面有三种情况
no:30秒保存一次
always:每次都保存
everysec:每秒保存一次,此为默认值,也生产建议值
4.2.2 AOF 重写
将一些重复的,可以合并的,过期的数据重新写入一个新的AOF文件,从而节约AOF备份占用的硬盘空间,也能加速恢复过程
可以手动执行 bgrewriteaof 触发AOF,第一次开启AOF功能,或定义自动 rewrite 策略
如果先执行了bgsave,然后再开启aof,那么aof保存的只是后面的操作,还原也只能还原aof的:
那么,怎么恢复所有的操作呢:
先关闭aof
然后去读取rdb文件
手动开启aof
RDB和AOF的选择
- 如果主要充当缓存功能,或者可以承受数分钟数据的丢失, 通常生产环境一般只需启用RDB即可,此也是默认值
- 如果数据需要持久保存,一点不能丢失,可以选择同时开启RDB和AOF
- 一般不建议只开启AOF(要么是只开启rdb,要么是rdb和aof同时开启,一般不建议只单独开启aof)
5、redis 命令
命令 | 含义 |
---|---|
info | 显示当前节点redis运行状态信息 |
select | **切换数据库。**相当于在MySQL的 USE DBNAME 指令 |
keys | 查看当前库下的所有key,key * 命令慎用! |
mset | 一次性设置多个key |
bgsave | 后台保存。手动在后台执行RDB持久化操作 |
dbsize | 返回当前库下的所有key 数量 |
flushdb | 强制清空当前库中的所有key,此命令慎用 |
flushall | 强制清空当前redis服务器所有数据库中的所有key,即删除所有数据,此命令慎用! |
shutdown | 停止所有客户端 |
附:数据类型
- 字符型(string): 普通字符串
- 哈希(hash): 键值对的 键值对
- 列表 (linked lists): 类似于 数组
- 无序集合(set):朋友圈共同好友
- 有序集合(sorted set): 排行榜
6、消息队列
进程处理请求是有上限的,如果超过上限,可以使用消息队列软件接收这些请求。
消息队列的两种模式:
-
生产者和消费者:一个需求对应一个消费者
- 生产者:转发客户的请求生成需求
- 消费者:解决生产者生成的需求
-
发布者和订阅者:广播
- 发布者
- 订阅者
7、主从复制
config 命令临时修改
永久修改:
实验环境:
主 7-2 192.168.125.120
从 7-3 192.168.125.130
7-3:
[root@7-3 ~]# vim /apps/redis/etc/redis.conf
286 replicaof 192.168.125.120 6379 //在从节点上添加主的信息
[root@7-3 ~]# systemctl restart redis
[root@7-3 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave //从
master_host:192.168.125.120
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:1720535579
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:eef83b527155cc371668c97dbaa5791a417eb592
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379>
7-2:
[root@7-2 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master //主
connected_slaves:1
slave0:ip=192.168.125.130,port=6379,state=online,offset=0,lag=1
master_replid:87c825a0390236b85d7dae47f9569ef1bd8cdf60
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28
127.0.0.1:6379>
有密码:
7-3:从
masterauth 123456
转载自:https://juejin.cn/post/7389633157500387368