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 <masterip> <masterport>
# 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 <master-password>

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

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 <arg> --cluster-yes
  • 在 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数据导入导出


在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

终将站在顶峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值