跳至主要內容
Redis - 11 高可用5 (集群)

Redis 高可用 - 集群

主要内容:

  • 为什么需要Redis Cluster?
  • 客户端是怎样知道该访问哪个分片的? (哈希槽)
  • redis实例上并没有相应的数据,会怎么样?(MOVED重定向和ASK重定向)
  • 各个节点之间是怎么通信的呢(Gossip协议)
  • 集群内节点出现故障怎么办(故障转移)
  • Redis Cluster的Hash Slot 为什么是16384?

Redis Cluster

哨兵模式基于主从模式,实现读写分离,它还可以自动切换,系统可用性更高。但是它每个节点存储的数据是一样的,浪费内存,并且不好在线扩容


code中间件Redis大约 7 分钟
Redis - 12 缓存

Redis 缓存

用户的数据一般都是存储于数据库,数据库的数据是落在磁盘上的,磁盘的读写速度可以说是计算机里最慢的硬件了

当用户的请求,都访问数据库的话,请求数量一上来,数据库很容易就崩溃的了,所以为了避免用户直接访问数据库,会用 Redis 作为缓存层

因为 Redis 是内存数据库,我们可以将数据库的数据缓存在 Redis 里,相当于数据缓存在内存,内存的读写速度比硬盘快好几个数量级,这样大大提高了系统性能

引入了缓存层,就会有缓存异常的三个问题,分别是缓存雪崩、缓存击穿、缓存穿透

缓存雪崩 (好多key同一时间都失效)


code中间件Redis大约 13 分钟
Redis - 13 缓存2

Redis 缓存2

给服务器加上 Redis,让其作为数据库的缓存

这样,在客户端请求数据时,如果能在缓存中命中数据,那就查询缓存,不用在去查询数据库,从而减轻数据库的压力,提高服务器的性能

由于引入了缓存,那么在数据更新时,不仅要更新数据库,而且要更新缓存,这两个更新操作存在前后的问题:

  • 先更新数据库,再更新缓存;
  • 先更新缓存,再更新数据库;

数据库与缓存一致性问题

不好的方案

先写 MySQL,再写 Redis

请求 A、B 都是先写 MySQL,然后再写 Redis,在高并发情况下,如果请求 A 在写 Redis 时卡了一会,请求 B 已经依次完成数据的更新


code中间件Redis大约 4 分钟
Redis - 14 过期淘汰与内存删除策略

过期删除策略和内存淘汰策略区别

alt text

过期删除策略

Redis 是可以对 key 设置过期时间的,因此需要有相应的机制将已过期的键值对删除,而做这个工作的就是过期键值删除策略

如何设置过期时间

设置 key 过期时间的命令一共有 4 个:

  • expire <key> <n>:设置 key 在 n 秒后过期,比如 expire key 100 表示设置 key 在 100 秒后过期;
  • pexpire <key> <n>:设置 key 在 n 毫秒后过期,比如 pexpire key2 100000 表示设置 key2 在 100000 毫秒(100 秒)后过期。
  • expireat <key> <n>:设置 key 在某个时间戳(精确到秒)之后过期,比如 expireat key3 1655654400 表示 key3 在时间戳 1655654400 后过期(精确到秒);
  • pexpireat <key> <n>:设置 key 在某个时间戳(精确到毫秒)之后过期,比如 pexpireat key4 1655654400000 表示 key4 在时间戳 1655654400000 后过期(精确到毫秒)

code中间件Redis大约 14 分钟
Redis - 15 场景分析

Redis 简介

Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景

Redis 和 Memcached 区别

Redis 与 Memcached 共同点:

  • 都是基于内存的数据库,一般都用来当做缓存使用。
  • 都有过期策略。
  • 两者的性能都非常高。

Redis 与 Memcached 区别:(数据类型、持久化、集群管理、其他功能)


code中间件Redis大约 23 分钟
Redis - 10 高可用4 (哨兵)

Redis 高可用 - 哨兵机制

在 Redis 的主从架构中,由于主从模式是读写分离的,如果主节点(master)挂了,那么将没有主节点来服务客户端的写操作请求,也没有主节点给从节点(slave)进行数据同步了

这时如果要恢复服务的话,需要人工介入,选择一个「从节点」切换为「主节点」,然后让其他从节点指向新的主节点,同时还需要通知上游那些连接 Redis 主节点的客户端,将其配置中的主节点 IP 地址更新为「新主节点」的 IP 地址

但这样太麻烦了,并且不智能,如果有一个节点能监控「主节点」的状态,当发现主节点挂了,它自动将一个「从节点」切换为「主节点」的,就可以了


code中间件Redis大约 15 分钟
Redis - 5 持久化1

Redis 持久化

Redis 持久化主要有两种,RDB 和 AOF

  • RDB 通过创建时间点快照来实现持久化
  • AOF 通过记录每个写操作命令来实现持久化

这两种方式可以单独使用,也可以同时使用

这样就可以保证 Redis 服务器在重启后不丢失数据,通过 RDB 和 AOF 文件来恢复内存中原有的数据

alt text

AOF

AOF 日志

如果 Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候,先去读取这个文件里的命令,并且执行它,这不就相当于恢复了缓存数据了


code中间件Redis大约 14 分钟
Redis - 6 持久化2

Redis 持久化

Redis 持久化主要有两种,RDB 和 AOF

  • RDB 通过创建时间点快照来实现持久化
  • AOF 通过记录每个写操作命令来实现持久化

这两种方式可以单独使用,也可以同时使用

这样就可以保证 Redis 服务器在重启后不丢失数据,通过 RDB 和 AOF 文件来恢复内存中原有的数据

  • AOF 文件的内容是操作命令;
  • RDB 文件的内容是二进制数据

RDB快照

RDB 快照就是记录某一个瞬间的内存数据,记录的是实际数据,而 AOF 文件记录的是命令操作的日志,而不是实际的数据。


code中间件Redis大约 8 分钟
Redis - 7 持久化3 (大key)

Redis 持久化

Redis 持久化主要有两种,RDB 和 AOF

  • RDB 通过创建时间点快照来实现持久化
  • AOF 通过记录每个写操作命令来实现持久化

这两种方式可以单独使用,也可以同时使用

这样就可以保证 Redis 服务器在重启后不丢失数据,通过 RDB 和 AOF 文件来恢复内存中原有的数据

  • AOF 文件的内容是操作命令;
  • RDB 文件的内容是二进制数据

大 Key 对 AOF 日志的影响

Redis 提供了 3 种 AOF 日志写回硬盘的策略,分别是:


code中间件Redis大约 7 分钟
Redis - 8 高可用1

Redis 高可用

由于数据都是存储在一台服务器上,如果出事就完犊子了,比如:

  • 如果服务器发生了宕机,由于数据恢复是需要点时间,那么这个期间是无法服务新的请求的;
  • 如果这台服务器的硬盘出现了故障,可能数据就都丢失了。

要避免这种单点故障,最好的办法是将数据备份到其他服务器上,让这些服务器也可以对外提供服务,这样即使有一台服务器出现了故障,其他服务器依然可以继续提供服务

alt text

多台服务器要保存同一份数据,这些服务器之间的数据如何保持一致性呢?数据的读写操作是否每台服务器都可以处理?


code中间件Redis大约 11 分钟