likes
comments
collection
share

【Redis】之安装、配置、持久化~

作者站长头像
站长
· 阅读数 35

1、Redis 简介

Redis(Remote Dictionary Server ),即远程字典服务,是一个key-value存储系统。

redis 为 非关系型数据库,默认的端口号是6379

1.1 redis 术语

  • 缓存击穿:某一热点过期,此时又有大量用户访问这个热点

【Redis】之安装、配置、持久化~

  • 缓存穿透:查询不存在的数据。大量请求访问mysql和redis不存在的资源

【Redis】之安装、配置、持久化~

  • 缓存雪崩:redis中大量缓存集体过期,请求全部发送给mysql

【Redis】之安装、配置、持久化~

1.2 redis 特性

  • 纯内存结构
  • 单线程
  • 多路复用机制

数据读的操作流程:

【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进行调优:

【Redis】之安装、配置、持久化~

 [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 工具

【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      //登录成功

【Redis】之安装、配置、持久化~

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.pidpid文件位置
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) 子进程发送信号给父进程表示完成,父进程更新统计信息

【Redis】之安装、配置、持久化~

4.1.1 实现RDB方式:

方式说明
save同步,会阻塞其它命令,不推荐使用
bgsave异步,后台执行,不影响其它命令的执行
自动制定规则,自动执行

4.1.2 RDB持久化触发条件

  1. 手动触发
 save     //保存持久化
 bgsave   //后台执行,不会影响当前操作,建议使用!

当bgsave 在后台备份时,如何查看是否备份完成:

 #rdb_bgsave_in_progress:0  
 #此处为0 表示保存结束   1表示保存没结束
  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
评论
请登录