Redis的配置与介绍

什么是Redis?

Redis是一种非关系型数据库,而非关系型数据库产生对的背景是为了满足数据的高并发读写需求,满足海量数据高效存储与访问的需求,满足高可用扩展性和高可用性需求。

非关系型数据库和关系型数据库最大的区别就是数据结构的不一样,关系型数据库是以表的结构进行存储的,而非关系型数据库是以键值对的结构进行存储,而且数据是存放在内存中的,当服务备关闭时数据会通过某种形式存储到磁盘,关系型数据库就是将数据直接存储到了磁盘。

不同:数据存储方式、扩展方式(关系型数据库纵向扩展容易达到上限,非关系型未横向扩展可以通过添加数据库服务器来分担扩展)负载分担。、事务性支持不同(关系型优势在于性能的稳定性。非关系型优势则在于扩展性和大数据量。)。

Redis可以说时分布式架构不可或缺的一环,由于是单进程模型,所以可以同时启动多个Redis进程,但处理速度海事依靠于主进程执行效率。(只运行一个Redis进程那么多个客户端访问时服务器性能就会下降。然而同时开启多个进程服务器CPU负载又会变大。)

通俗易懂的安装搭建过程

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yum install -y gcc gcc-c++ make
cd /opt/
tar zxvf redis-5.0.7.tar.gz 
#进入目录然后直接make
cd /opt/redis-5.0.7/
make # 进行编译
# 通过PREFIX直接指定安装目录
make PREFIX=/usr/local/redis install
#由于Redis源码包中直接提供了Makefile 文件,所以在解压完软件包后,
不用先执行./configure 进行配置,可直接执行make与make install命令进行安装
cd /opt/redis-5.0.7/utils 
# 通过执行脚本对redis配置文件进行设置,
./install_server.sh  
# 在最后一个选项中指定redis的可执行路径即可

#把redis的可执行程序文件放入路径环境变量的目录中便于系统识别
ln -s /usr/local/redis/bin/* /usr/local/bin/
#当install_server.sh 脚本运行完毕,Redis 服务就已经启动,默认侦听端口为6379
netstat -natp | grep redis

配置脚本说明

#执行软件包提供的 install_server.sh 脚本文件设置Redis服务所需要的相关配置文件
cd /opt/redis-5.0.7/utils 
./install_server.sh       
.......          #一直回车.
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/ redis-server
#需要手动修改为 /usr/local/redis/bin/redis-server    注意要一次性正确输入

## 配置文件说明
Selected config:
Port               : 6379                               #默认侦听端口为6379(此为客户端访问端口,默认机制为6379端口,若通过配置文件更改,那么需要直接指定登入数据库)
Config file        : /etc/redis/6379.conf               #配置文件路径(根据默认端口号会生成默认配置文件)
Log file           : /var/log/redis_6379.log            #日志文件路径
Data dir           : /var/lib/ redis/6379               #数据文件路径
Executable         : /usr/local/redis/bin/redis-server  #可执行文件路径
Cli Executable     : /usr/local/redis/bin/redis-cli     #客户端命令工具

redis服务的控制

#Redis服务控制
/etc/init.d/redis_6379 stop       #停止
/etc/init.d/redis_6379 start      #启动
/etc/init.d/redis_6379 restart    #重启
/etc/init.d/redis_6379 status     #状态

redis配置文件修改(重点:配置文件)

对默认生成的配置项进行更改

#修改配置 /etc/redis/6379.conf 参数(只需添加监听地址,其他已经默认开启了)
vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.200.50      		  #70行,添加监听的主机地址(当配置文件删除了默认的回环地址时,restart重启失效)
port 6379                        		  #93行,Redis默认的监听端口(配置文件中这些选项不要轻易删除,容易出错)
daemonize yes                     		  #137行,启用守护进程
pidfile /var/run/redis_6379.pid  		  #159行,指定PID文件
loglevel notice                   		  #167行,日志级别
logfile /var/log/redis_6379.log  		  #172行,指定日志文
/etc/init.d/redis_6379 restart    #重启

Redis的命令工具

redis-server: 	 用于启动Redis 的工具
redis-benchmark: 用于检测Redis在本机的运行效率
redis-check-aof: 修复AOF持久化文件
redis-check-rdb: 修复RDB 持久化文件
redis-cli: 	 	 Redis 命令行工具
rdb 和 aof 是redis服务中持久化功能的两种形式!

redis-cli

语法: redis-cli -h host -p port -a password
选项:
	-h :指定远程主机
	-p :指定Redis 服务的端口号
	-a :指定密码,未设置数据库密码可以省略-a选项
若不添加任何选项表示,则使用127.0.0.1:6379 连接本机上的 Redis 数据库,
redis-cli -h 192.168.80.40 -p 6379

redis-benchmark:性能测试

基本的测试语法: redis-benchmark [选项] [选项值]
-h :指定服务器主机名。
-p :指定服务器端口。
-s :指定服务器socket(套接字)
-c :指定并发连接数。
-n :指定请求数。
-d :以字节的形式指定 SET/GET 值的数据大小。
-k : 1=keep alive  0=reconnect
-r : SET/GET/INCR 使用随机key, SADD使用随机值。
-P :通过管道传输<numreq>请求。
-q :强制退出redis。 仅显示query/sec 值。
--csv :以CSV格式输出。
-l :生成循环,永久执行测试。
-t :仅运行以逗号分隔的测试命令列表。
-I : Idle模式。仅打开 N 个idle连接并等待。

实例一:向IP地址为192.168.80.40、 端口为6379 的Redis 服务器发送100个并发连接与100000 个请求测试性能。
redis-benchmark -h 192.168.80.40 -p 6379 -c 100 -n 100000

示例二:测试存取大小为100字节的数据包的性能。
redis-benchmark -h 192.168.80.40 -p 6379 -q -d 100

示例三:测试本机上Redis 服务在进行set与lpush操作时的性能。(写/查100000个数据的能力)
redis-benchmark -t set,lpush -n 100000 -q 

Redis的常用命令


set: 存放数据,命令格式为 set key value
get: 获取数据,命令格式为 get key
keys s *	获取所有的key
keys s*	以s开头的数据
keys s?	以s开头后面包含任意一位的数据
exists aaa	判断aaa 是否存在(存在:1,不存在:0)
del key	删除当前数据库的key
type key	获取key对应的 value 值类型
rename key1 key2	将key1修改为key2
renamenx key1 key2	将key1修改为key2之前判断key2是否存在,存在则重命名
dbsize	查看当前数据库中key的数目
Redis支持多数据库,Redis 默认情况下包含16个数据库,数据库名称是用数字0-15 来依次命名的。
多数据库相互独立,互不干扰。

#多数据库间切换
命令格式: select 序号
使用 redis-cli 连接Redis数据库后,默认使用的是序号为 0 的数据库。
127.0.0.1:6379> select 10        #切换至序号为10的数据库
127.0.0.1:6379[10]> select 15    #切换至序号为15的数据库
127.0.0.1:6379[15]> select 0     #切换至序号为0的数据库

# 多数据库操作:将当前数据库的数据移动指定数据库序号:1
move tete1 1      #将数据库0中tete1移动到数据库1中
#清除数据库内数据
FLUSHDB  :清空当前数据库数据
FLUSHALL :清空所有数据库的数据,慎用!

何为高可用?

在WEB服务中,高可用衡量标准是在指定的时间内能正常提供服务,稳定性和准确性可高达99.99%左右,redis则包含了:主从分离、快速容灾技术、数据容量扩展、数据安全不丢失。

高可用的作用:持久化、主从复制、哨兵、集群

持久化 :持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。
主从复制 :主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。
哨兵 :在主从复制的基础上,哨兵实现了自动化的故障恢复。缺陷 :写操作无法负载均衡;存储能力受到单机的限制。
集群 : 通过集群, Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善 的高可用方案。

持久化:将数据进行备份,存储到硬盘不会由于进程的退出而丢失,而持久化的方式存在两种:
1、RDB持久化:内存上的数据定时保存到磁盘,触发方式有save(手动触发),会将Redis进程阻塞用于备份数据。bgsave(手动触发),会生成子进程(fork进程)进行备份,但是也会阻塞fork子进程。对于save,在线上环境绝对不能使用。

配置自动触发RDB备份

save m n				#通过配置设置触发(自动触发会主动选择bgsave进行备份)
vim /etc/redis/6379.conf
-----219行--以下三个save条件满足任意一个时,都会引起bgsave的调用
save 900 1 :当时间到900秒时,如果redis数据发生了至少1次变化,则执行bgsave
save 300 10 :当时间到300秒时, 如果redis数据发生了至少10次变化,则执行bgsave
save 60 10000 :当时间到60秒时,如果redis数据发生了至少10000次变化, 则执行bgsave
-----242行--是否开启RDB文件压缩
rdbcompression yes
-----254行--指定RDB文件名
dbfilename dump.rdb
-----264行--指定RDB文件和AOF文件所在目录
dir /var/lib/redis/6379

从节点执行全量复制操作,主节点就会执行bgsave,将rdb文件发送给从节点。执行shutdown,也会自动执行rdb持久化
RDB能载入工作是自动执行的。载入期间redis进程阻塞。(载入时Redis会对文件进行校验)

AOF与RDB不同,RDB是将进程数据写入文件重启时读取文件还原备份、AOF是将Redis的每次写和删除命令记录到单独的日志文件重启时通过执行命令恢复数据。(AOF优先级高于RDB,同时启动优先使用AOF)

# 开启AOF的方式
vim /etc/redis/6379.conf
-----700行--修改, 开启AOF
appendonly yes
-----704行--指定A0F文件名称
appendfilename "appendonly.aof"
-----796行--是否忽略最后一条可能存在问题的指令
aof-load-truncated yes
/etc/init.d/redis_6379 restart				#重启redis

由于AOF的备份方式十分特殊,所以来说说AOF执行流程:

  1. 命令追加:Redis的写命令会追加到缓冲区(aof_buf),这样命令就不会直接写入硬盘导致Redis负载出现瓶颈。它也是一种纯文本格式,兼容性好等,在AOF文件中除了select命令是由Redis添加(select 0),其它为客户端发送过来的写命令.
  2. 文件写入/同步:根据同步策略(write、fsync)将aof-buf内容同步到硬盘,实际上write函数会通过一定时间就直接将内存缓冲区数据写入硬盘,但是为了避免在未执行自动写入就停机导致此期间数据丢失所以出现了 fsync、fdatasync 函数强制将缓冲区数据写入硬盘(保证数据安全性)。
# AOF缓存区三种同步方式:
vim /etc/redis/6379.conf
---729---
● appendfsync always:
解释:命令写入aof_ buf后立即调用系统fsync操作同步到AOF文件,fsync完成后线程返回。
	 这种情况下,每次有写命令都要同步到AOF文件,硬盘IO成为性能瓶颈,Redis只能支持大约几百TPS写入,
	 严重降低了Redis的性能;即便是使用固态硬盘(SSD),每秒大约也只能处理几万个命令,而且会大大降低SSD的寿命。
● appendfsync no:
解释:命令写入aof_ buf后调用系统write操作,不对AOF文件做fsync同步;
	 同步由操作系统负责,通常同步周期为30秒。这种情况下,文件同步的时间不可控,
	 且缓冲区中堆积的数据会很多,数据安全性无法保证。
● appendfsync everysec:
解释:命令写入aof_ buf后调用系统write操作,write完成后线程返回; 
	 fsync同步文件操作由专门的线程每秒调用一次。
	 everysec是前述两种策略的折中,是性能和数据安全性的平衡,
	 因此是Redis的默认配置,也是我们推荐的配置。

文件重写(非必须开启):AOF文件同样会持续增大,但AOF文件重写就是为了减小AOF文件的内存(将AOF重写将Redis进程内的数据转换为写命令同步到新AOF文件)。新文件产生后就不会对旧AOF文件读取或写入。
至于为什么文件重写能压缩AOF文件:

  1. 过期数据不再写入、多条命令可合并为一个(sadd myset test1, sadd myset test2, sadd myset test3可以合并为sadd myset test1 test2 test3)、无效命令不再写入(sadd myset test1, sadd myset test2, sadd myset test3)、。

手动触发:bgrewriteaof(流程类似于bgsave)
自动触发:通过设置auto-aof - rewrite-min-size选项和auto- aof - rewrite- percentage选项来自动执行BGREWRITEAOF
只有当auto-aof- rewrite- -min-size和auto-aof -rewrite-percentage两个选项同时满足时,才会自动触发AOF重写,即bgrewriteaof操作。

vim /etc/redis/ 6379. conf
----729----
● auto-aof- rewrite-percentage 100
当前AOF文件大小(即aof_current_size)是上次日志重写时AOF文件大小(aof_base_size)两倍时,
发生BGREWRITEAOF操作
● auto-aof - rewrite-min-size 64mb
当前A0F文件执行BGREWRITEAOF命令的最小值,避免刚开始启动Reids时由于文件尺寸较小导致频繁的BGREWRITEAOF

如果是AOF文件结尾不完整 (机器突然宕机等容易导致文件尾部不完整),且aof-load- truncated参数开启,则日志中会输出警告,Redis 忽略掉AOF文件的尾部,启动成功(这是因为定时写入导致最后一个时间段写入的数据不完整。)
AOF优缺点:

  1. AOF的优点在于支持秒级持久化、兼容性好,缺点是文件大、恢复速度慢、对性能影响大。
  2. 对于AOF持久化,向硬盘写数据的频率大大提高(everysec策略下为秒级),IO压力更大,甚至可能造成AOF追加阻塞问题。
  3. AOF文件的重写与RDB的bgsave类似,会有fork时的阻塞和子进程的I0压力问题。相对来说,由于AOF向硬盘中写数据的频率更高,因此对Redis主进程性能的影响会更大。

性能管理:

# 查看内存使用率
info memory

2 . 内存碎片率
操作系统分配的内存值used_ memory_ rss除以Redis使用的内存值used_ memory计算得出内存碎片是由操作系统低效的分配/回收物理内存导致的 (不连续的物理内存分配)

3 . 跟踪内存碎片率
跟踪内存碎片率对理解Redis实例的资源性能是非常重要的:
内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低
内存碎片率超过1.5,说明Redis消耗了实际需要物理内存的150号, 其中50号是内存碎片率。需要在redis-cli工具.上输入shutdown save命令,并重启Redis 服务器。
内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换。需要增加可用物理内存或减少Redis内存占用。

4 . 内存使用率
redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换。
避免内存交换发生的方法:
● 针对缓存数据大小选择安装Redis 实例
● 尽可能的使用Hash数据结构存储
● 设置key的过期时间

5 . 内回收key
保证合理分配redis有限的内存资源。
当达到设置的最大阀值时,需选择一种key的回收策略,默认情况下回收策略是禁止删除。
配置文件中修改maxmemory- policy属性值:

vim /etc/redis/6379.conf
--598--
maxmemory-policy noenviction
●volatile-lru 		:使用LRU算法从已设置过期时间的数据集合中淘汰数据
●volatile-ttl 		:从已设置过期时间的数据集合中挑选即将过期的数据淘汰
●volatile-random 	:从已设置过期时间的数据集合中随机挑选数据淘汰
●allkeys-lru 		:使用LRU算法从所有数据集合中淘汰数据
●allkeys-random 	:从数据集合中任意选择数据淘汰
●noenviction 		:禁止淘汰数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值