redis持久化
RDB方式
Redis Database Backup file (redis数据备份文件), 也被叫做redis数据快照. 简单来说就是把内存中的所有数据记录到磁盘中.
快照文件称为RDB文件, 默认是保存在当前运行目录.
[root@centos-zyw ~]# docker exec -it redis redis-cli
127.0.0.1:6379> save # 由redis主进程来执行RDB, 会阻塞所有命令
OK
127.0.0.1:6379> bgsave # 开启子进程执行RDB, 避免主进程受到影响
Background saving started
127.0.0.1:6379>
bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据. 完成fork后读取内存数据并写入RDB文件.
fork采用的copy-onwrite技术:
- 当主进程执行读操作时, 访问共享内存
- 当主进程执行写操作时, 则会拷贝一份数据, 执行写操作.
- redis.conf文件配置
# 900秒内,如果至少一个key被修改,则执行bgsave, 如果是save "" 则表示禁用RDB
save 900 1
save 300 10
save 60 10000
# 是否压缩
rdbcompression yes
# RDB文件名称
dbfilename dump.rdb
# 文件保存的路径目录
dir ./
AOF方式
AOF全称Append Only File. redis处理的每一个写命令都会记录在AOF文件, 可以看做是命令日志记录文件.
- redis.conf配置
# 开启AOF功能, 默认no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"
# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always
# 写命令执行完先放入AOF缓冲区, 然后表示每嗝1秒将缓冲区写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入AOF缓冲区, 有操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
bgrewriteaof
可以让AOF文件执行重写功能, 用最少的命令达到相同效果
- redis.conf配置
# AOF文件比上次文件,增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上触发重写
auto-aof-rewrite-min-size 64mb
RDB和AOF对比
redis集群
主从集群
启动三个redis服务
- 在从节点执行slaveof命令 --5.0后新增replicaof 两命令效果一致
- 执行命令为临时生效,重启后失效, 永久方式是将命令配置在
redis.conf
文件
# 连接 7002
redis-cli -p 7002
# 执行slaveof
slaveof 192.168.150.101 7001
备注: 取消主从关系 slaveof no one
- 在主节点查看集群信息
# 连接 7001
redis-cli -p 7001
# 查看状态
info replication
优化
- 在master的redis.conf文件中配置
repl-diskless-sync
启用无磁盘复制,避免全量同步时的磁盘IO - redis单节点上的内存占用不要太大, 减少RDB导致的过多磁盘IO
- 适当提高repl_baklog的大小,发现slave宕机尽快实现故障恢复,尽可能避免全量同步
- 限制一个master上的slave节点数量,如果实在是太多slave,则可以采用主-从-从链式结构,减少master压力
repl-diskless-sync yes
哨兵集群
创建sentinel.conf文件
port 27001
sentinel announce-ip 192.168.150.101
sentinel monitor mymaster 192.168.150.101 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir "/tmp/s1"
sentinel monitor mymaster 192.168.150.101 7001 2
中mymaster为主节点名字, 2为选举master时的quorum值,当主节点挂了,2个sentinel认为你挂了,就选新的主节点,一般为sentinel的一半
dir
为sentinel.conf所在的目录
运行sentinel
复制三份sentinel.conf,修改相应配置,启动三个sentinel服务
redis-sentinel s1/sentinel.conf
RestTemplate的哨兵模式
Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换
- 引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
- 配置application.yml
spring:data:redis:sentinel:master: mymaster # 指定master名称nodes: # 指定redis-sentinel集群信息- 127.0.0.1:27001- 127.0.0.1:27002- 127.0.0.1:27003
- 配置读写分离
@Beanpublic LettuceClientConfigurationBuilderCustomizer customizer(){return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);}
分片集群
分片集群结构
可以解决的问题
- 海量数据存储问题
- 高并发写的问题
特点:
- 集群中有多个master,每个master保存不同数据
- 每个master都可以有多个slave节点
- master之间通过ping检测彼此健康状态
- 客户端请求可以访问集群任意节点,最终都会被转发到正确节点
搭建
- 创建redis.conf
port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /tmp/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /tmp/6379
# 绑定地址 0.0.0.0 -> 任何人可访问
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
replica-announce-ip 192.168.150.101
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /tmp/6379/run.log
- 启动
redis-server redis.conf
- 建立节点关系
redis-cli --cluster create --cluster-replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003
说明:
--cluster-replicas 1
:指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1)
得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master
- 查看集群状态
redis-cli -p 7001 cluster nodes
- 操作集群需要加
-c
参数
redis-cli -c -p 7001
散列插槽
redis会把每一个master节点映射到0~16383共16384个插槽上
数据key不是与节点绑定,而是与插槽绑定. redis会根据key的有效部分计算插槽值
- key中包含
{}
且{}
中至少包含1个字符,{}
中的部分是有效部分 - key中不包含
{}
,整个key都是有效部分
例如{apper}num
,则根据apper计算. 计算方式是利用CRC16算法得到一个hash值, 对16384取余,得到的结果就是slot值.