一篇文章玩转redis

redis数据库

一、概述

Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets)和有序集合(sorted sets)等类型。

1.1、 NoSQL

NoSQL,泛指非关系型的数据库,是不同于传统的关系型数据库的数据库管理系统的统称。

NoSQL用于超大规模数据的存储,收集万亿比特的数据。这些类型的数据存储没有固定的形式,没有多余操作就可以横向扩展。

1.2、什么是redis

Redis是NoSQL中的一种存储工具,他是一个key-value存储系统。默认有16个数据库从0到15来进行表示。Redis的存储类型:包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。在此基础上,Redis支持各种不同方式的排序。

Redis 被广泛应用在缓存方向,与传统数据库不同的是 Redis 的数据是存在内存中的,因此读写速度非常快。

Redis为分布式缓存,在多客户端的情况下,共用一份缓存数据,缓存具有一致性。

Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步,为了可靠性。

1.3、Redis特点

性能极高 – Redis读的速度是11W次/s,写的速度是81K次/s

支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

丰富的数据类型,Redis不仅仅支持简单的key-value类型的数据,同时还提供Strings, Lists, Hashes, Sets 及 Ordered Sets 等数据结构的存储。

支持数据的备份,即master-slave模式的数据备份。

1.4、Redis优缺点

优点:

  • 对数据高并发读写
  • 对海量数据的高效率存储和访问
  • 对数据具有的可扩展性和高可用性

缺点:

  • redis(ACID)处理非常简单
  • 无法做到太复杂的关系数据库模型

二、redis分布式集群

2.1、什么是集群模式

Redis 的哨兵和主从模式基本已经可以实现高可用和读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,浪费内存空间,所以在redis上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,也就是说Redis 节点上存储不同的内容

2.2、集群模式特点

多个redis节点网络互联,数据共享

所有的节点都是一主一从(也可以是一主多从),其中从节点不提供服务,仅作为备用

支持在线增加、删除节点

客户端可以连接任何一个主节点进行读写

2.3、集群工作方式

数据存取工作方式

在 Redis 的每一个节点上,都有这么两个东西,一个是插槽(slot),一个是cluster。

插槽的取值范围是:0-16383。cluster,可以理解为是一个集群管理的插件。

当我们的存取 Key的时候,Redis 会根据算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。

2.4、 环境准备

IP地址主机名环境端口
192.168.122.10redis-10安装redis6310
192.168.122.11redis-11安装redis6311
192.168.122.12redis-12安装redis6312
192.168.122.13redis-13安装redis6313
192.168.122.14redis-14安装redis6314
192.168.122.15redis-15安装redis6315
192.168.122.16redis-16管理端、安装redis6379
192.168.122.17redis-17客户端、安装redis6379
2.4.1、配置基础网络环境

(所有机器)

sudo nmcli  connection modify 有线连接\ 1 ipv4.method  manual ipv4.addresses 192.168.122.11 connection.autoconnect yes

cat /etc/network/interfaces
auto ens3
iface ens3 inet static
address 192.168.122.11
netmask 255.255.255.0
gateway 192.168.122.1
dns-nameserver 114.114.114.114

cat /etc/resolv.conf 
nameserver 202.106.0.20
nameserver 114.114.114.114

sudo systemctl  restart NetworkManager
sudo reboot
2.4.2、下载redis安装包

所有机器

apt -y install wget && wget  http://download.redis.io/releases/redis-5.0.5.tar.gz
tar zxvf redis-5.0.5.tar.gz -C /usr/local/	
cd /usr/local/
ln -s redis-5.0.5/ redis         				
cd /usr/local/redis
make && make  install
2.4.3、初始化

所有机器,根据IP不同做相应改变

root@redis-10:/usr/local/redis# ./utils/install_server.sh 
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 6310                  #端口IP
Please select the redis config file name [/etc/redis/6310.conf]  			 #回车
Selected default - /etc/redis/6310.conf
Please select the redis log file name [/var/log/redis_6310.log] 			 #回车
Selected default - /var/log/redis_6310.log
Please select the data directory for this instance [/var/lib/redis/6310] 	 #回车
Selected default - /var/lib/redis/6310
Please select the redis executable path [/usr/local/bin/redis-server] 		 #回车
Selected config:
Port           : 6310
Config file    : /etc/redis/6310.conf
Log file       : /var/log/redis_6310.log
Data dir       : /var/lib/redis/6310
Executable     : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.					 #回车
Copied /tmp/6310.conf => /etc/init.d/redis_6310
Installing service...
Success!
Starting Redis server...
Installation successful!

查看状态(所有机器,根据IP不同做相应改变)

root@redis-10:/usr/local/redis# /etc/init.d/redis_6310   status  
Redis is running (10133)
2.4.4、修改配置文件

/etc/redis/6310.conf(所有机器,根据IP不同做相应改变)

port 6310							  #端口
bind 192.168.122.10					  #ip地址
daemonize yes				    	  #守护进程方式运行
databases 16					      #数据库个数
logfile  /var/log/redis_6310.log	  #日志文件	
maxclients  10000			     	  #并发链接数量
dir  /var/lib/redis/6310			  #数据库目录

开启集群功能(所有机器,根据IP不同做相应改变)

root@redis-10:/usr/local/redis# grep "cluster-" /etc/redis/6310.conf  | grep  -v  ^"#"
cluster-enabled yes
cluster-config-file nodes-6310.conf
cluster-node-timeout 15000

修改脚本(所有机器,根据IP不同做相应改变)

root@redis-10:/usr/local/redis# sed -n '43p' /etc/init.d/redis_6310  
$CLIEXEC -h 192.168.122.10 -p $REDISPORT shutdown     #加入-h IP地址
root@redis-10:/usr/local/redis# /etc/init.d/redis_6310 restart

2.5、创建集群

2.5.1、管理端redis-16操作
root@redis-16:~# redis-cli  --cluster create 192.168.122.10:6310  \
192.168.122.11:6311 192.168.122.12:6312 192.168.122.13:6313  \
192.168.122.14:6314 192.168.122.15:6315 --cluster-replicas 1 

Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.122.14:6314 to 192.168.122.10:6310
Adding replica 192.168.122.15:6315 to 192.168.122.11:6311
Adding replica 192.168.122.13:6313 to 192.168.122.12:6312
M: 763619c994c2978b4d2db92efc9ceb6fda00ebc8 192.168.122.10:6310  #开头M,表明主库
slots:[0-5460] (5461 slots) master
M: cded5415734466d602c5cd3d3861667d91726cc2 192.168.122.11:6311  #开头M,表明主库
slots:[5461-10922] (5462 slots) master
M: 6f89e6f70437ddf9813628c9b27940240f6d826e 192.168.122.12:6312  #开头M,表明主库
slots:[10923-16383] (5461 slots) master
S: 04aed2d878541c32c4aafda600e8347fc5ab7cd2 192.168.122.13:6313 #开头S,表明从库
replicates 6f89e6f70437ddf9813628c9b27940240f6d826e
S: 58e4e15d875b446782c7b9ba241a928ebc0fb6ed 192.168.122.14:6314 #开头S,表明从库
replicates 763619c994c2978b4d2db92efc9ceb6fda00ebc8
S: dc6a93696a3f57d3177dff0a60f9acefab5e20a7 192.168.122.15:6315 #开头S,表明从库
replicates cded5415734466d602c5cd3d3861667d91726cc2
Can I set the above configuration? (type 'yes' to accept): yes  #输入yes确认配置

[OK] All 16384 slots covered.

此时,我们的集群架构图是:

image-20210415142200544

可以使用check 或者info来查看集群信息

root@redis-16:~# redis-cli  --cluster check 192.168.122.12:6312
192.168.122.12:6312 (6f89e6f7...) -> 0 keys | 5461 slots | 1 slaves.
192.168.122.10:6310 (763619c9...) -> 0 keys | 5461 slots | 1 slaves.
192.168.122.11:6311 (cded5415...) -> 0 keys | 5462 slots | 1 slaves.
2.5.1、测试

测试使用客户端redis-17连接任意一台redis服务器

root@redis-17:~# redis-cli  -h 192.168.122.14 -p 6314 -c
192.168.122.14:6314> set a 1
-> Redirected to slot [15495] located at 192.168.122.12:6312   
OK

登陆redis-12查看是否有数据

root@redis-12:~# redis-cli  -h 192.168.122.12 -p 6312 
192.168.122.12:6312> keys *
1) "a"

登陆redis-12从库redis-13查看是否有数据

root@redis-13:~# redis-cli  -h 192.168.122.13 -p 6313
192.168.122.13:6313> keys *
1) "a"

2.6、集群扩容

我们将redis-16管理端作为新加入的master,redis-17客户端作为slave

2.6.1、增加主节点

不指定角色默认为master

redis-cli --cluster add-node 新节点IP:端口     随便集群中一个节点IP:端口 

root@redis-16:~# redis-cli --cluster add-node 192.168.122.16:6379 192.168.122.12:6312
2.6.2、查看集群状态
root@redis-16:~# redis-cli --cluster info 192.168.122.14:6314
192.168.122.10:6310 (763619c9...) -> 0 keys | 5461 slots | 1 slaves.
192.168.122.11:6311 (cded5415...) -> 0 keys | 5462 slots | 1 slaves.
192.168.122.12:6312 (6f89e6f7...) -> 1 keys | 5461 slots | 1 slaves.
192.168.122.16:6379 (dc69fb21...) -> 0 keys | 0 slots | 0 slaves.    #新加入的集群,从节点0个
2.6.3、增加从节点

–cluster-slave指定角色为slave

 redis-cli --cluster add-node 新节点IP:端口     随便集群中一个节点IP:端口   --cluster-slave

root@redis-17:~# redis-cli  --cluster add-node 192.168.122.17:6379 192.168.122.10:6310 --cluster-slave
2.6.4、查看集群信息
root@redis-17:~# redis-cli  --cluster info 192.168.122.10:6310
192.168.122.10:6310 (763619c9...) -> 0 keys | 5461 slots | 1 slaves.
192.168.122.11:6311 (cded5415...) -> 0 keys | 5462 slots | 1 slaves.
192.168.122.12:6312 (6f89e6f7...) -> 1 keys | 5461 slots | 1 slaves.
192.168.122.16:6379 (dc69fb21...) -> 0 keys | 0 slots | 1 slaves.  #默认分配到没有从节点的master

添加从节点给指定master

命令:redis-cli --cluster add-node --slave --master-id 主节点ID号 从节点IP:Port 主节点IP:Port

此时新加入的主节点是0个哈希槽,还不能替集群分担压力

给新的master分配哈希槽

root@redis-16:~# redis-cli --cluster reshard 192.168.122.16:6379

How many slots do you want to move (from 1 to 16384)?   4096   #分配多少slots给新节点

What is the receiving node ID?  #哪个节点接收这些slots,复制新master的ID

Source node #1: all  #从哪个获取slots,填所有

Do you want to proceed with the proposed reshard plan (yes/no)? yes # yes继续

此时,我们再看集群信息

root@redis-16:~# redis-cli  --cluster info 192.168.122.10:6310
Could not connect to Redis at 192.168.122.17:6317: Connection refused
192.168.122.10:6310 (763619c9...) -> 0 keys | 4096 slots | 1 slaves.
192.168.122.11:6311 (cded5415...) -> 0 keys | 4096 slots | 1 slaves.
192.168.122.16:6379 (dc69fb21...) -> 0 keys | 4096 slots | 1 slaves.
192.168.122.12:6312 (6f89e6f7...) -> 1 keys | 4096 slots | 1 slaves.

2.7、删除集群

2.7.1、删除集群主节点

删除集群主节点之前要先将其上面的slot分配到其他主节点上

root@redis-16:~# redis-cli  --cluster reshard 192.168.122.16:6379  

How many slots do you want to move (from 1 to 16384)? 4096               #移除多少节点                                                                                               What is the receiving node ID? cded5415761667d91726cc2			 #接收哈希槽的masterID
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: dc69fb211e922347a717131  				#从哪台机器移除,写准备移除的主节点的ID
Source node #2: done  									#还要从哪台机器移除,done表示没有了

Do you want to proceed with the proposed reshard plan (yes/no)?   yes  #yes继续

移出集群(redis-cli --cluster del-node IP:Prot ID)

root@redis-16:~# redis-cli  --cluster del-node    \

192.168.122.16:6379  dc69fb211ed671276c469acbd51922347a717131

Removing node dc69fb211ed671276c469acbd51922347a717131 from cluster 192.168.122.16:6379
Could not connect to Redis at 192.168.122.17:6317: Connection refused
Sending CLUSTER FORGET messages to the cluster...
SHUTDOWN the node.
2.7.2、集群状态
root@redis-16:~# redis-cli  --cluster info 192.168.122.10:6310
192.168.122.10:6310 (763619c9...) -> 0 keys | 4096 slots | 1 slaves.
192.168.122.11:6311 (cded5415...) -> 0 keys | 8192 slots | 2 slaves. #接收后的槽数,多出的从库
192.168.122.12:6312 (6f89e6f7...) -> 1 keys | 4096 slots | 1 slaves.
2.7.3、删除集群从节点

redis-cli --cluster del-node IP:Prot ID

:~# cat /var/lib/redis/6379/nodes-6379.conf  #查看节点ID

:~# redis-cli  --cluster del-node 192.168.122.17:6379  38f760235bd59402c533c15c5fa28c33c689872a

Removing node 38f760235bd59402c533c15c5fa28c33c689872a from cluster 192.168.122.17:6379
Could not connect to Redis at 192.168.122.17:6317: Connection refused
Sending CLUSTER FORGET messages to the cluster...
SHUTDOWN the node.
2.7.4、集群状态
root@redis-16:~# redis-cli  --cluster info 192.168.122.10:6310
192.168.122.10:6310 (763619c9...) -> 0 keys | 4096 slots | 1 slaves.
192.168.122.11:6311 (cded5415...) -> 0 keys | 8192 slots | 1 slaves.   #剩一个从库
192.168.122.12:6312 (6f89e6f7...) -> 1 keys | 4096 slots | 1 slaves.
2.7.5、平均分配槽数
root@redis-16:~# redis-cli  --cluster rebalance 192.168.122.10:6310
2.7.6、集群状态
root@redis-16:~# redis-cli  --cluster info 192.168.122.10:6310
192.168.122.10:6310 (763619c9...) -> 0 keys | 5462 slots | 1 slaves.
192.168.122.11:6311 (cded5415...) -> 0 keys | 5461 slots | 1 slaves.
192.168.122.12:6312 (6f89e6f7...) -> 1 keys | 5461 slots | 1 slaves.
2.7.7、解散集群

所有集群中的机器

2.7.7.1、停止服务
root@redis-10:~# /etc/init.d/redis_6310 stop
2.7.7.2、删除数据库目录下的所有文件
root@redis-10:~# rm /var/lib/redis/6310/*
2.7.7.3、禁用集群功能
root@redis-10:~# grep "cluster-" /etc/redis/6310.conf 
#cluster-enabled yes
#cluster-config-file nodes-6310.conf
#cluster-node-timeout 15000
2.7.7.4、启动服务
root@redis-10:~# /etc/init.d/redis_6310 start
2.7.7.5、测试
root@redis-10:~# redis-cli  -h 192.168.122.10 -p 6310
192.168.122.10:6310> cluster info
ERR This instance has cluster support disabled   #已禁用集群

三、主从复制

3.1、单机问题

3.1.1、机器宕机

如果发生机器宕机(主板烧坏、硬盘损坏、内存损坏等),短时间内我们也无法修复,我们就会考虑将redis迁移到另外一台机器上,并且还要考虑数据同步问题。

3.1.2、容器瓶颈

一台机器内存是16G,redis使用12个G内存,除了redis还要使用其他的应用,这个时候,我们可能需要32个G内存才能使用,但是redis的应用对内存的增加也会提交,我们不能一直去提高单机的内存?

3.1.3、QPS瓶颈

redis官方数据显示redis可以处理达到10w的QPS,如果业务需要50w、100w的QPS时我们怎么办?

关于容量瓶颈、QPS瓶颈和机器宕机,这就是redis分布式和高可用需要解决的问题。

3.2、什么是主从复制

Master可以拥有多个slave;多个slave可以连接同一个Master外,还可以连接到其他的slave;主从复制不会阻塞Master,在主从复制时,Master可以处理client请求。

3.2.1、主从复制作用

数据备份

将master的数据,备份到slave

读写分离

用master来写入数据,用slave完成备份后,来完成只读的功能。

注意:

当master宕机后,不会去选择slave作为master。需要手动将一台slave使用slaveof on one提升为master,要想自动实现提升,我们就需要使用哨兵。

四、哨兵模式

4.1、概述

哨兵是一个分布式系统,你可以在一个架构中运行多个哨兵进程,这些进程使用流言协议来接收关于Master主服务器是否下线的信息,并使用投票协议来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master。

4.2、为什么要启动哨兵模式

当我们的主服务器宕机后,要手动的去切换主从模式,这样的人工干预,费事费力,还会造成一段时间我们的服务不能使用。所有我们要使用哨兵模式来解决这一问题。

4.3、什么是哨兵模式

哨兵是对Redis的系统的运行情况的监控,它是一个独立进程,功能有二个:

监控主机Redis和从机Redis是否运行正常;

主机Redis出现故障后自动将从机转化为主机;

4.4、哨兵功能

集群监控:负责监控主从集群中的Master和Slave进程是否正常工作。

故障转移(failover):如果Master宕机,会自动从Slave中选举出新的Master,进行主从自动切换。

4.5、redis主从环境配置

三种模式:一主一从、一主多从、主从从

搭建主从从+哨兵架构

redis-11是redis-10的从库,同时也是redis-12的主库,redis-16为哨兵服务器

IP地址主机名端口角色
192.168.122.10redis-10安装redis6310
192.168.122.11redis-11安装redis6311从(主)
192.168.122.12redis-12安装redis6312
192.168.122.16redis-16安装redis6379哨兵服务器

img

4.5.1、redis服务器配置

redis-11配置

root@redis-11:~# grep "replicaof" /etc/redis/6311.conf 
replicaof 192.168.122.10 6310

root@redis-11:~# /etc/init.d/redis_6311 restart

redis-12配置

root@redis-12:~#  grep "replicaof" /etc/redis/6312.conf 
replicaof 192.168.122.11 6311

root@redis-12:~# /etc/init.d/redis_6312 restart
4.5.2、哨兵服务器配置

redis-16配置(/usr/local/redis/sentinel.conf )

bind 0.0.0.0
daemonize yes
sentinel monitor redis-sentinel 192.168.122.10  6310  1  
#  redis-sentinel   //给哨兵起个名字;
#  1			    //当有一台宕机之后,进行选举;

启动服务
root@redis-16:~# redis-sentinel /usr/local/redis/sentinel.conf

redis-10查看配置

root@redis-10:~# redis-cli -h 192.168.122.10 -p 6310
192.168.122.10:6310> info replication
role:master
connected_slaves:1
slave0:ip=192.168.122.11,port=6311,state=online,offset=1386,lag=0

redis-11查看配置

root@redis-11:~# redis-cli  -h 192.168.122.11 -p 6311
192.168.122.11:6311> info replication
role:slave
master_host:192.168.122.10
master_port:6310
master_link_status:up
connected_slaves:1
slave0:ip=192.168.122.12,port=6312,state=online,offset=1400,lag=0

redis-12查看配置

root@redis-12:~# redis-cli -h 192.168.122.12 -p 6312 
192.168.122.12:6312> info replication
role:slave
master_host:192.168.122.11
master_port:6311
master_link_status:up

4.6、测试

测试redis-10写入数据,redis-11和redis-12数据是否同步

#redis-10:
192.168.122.10:6310> mset test 1  age 11
OK

#redis-11:
192.168.122.11:6311> keys *
1) "age"
2) "test"

#redis-12:
192.168.122.12:6312> keys *
1) "test"
2) "age"

测试redis-10主服务器宕机,redis-11是否能晋升为redis-12的主库

redis-11:

192.168.122.11:6311> info replication
role:master
connected_slaves:1
slave0:ip=192.168.122.12,port=6312,state=online,offset=14767,lag=1

五、redis持久化

Redis支持两种数据持久化方式:RDB方式和AOF方式。前者会根据配置的规则定时将内存中的数据持久化到硬盘上,后者则是在每次执行写命令之后将命令记录下来。两种持久化方式可以单独使用,但是通常会将两者结合使用。

5.1、什么是持久化

持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。

5.2、持久化方式

Redis支持RDB和AOF两种持久化机制:

RDB(快照方式): RDB方式是一种快照式的持久化方法,将某一时刻的数据持久化到磁盘中。这种方式就是将内存中数据以快照的方式写入到二进制文件中 ,默认的文件名为dump.rdb。

AOF(日志追加): AOF方式是将执行过的写指令记录下来,在数据恢复时按照从前到后的顺序再将指令执行一遍。这种方式 redis 会将每一个收到的写命令都通过 write 函数追加到文件中(默认appendonly.aof)。

5.3、RDB优缺点

优点:

RDB是一个紧凑的单一文件,方便传送,适用于灾难恢复。

与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些。

缺点:

Redis意外宕机,可能会丢失几分钟的数据(取决于配置的save时间点)。RDB方式需要保存珍整个数据集,是一个比较繁重的工作,通常需要设置5分钟或者更久做一次完整的保存。

针对RDB不适合实时持久化的问题,Redis提供了AOF持久化方式来解决。

5.4、AOF优缺点

优点:

AOF只是追加日志文件,因此对服务器性能影响较小,速度比RDB要快,消耗的内存较少。

缺点:

AOF方式生成的日志文件太大,即使通过AOF重写,文件体积仍然很大。

恢复数据的速度比RDB慢。

5.5、RDB持久化触发机制

触发RDB持久化过程分为手动触发和自动触发

5.5.1、手动触发

手动触发持久化的操作有二个:save和bgsave。它们主要区别体现在:是否阻塞 Redis 主线程的执行。

save命令

在客户端中执行 save 命令,就会触发 Redis 的持久化,但同时也是使 Redis 处于阻塞状态,直到 RDB 持久化完成,才会响应其他客户端发来的命令,所以在生产环境一定要慎用。

5.5.2、自动触发

自动触发持久化,本质是 Redis 通过判断,如果满足设置的触发条件,自动执行一次 bgsave 命令。

RDB 自动持久化主要来源于以下几种情况:

5.6、AOF持久化

AOF方式在使用Redis存储非临时数据时,一般都需要打开AOF持久化来降低进程终止导致的数据丢失,AOF可以将Redis执行的每一条写命令追加到硬盘文件中,这一过程显然会降低Redis的性能,但是大部分情况下这个影响是可以接受的,另外,使用较快的硬盘能提高AOF的性能。

5.6.1、AOF特点

默认文件名是 appendonly.aof。保存的位置由配置中 dir 来配置目录。

AOF 每次都会保存写命令,数据实时性更高。

AOF 需要使用“重写机制”来优化,每次记录写命令,文件会很大的问题。

AOF 根据不同的“缓冲区同步策略”将我们缓冲区中写入的命令,同步到磁盘。

5.6.2、缓冲区同步策略

设置appendfsync 控制,一共3种:

always:  #客户端的每一个写操作都保存到aof文件当,这种策略很安全,但是每个写都会有IO操作,所以也很慢。

everysec:#每秒写入一次aof文件,因此,最多可能会丢失1s的数据。 推荐使用这种方式。

no:       #交由操作系统来处理什么时候写入aof文件。更快,但也是最不安全的选择,不推荐使用。

rdb自动开启,配置文件(/usr/local/redis/redis.conf)中的默认配置

save 900 1    #当 900s 内如果有 1次 Redis 键值发生改变,就会触发持久化;

save 300 10   #当 300s 内如果有 10次 Redis 键值发生改变,就会触发持久化;

save 60 10000   #当 60s 内如果有 10000次 Redis 键值发生改变,就会触发持久化;
5.6.3、AOF持久化

修改配置文件/usr/local/redis/redis.conf

appendonly yes #表示开启AOF持久化,默认是no表示关闭

 appendfilename "appendonly.aof" #AOF持久化文件名 

appendfsync everysec #缓冲同步策略,默认值 ,每一秒写入aof文件,并完成磁盘同步

#appendfsync always #缓冲同步策略,时时写入aof文件,并完成磁盘同步
#appendfsync no #写入aof文件,不等待磁盘同步

auto-aof-rewrite-percentage 100 #AOF文件增长率(当前AOF文件大小超过上一次重写的AOF文件大小的百分之多少才会重写) 

auto-aof-rewrite-min-size 64mb #表示运行AOF重写时文件最小体积,默认为64MB。比如满了64mb后去重,成了50mb,需要写到去重后的100%,也就是再写50mb,才触发去重
5.6.4、修复aof日志文件
$ redis-check-aof -fix file.aof
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值