【Redis】常用指令及持久化,高可用

Redis

RDB持久化

# 900秒内,如果至少有一个key被修改,则执行bgsave,如果是save ""则表示禁用RDB
save 900 1
save 300 10
save 60 10000

# 是否压缩(压缩消耗CPU)
rdbcompression no

# RDB文件名称
dbfilename dump.rdb

# 文件保存的路径目录
dir /var/lib/redis

缺点
RDB执行间隔长,两次RDB写入数据有丢失的风险
fork子进程,压缩,写出RDB文件都比较耗时

AOF持久化

Redis处理的每一个写指令都会记录在AOF文件,可以看作是命令日志文件

# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件名称
appendfilename "appendonly.aof"

# 每执行一次写命令,立即记录到AOF文件
appendfsync always
# 写命令执行完先放入AOF缓冲区,然后每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no

执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同的效果

# AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb

redis主从

开启主从

  1. 修改为RDB模式,关闭aof模式
# save ""
save 3600 1
save 300 100
save 60 10000

# 关闭AOF
appendonly no

  1. 设置主从关系
    主节点:可以读写
    从节点:只能读
# 在从节点中打开redis-cli,设置主节点
slaveof <ip> <端口>
# 查看主从关系
info replication

优化主从集群

  1. 在master中配置repl-diskless-sync yes启用无磁盘复制,避免全量同步时的磁盘IO。
  2. Redis单节点上的内存占用不要太大,减少RDB导致的过多磁盘IO
  3. 适当提高repl_baklog的大小,发现slave宕机时尽快实现故障恢复,尽可能避免全量同步
  4. 限制一个master上的slave节点数量,如果实在是太多slave,则可以采用主-从-从链式结构,减少master压力

数据同步原理

  • 全量同步:master将完整内存生成rdb,发送rdb到slave。后续命令则记录在repl_baklog,逐个发送给slave
  • 增量同步:slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave
    什么时候执行全量同步
  • slave节点第一次连接master节点时
  • slave节点断开时间太久,repl_baklog中的offset已经被覆盖时
    什么时候执行增量同步
  • slave节点断开又恢复,并且在repl_baklog中能找到offset时候

Redis哨兵机制

开启哨兵

创建sentinel.conf

port 27001
sentinel announce-ip <ip>
sentinel monitor mymaster <ip> 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir "/tmp/s1"

  • port 27001:是当前sentinel实例的端口
  • sentinel monitor mymaster 192.168.150.101 7001 2:指定主节点信息
    • mymaster:主节点名称,自定义,任意写
    • 192.168.150.101 7001:主节点的ip和端口
    • 2:选举master时的quorum值

启动实例

redis-sentinel s1/sentinel.conf

服务监控

Sentinel基于心跳机制检测服务状态,每隔1秒向集群的每个实例发送ping命令:
主观下线:如果sentin节点发现某个实例未在规定时间响应,则认为该实例主观下线。
客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过sentinel实例数量的一半。

选举新的master

一旦发现master故障,sentinel需要在slave中选择一个作为新的master,选择依据是:

  • 首先判断slave节点与master节点断开时间长短,如果超过指定值(down-after-milliseconds*10)则会排除该slave节点
  • 然后判断slave节点的slave-priority值,越小优先度越高,如果是0则永不参与选举
  • 如果slave-prority一样,则判断slave节点的offset值,越大说明数据越新,优先级越高
  • 最后是判断slave节点的运行id大小,越小优先级越高

实现故障转移

  • sentinel给备选的slave1节点发送slaveof no one命令,让该节点成为master
  • sentinel给其他slave发送slaveof <端口>,让这些slave成为新master的从节点,开始从新的master上同步数据
  • 最后,sentin将故障节点标记为slave,当故障节点恢复后会自动成为新的master的slave节点

java中使用

引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

导入配置

spring:
  redis:
    sentinel:
# master名字,在sentinel.conf中自定义
      master: mymaster
# 节点ip
      nodes:
        - 192.168.2.9:27003
        - 192.168.2.9:27002
        - 192.168.2.9:27001

配置读写分离

@Bean
    public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
        return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
    }

ReadFrom包含

  • MASTER:从主节点读取
  • MASTER_PREFERRED:优先从master节点读取,master节点不可用才读slave
  • REPLICA:从slave(replica)节点读取
  • REPLICA_PREFERRED:优先从slave(replica)节点读取,所有的slave都不可用才读取master

分片集群

创建

创建redis.conf

port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /tmp/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /tmp/6379
# 绑定地址
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-cli --cluster create --cluster-replicas 1 <ip>:<端口> <ip>:<端口> <ip>:<端口> <ip>:<端口> <ip>:<端口> <ip>:<端口>

命令说明:

  • redis-cli --cluster或者./redis-trib.rb:代表集群操作命令
  • create:代表是创建集群
  • --replicas 1或者--cluster-replicas 1 :指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1) 得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master

通过命令可以查看集群状态:

redis-cli -p 7001 cluster nodes

添加节点

添加

redis-cli --cluster add-node <新节点(ip:端口)> <旧节点(ip:端口)>

重新分片

redis-cli --cluster reshard 192.168.2.9:7001 --cluster-from 2f8a25fabfab148c0a3d79952ec6a600ffca6820 --cluster-to 5e6763303fbf0c77e7d5a3186504b5acd3bb5363 --cluster-slots 2000

从id为2f8a25fabfab148c0a3d79952ec6a600ffca6820迁移2000个槽到5e6763303fbf0c77e7d5a3186504b5acd3bb5363
id从redis-cli -p 7001 cluster nodes 查看

删除节点

将要删除的节点分片给其他master节点
然后删除

redis-cli --cluster del-node 192.168.2.9:7001 <要删除节点的id>

手动关闭

使用redis-cli连接节点shutdown
重启redis
连接重启后的节点输入CLUSTER FAILOVER,使当前节点成为master节点

在java中

配置

spring:
  redis:
    cluster:
      nodes:
        - 192.168.2.9:7001
        - 192.168.2.9:7002
        - 192.168.2.9:7003
        - 192.168.2.9:8001
        - 192.168.2.9:8002
        - 192.168.2.9:8003

常用指令

字符串

set key value

//设置key为name,value为xair
set name xair

get key

//获取name的value
get name

setex key seconds value

//设置指定key的值,将其过期时间设置为30s
setex name 30 xair

setnx key value

// 只有在key不存在时设置key的值
setnx name xair

哈希操作指令

HSET key field value将哈希表 key 中的字段 field 的值设为 value
HGET key field 获取存储在哈希表中指定字段的值
HDEL key field 删除存储在哈希表中的指定字段
HKEYS key 获取哈希表中所有字段
HVALS key 获取哈希表中所有值

列表操作指令

LPUSH key value1 [value2] 将一个或多个值插入到列部表头
LRANGE key start stop 获取列表指定范围内的元素
RPOP key 移除并获取列表最后一个元素
LLEN key 获取列表长度

集合操作指令

SADD key member1 [member2] 向集合添加一个或多个成员
SMEMBERS key 返回集合中的所有成员
SCARD key 获取集合的成员数
SINTER key1 [key2] 返回给定所有集合的交集
SUNION key1 [key2] 返回所有给定集合的并集
SREM key member1 [member2] 移除集合中一个或多个成员

有序集合操作指令

ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZRANGEBYLEX key min max [LIMIT offset count] 通过字典区间返回有序集合的成员
ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
ZREM key member [member …] 移除有序集合中的一个或多个成员

通用指令

keys pattern 查找所有符合给定模式的key
exists key 检查给定key是否存在
type key 返回key所储存的值的类型
del key 该命令用于在key存在是删除key

Spring Cache

常用注解

注解说明
@EnableCaching开启缓存注解功能,加在启动类上
@Cacheable在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值效到缓存中
@CachePut将方法的返回值放到缓存中
@CacheEvict将一条或多条数据从缓存中删除

使用方式

@CachePut(cacheNames = "userCache", key = "#user.id") //如果用spring cache缓存数据,key的生成: userCache::id
public User save(@RequestBody User user) {
    userMapper.insert(user);
    return user;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值