美文网首页
Redis内容整理(2021-06-29)

Redis内容整理(2021-06-29)

作者: April7zn | 来源:发表于2021-06-29 14:42 被阅读0次

    Redis内容整理

    目录

    1. 基础数据结构
    2. 持久化
    3. 主从架构
    4. 哨兵模式
    5. 集群配置

    面试整理


    1. 基础数据结构

    string, value是一个字符串,在没有确定数据结构的复杂度时,建议使用string

    常用操作指令 说明
    set 给key设置一个值
    get 获取一个key的值
    del 删除一个key
    mset 批量设置key的值
    mget 批量获取多个key的值
    setnx 判断key是否已经存在,如果存在返回0不做操作,如果不存在插入并返回1
    exists 判断key是否存在
    incr 给key设置自增+1
    incrby 给key设置自增+n
    decr 给key设置自减-1
    decrby 给key设置自减-n
    expire 给key设置过期时间
    ttl 查看key的过期时间

    hash,value是个<field, vlaue>的键值对集合,field没有过期时间的属性。可以存储相对string比较复杂的数据,单个key的field建议不超过5000

    常用操作指令 说明
    hset 给key设置一个field
    hget 获取key的一个field
    hdel 删除key的一个field
    hmset 给key设置多个field
    hmget 获取key的多个field
    hsetnx 判断key的field是否存在,如果存在返回0不做操作,如果不存在插入并返回1
    hlen 获取key的field个数
    hgetall 获取key的所有field
    hincr key的field自增+1

    list,value是个有序的链表,可以通过他实现栈(FILO),队列(FIFO),阻塞队列

    常用操作指令 说明
    lpush 在列表的最左端push一个值
    rpush 在列表的最右端push一个值
    lpop 在列表的最左端弹出一个值
    rpop 在列表的最右端弹出一个值
    lbpop 在列表的最左端弹出一个值,如果null就阻塞,直到有值可以被弹出
    rbpop 在列表的最右端弹出一个值,如果null就阻塞,直到有值可以被弹出
    lrange 在列表的最左端获取对应数量的值
    llen 获取列表的长度
    lindex 获取列表索引对应的值
    lrem 根据count移除等于value的值,count>0从头,count<0从尾,count=0全部移除
    lset 给索引位置设置一个值
    linsert 给索引前或者后插入一个值

    set,value是个集合,可以用该数据类型做一些交集,并集和随机选举的运算

    常用操作指令 说明
    sadd 新增集合值
    smembers 获取集合所有值
    srem 移除集合中对应值
    scard 获取集合的长度
    sismember 检查集合中是否包含该值
    srandmember 在集合中随机选举
    spop 在集合中随机选举,并弹出
    sinter 交集
    sinterstore 将交集的结果存在一个新的集合中
    sunion 并集
    sunionstore 将并集的结果存在一个新的集合中
    sdiff 差集
    sdiffstore 将差集的结果存在一个新的集合中

    zset,value是个集合,与set不同的是每个节点都有一个score,可以通过这个score值进行排序

    常用操作指令 说明
    zadd 新增集合值
    zrem 移除集合值
    zcard 获取集合长度
    zscore 获取集合成员的分值
    zrange 获取集合正序范围区间值
    zrerange 获取集合倒序范围区间值
    zinterstore 将交集结果存到新集合
    zunionstore 将并集结果存到新集合

    2. 持久化

    RDB持久化配置,使用二进制rdb文件进行存储
    savebgsave命令可以手动执行,默认配置文件的 save使用的是 bgsave,异步的进行持久化

    # 60秒内1000个数据发生了变化,会将数据进行一次持久化到rdb文件中
    save 60 1000
    
    命令 IO类型 是否阻塞其他线程 优点 缺点
    save 同步 不会消耗额外内存 阻塞其他线程
    bgsave 异步 不会阻塞其他线程 消耗额外的内存

    AOF持久化配置,根据配置规则将命令持久化到aop文件中

    # 打开aop持久化开关,默认no
    appendonly yes
    
    # 每条操作数据的命令都进行一次持久化,安全但效率不高
    appendfsync always
    
    # 每秒的操作数据命令,进行一次持久化,建议使用此策略,兼顾安全与效率
    appendfsync everysec
    
    # no不是关闭,指的是交给系统去决定多久进行一次持久化,有效率,但不安全
    appendfsync no
    

    AOF重写,在aof文件中可能会有很多没有用的指令,所以redis会对aof文件进行重写。重写aof文件redis会fork一个子线程去执行,所以不会对redis正常操作造成多大影响。可以使用指令bgrewriteaof进行重写,也可以通过下面配置进行重写

    # 配置重写的最小文件限制,太小了没有重写的必要
    auto-aof-rewrite-min-size 64mb 
    # 配置自上一次重写,文件大小增长的百分比
    auto-aof-rewrite-percentage 100
    

    RDB体积小,恢复速度快,不过安全性差,易丢失数据
    AOF体积大,恢复速度慢,安全性根据配置策略决定

    在redis启动恢复数据时,AOF相对RDB的优先级要高,因为AOF的数据要比RDB的更完整

    Redis4.0 混合持久化

    # 开启混合持久化
    aof-use-rdb-preamble yes
    

    在开启混合持久化后,当aop文件发生重写时,会将重写前的所有指令写为rdb格式的内容,在将后续的aof指令追加存放在一个新的aof文件中,重写完成后替换appendonly.aof文件,redis重启时,先恢复rbd区域的数据,然后再加载aof的数据指令 这样就可以大大的加快了重启速度


    appendonly.aof

    3. 主从架构

    主从架构

    主从节点配置

    # 设置master节点ip地址和端口
    replicaof ip port
    # 设置master的密码
    masterauth <yourpassword>
    # 设置slave节点只读
    replica-read-only yes
    # 对外暴露的ip
    replica-announce-ip
    # 对外暴露的端口
    replica-announce-port
    

    为一个master节点配置一个slave节点,不管这个slave节点是否第一次连接,都会向master发送一个SYNC请求。master接收到这个SYNC请求后,会在后台通过 bgsave进行持久化rdb,在持久化新的rdb文件之前,所有接收到的请求命令都会同时放入到一个缓冲区,rdb文件完成持久化后同步给slave节点,slave节点将rdb文件持久化并加载到内存中,之后master会将缓冲区的命令同步给slave节点。
    如果因为某些原因断开连接,slave会自动重连master
    如果master有多个slave节点并发连接,master只会持久化一次
    master与slave断开重连后,一般是对数据完整的复制,在redis2.8以后可以部分复制,实际上就是缓冲区同步的每个指令都有个offset标记,重连后在master的缓冲区如果找到对应的offset就直接同步缓冲区后面的命令,如果没有对应的offset就进行全量同步

    主从同步 重连

    4. 高可用哨兵架构

    sentinel哨兵
    是redis的一种特殊服务,他本身不提供读写服务,用作监听redis实例节点。哨兵架构下redis client通过sentinel获取redis的master节点,后续访问master节点,并不会一直连接sentinel节点。当有master节点故障,sentinel会选举新的节点通知给client(一般client都实现了订阅功能,订阅了sentinel发布节点变动消息)
    选主机制
    主观下线:每个sentinel节点会对redis集群节点发送心跳包,如果有节点在 down-after-milliseconds内没有回复心跳,则认为该节点主观下线
    客观下线:当其中一个节点被sentinel节点认为主观下线时,并不意味真的下线了,需要其他sentinel节点共同认为主观下线才可以。超过 quorum数量的sentinel节点认同主观下线,则是客观下线。如果下线的是sentinel节点 或者slave节点,那么就到此结束了,如果是master节点,那么就开始从slave节点中选取一个master节点
    选取主节点前,sentinel节点之间需要竞选一个leader,每个节点都可能成为leader,与确认客观下线一样,在sentinel节点发现有master节点主管下线时,就会给所有sentinel发起一个请求,如果同意的数量大于等于 quorum节点,那么这个sentinel节点竞选成功
    sentinel选举规则

    1. 优先排除故障节点
    2. 选择优先级slave-priority最大的
    3. offset偏移量最大的
    4. 选择runid最小的

    配置sentinel
    复制一份sentinel.conf然后配置如下

    # 配置监听redis集群的mater节点,quorum是指多少个sentinel节点认为一个master失效
    sentinel monitor <master ip> <port> <quorum>
    

    redis-sentinel sentinel.conf // 运行sentinel节点
    sentinel节点一般是建议配置三个或者基数节点,因为只有超过半数才能完成选主流程,例如(2/2+1 = 1)


    5. 集群架构

    集群模式需要配置多个主从,因为在多个主节点之间是分片进行存储的,如果没有配置主从,当其中一个master出现故障时,会直接导致落在这个节点的请求失败,无法立即做出响应。配置了主从后,当其中有mater节点发生故障时,它下面的从节点会第一时间发现,并发送fail的请求给其他集群节点,这时其他正常的master节点会收到fail请求,并会对第一个接收到的fail请求做出ack响应,故障的master节点下面的从节点接收到ack数量超过master节点总数的一半,就会被选为新的master节点
    集群模式建议配置奇数节点,3,5,7 因为在当有mater节点发生故障时,偶数的节点无法做出选举,选举的条件是超过总master节点总数的一半
    总线端口是留给gossip协议用作每个节点通信,在不同服务器上部署时,注意开放端口访问权限,默认此端口是redis服务端口加10000
    集群配置

    # 暴露被访问的地址,也就是所使用的网卡被分配的ip(或者全部注释掉,默认扫描全部可以被访问的地址)
    bind 0.0.0.0 
    
    # 关闭安全保护模式,如果打开的话,没有设置bind参数并且没有设置密码,只有本地可以访问
    protected-mode no
    
    # 因为集群自动分配主从,每个节点如果都设置了密码。需要在这里配置好对应密码供节点之间能够相互访问
    masterauth <yourpassword>
    
    # 打开集群模式
    cluster-enabled yes
    
    # 配置当前节点的集群配置文件名称,文件名称尽量对应当前节点的端口
    cluster-config-file nodes-6379.conf
    
    # 配置当前节点故障,重连的超时时间,不要设置太短,网络抖动并非真的故障会导致服务频繁主从切换
    cluster-node-timeout 15000
    
    # 当前节点暴露的ip,如果没有当前节点没有被发现,可以配置暴露ip
    cluster-announce-ip
    # 当前节点暴露的port
    cluster-announce-port
    # 当前节点暴露的总线端口,gossip协议使用此端口用来节点之间通信,默认是port加偏移量10000
    cluster-announce-bus-port
    

    启动cluster节点
    redis-server redis.conf // 逐个节点启动
    redis-cli -a <password> —cluster create [ host port ] —cluster-replicas <slave num> // 开启集群 并配置集群信息。 服务自动分配master和slave节点,并为其分片


    相关文章

      网友评论

          本文标题:Redis内容整理(2021-06-29)

          本文链接:https://www.haomeiwen.com/subject/dybcultx.html