• Redis【超详解!!!】


    在这里插入图片描述

    事务管理

    Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

    • 批量操作在发送 EXEC 命令前被放入队列缓存。
    • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
    • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

    一个事务从开始到执行会经历以下三个阶段:

    • 开始事务。
    • 命令入队。
    • 执行事务。
    序号命令及描述
    1DISCARD 取消事务,放弃执行事务块内的所有命令。
    2EXEC 执行所有事务块内的命令。
    3MULTI 标记一个事务块的开始。
    4UNWATCH 取消 WATCH 命令对所有 key 的监视。
    5[WATCH key key …] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
    • redis中的事务跟关系型数据库的事务是一个相似的概念,但又不同之处。
    • 关系型数据库事务执行失败后面的sql不再执行,而redis中的一条命令执行失败后,其余的命令照常实行;
    • redis开启事务命令不一样
    redis与mysql比较
    Mysqlredis
    开启start transaction /beginmulti
    语句普通sql普通命令
    失败rollback 回滚discard 取消 (不叫回滚,是队列中的命令不执行,队列里面的任务根本没有执行,而不是执行了也可以撤销回来)
    成功commitexec

    redis 慢日志查询

    slow log 是redis 记录查询执行时间的日志系统,保存在内存中,读写速度快

    983:# slow log. When a new command is logged the oldest one is removed from the
    987:# to one second. Note that a negative number disables the slow log, while
    989:slowlog-log-slower-than 10000
    992:# You can reclaim memory used by the slow log with SLOWLOG RESET.
    993:slowlog-max-len 128

    redis 高可用与集群

    虽然Redis可以实现单机的数据持久化,但无论是RDB也好或者AOF也好,都解决不了单点宕机问题,即一旦单台,redis服务器本身出现系统故障、硬件故障等问题后,就会直接造成数据的丢失,因此需要使用另外的技术来解决单点问题。

    redis主从复制

    同步机制
    • 异步复制
    • 主从刚开始连接,进行全同步,全同步结束后,进行部分同步。如有需要,slave在任何时候都可以发起主同步;
    • redis策略,无论何时,都会尝试进行部分同步,如不成功,则发起全同步,并启动BGSAVE…BGSAVE结束后,传输RDB文件,文件成功,则从服务器进行部分同步,并传输积压空间中的数据

    在这里插入图片描述

    主从复制原理
    1. 从服务器向主服务器发起SYNC命令
    2. 主接收到SYNC指令调用BGSAVE,生成RDB文件,并在缓冲区记录接下来执行的所有写命令
    3. 当主服务器执行BGSAVE,他会像从服务器发送RDB文件,从服务器接受并载入RDB文件
    4. 主服务器将缓冲区存储的所有写命令发送给从服务器执行。
    命令传播

    主从完成同步后,主服务器每执行一个写命令,它都会将被执行的命令发送给从服务器,这个操作为命令的传播(command propagate)

    命令传播时一个持续的过程,只要复制仍在继续,命令传播就会一直进行,使得主从服务器的状态可以一直保持一致。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gQQWfTTY-1647344921238)(images/image-20220314202508988.png)]

    SYNC与PSYNC

    redis2.8前,断线后重连的从服务器总要执行一次完整的重同步(full resynchronization)操作,2.8以后 redis使用PSYNC命令代替SYNC,PSYNC比起SYNC最大改进在于PSYNC实现了部分重同步(partial resync)。 特性:在从服务器断线并且重新连接的时候,只要条件允许,PSYNC可以让主服务器只向从服务器同步断线期间丢失的数据,而不用重新向从服务器同步整个数据库。

    redis复制的一致性问题

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YAwIzTUU-1647344921239)(images/image-20220314203752824.png)]

    redis 复制安全性提升

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hdfTbeop-1647344921240)(images/image-20220314204550500.png)]

    Redis主从复制实践

    从服务器上修改如下两个参数即可redis.conf

    replicaof 192.168.3.49 6379

    masterauth redis

    ################################# REPLICATION #################################
    # Master-Replica replication. Use replicaof to make a Redis instance a copy of
    # another Redis server. A few things to understand ASAP about Redis replication.
    #   +------------------+      +---------------+
    #   |      Master      | ---> |    Replica    |
    #   | (receive writes) |      |  (exact copy) |
    #   +------------------+      +---------------+
    # 1) Redis replication is asynchronous, but you can configure a master to
    #    stop accepting writes if it appears to be not connected with at least
    #    a given number of replicas.
    # 2) Redis replicas are able to perform a partial resynchronization with the
    #    master if the replication link is lost for a relatively small amount of
    #    time. You may want to configure the replication backlog size (see the next
    #    sections of this file) with a sensible value depending on your needs.
    # 3) Replication is automatic and does not need user intervention. After a
    #    network partition replicas automatically try to reconnect to masters
    #    and resynchronize with them.
    # replicaof  
    # If the master is password protected (using the "requirepass" configuration
    # directive below) it is possible to tell the replica to authenticate before
    # starting the replication synchronization process, otherwise the master will
    # refuse the replica request.
    # masterauth 
    

    https://blog.csdn.net/qq_42606357/article/details/118742333

    Redis HA实践

    redis sentinel

    Redis Sentinel(译为“哨兵”)是 Redis 官方推荐的高可用性(HA)解决方案,当用 Redis 做 Master-slave 的高可用方案时,假如 master 宕机了,Redis 本身(包括它的很多客户端)都没有实现自动进行主备切换,而 Redis-sentinel 本身也是一个独立运行的进程,它能监控多个 master-slave 集群,发现 master 宕机后能进行自动切换。

    主观下线与客观下线: 采用ping的方式,主观下线单个哨兵ping 不通,客观下线多个哨兵都ping 不通

    redis sentinel 功效

    监控(Monitoring):Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。

    提醒(Notification):当被监控的某个 Redis 服务器出现问题时,Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

    自动故障迁移(Automatic failover):当一个主服务器不能正常工作时,Sentinel 会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。

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

    一个 Sentinel 进程可以与其他多个 Sentinel 进程进行连接,每个 Sentinel 进程之间可以互相检查对方的可用性,并进行信息交换

    port 26379
    pidfile "/var/run/redis-sentinel.pid"
    logfile "./sentinel26379.log"
    dir "/local/apps/redis"
    sentinel myid 6fbefcfa4c14e9c2075ad733365f9a88dd84f054
    sentinel deny-scripts-reconfig yes
    # 3s内mymaster无响应,则认为mymaster宕机了
    sentinel monitor mymaster 127.0.0.1 6380 1
    #如果10秒后,mysater仍没启动过来,则启动failover
    sentinel auth-pass mymaster redis
    # 执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步
    sentinel config-epoch mymaster 5
    # Generated by CONFIG REWRITE
    daemonize yes
    protected-mode no
    sentinel leader-epoch mymaster 6
    sentinel known-replica mymaster 192.168.3.49 6381
    sentinel known-replica mymaster 127.0.0.1 6381
    sentinel known-replica mymaster 127.0.0.1 6379
    sentinel known-replica mymaster 192.168.3.49 6380
    sentinel current-epoch 6
    
    # sentinel monitor [master-name] [master-ip] [master-port] [quorum]
    # 这里的[master-name]可以自定义,但涉及到[master-name]的参数都要相同
    sentinel monitor mymaster 127.0.0.1 6380 1
    
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    quorum的解释如下:

    (1)至少多少个哨兵要一致同意,master进程挂掉了,或者slave进程挂掉了,或者要启动一个故障转移操作
    (2)quorum是用来识别故障的,真正执行故障转移的时候,还是要在哨兵集群执行选举,选举一个哨兵进程出来执行故障转移操作
    (3)假设有5个哨兵,quorum设置了2,那么如果5个哨兵中的2个都认为master挂掉了; 2个哨兵中的一个就会做一个选举,选举一个哨兵出来,执行故障转移; 如果5个哨兵中有3个哨兵都是运行的,那么故障转移就会被允许执行

    Redis 集群

    redis集群是一个提供多个redis间共享数据的程序集。

    分布式(distributed)、容错(fault-tolerant)的redis内存K/V服务

    16384个哈希槽

    redis Cluster 至少需要三主三从 redis服务器

    Linux + nginx + php + redis

    # 添加到集群
    redis-cli --cluster create --cluster-replicas 1 192.168.65.100:6379 192.168.65.101:6379 192.168.65.102:6379 192.168.65.103:6379 192.168.65.104:6379 192.168.65.105:6379   
    # 登录集群
    redis-cli -c -p 6379
    #查看集群信息
    cluster nodes
    #查看主从信息
    info replication
    #redis-cli 集群帮助命令
    redis-cli --cluster help
    #添加新主节点
    redis-cli --cluster add-node new_host:new_port existing_host:existing_port   # new_host:new_port 要向集群中添加新的主节点  existing_host:existing_port 原集群中任意节点
    #添加新从节点
    redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id  # new_host:new_port 要向集群中添加新的主节点 existing_host:existing_port 原集群中任意节点  node_id 要添加到哪一个主节点,id是****
    #删除节点
    redis-cli --cluster del-node host:port node_id
    #hash 槽重新分配:添加新节点后,需要对新添加的主节点进行 hash 槽重新分配,此时主节点才能存储数据,Redis 一共有 16384 个槽
    redis-cli --cluster reshard host:port  #根据提示配置
    redis-cli --cluster reshard host:port --cluster-from node_id --cluster-to node_id --cluster-slots  --cluster-yes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 在 redis-cli 每次录入、查询键值,redis 都会计算出该 key 应该送往的插槽,如果不是该客户端对应服务器的插槽,redis 会报错,并告知应前往的 redis 实例地址和端口

    • redis-cli 客户端提供了 –c 参数实现自动重定向

    • 集群中,不能使用 mset、mget 等多键命令

    • 可以通过 {} 来定义组的概念,从而使 key 中 {} 内相同内容的键值对放到一个 slot 中去

    • 如果主节点下线,那么从节点可以自动升为主节点,但是如果超过 15 秒就会失败。

    • 主节点宕机然后又恢复后,会自动变为从节点。

    • 如果所有某一段插槽的主从节点都宕掉,如果配置文件 redis.conf 中的 cluster-require-full-coverage 为 yes ,整个集群都会挂掉;如果配置文件 redis.conf 中的 cluster-require-full-coverage 为 no,那么该插槽数据全都不能使用,也无法存储。

    Redis 集群的优缺点

    • 优点:

      • 实现扩容。
      • 分摊压力。
      • 无中心配置相对简单。
    • 缺点:

      • 多键操作是不被支持的。
      • 多键的 Redis 事务是不被支持的。lua 脚本不被支持。
      • 由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至 redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。
    redisdump 数据导出导入

    redis-dump数据导入导出


    在这里插入图片描述

  • 相关阅读:
    IP-guard客户端WINDOWS的打包方式
    波动率和波动率曲面套利
    Python时间模块(datetime)
    C#开发的OpenRA游戏之电力系统之二
    TCP的拥塞控制 (Tahoe Reno NewReno SACK)
    Go-Python-Java-C-LeetCode高分解法-第五周合集
    Docker常规操作命令(常用)
    c++类的初始化
    第八章 防火墙技术与原理运用
    MySQL慢查询优化、日志收集定位排查、慢查询sql分析
  • 原文地址:https://blog.csdn.net/m0_51411338/article/details/126060293