【Redis基础指南】推荐给大家的「主从模式」+「缓存穿透」的学习小贴士(提炼优化)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【Redis基础指南】推荐给大家的「主从模式」+「缓存穿透」的学习小贴士(提炼优化)

Redis缓存穿透


redis缓存穿透:前提-访问redis中不存在的key时,会查询数据库;当大量请求同时查询一个redis中不存在的key时,就会查询数据库,导致在那个时刻超出数据库的负载能力,严重的导致宕机,这个时候缓存其实就失效了。


图解image.png



Redis缓存穿透解决方案


布隆过滤器


布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。



原理


当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。




Redis缓存雪崩与预防


当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力,造成数据库后端故障,从而引起应用服务器雪崩。



预防方案


  1. 避免缓存集中失效,不同的key设置不同的超时时间
  2. 增加互斥锁,控制数据库请求,重建缓存。
  3. 提高缓存的HA,如:redis集群。




Redis的主从模式


概念图解


主从模式是redis常用的集群部署方式,通常都是一主二从。 一主二从:

image.png

一主多从

image.png

image.png


主从的原理:在redis从节点上线后,会发送ping命令给主节点,这时候主节点会通过网络传输的方式将当前内存RDB文件发送到从节点所在的服务器上,从节点下载RDB文件,然后从自己硬盘上的RDB文件进行恢复数据,在恢复数据的过程中,如果主节点有数据写入,主节点会将写命令放在缓冲区,在从节点完成数据恢复后,主节点会将缓冲区中的数据发送给从节点,这样就保证了主从节点的数据一致性。 由于主节点只负责写命令,而从节点负责读命令,所以永远只会读到从节点的数据。




配置操作


  1. 查看下当前redis节点的replication信息 redis-cli上输入info replication命令,下图可见当前redis节点的role是一个master,同时连在上面的从节点有一个。 主节点repliaction信息:


image.png


下图是从节点的一些信息,可以看出来当前redis节点的role是一个slave,同时master主节点的连接状态是up。 从节点replication信息:image.png



上面是redis搭建好以后的信息,下面是搭建redis主从模式的步骤

  1. 修改从节点redis的redis.conf文件 搜索:replication,找到下图的位置。


image.png


添加上图的两行,分别代表主节点的ip/port 和 主节点的连接密码,配置完成后,当前从节点会自动像主节点进行注册连接。 一般而言,slave节点只允许读操作,不允许写操作,写操作只能从master节点,所以需要关闭slave节点的写操作权限(一般默认是关闭)。如下图:


image.png


配置完后重启slave节点redis,就成功了!!



Redis无磁盘化复制数据(功能在试验阶段)


一般而言,rerdis主从模式,slave节点同步master节点的数据是master节点通过网络把RDB文件传输到slave节点的硬盘上,然后slave节点再同步硬盘上的RDB文件。 由于数据的复制通过硬盘的IO操作了,可能由于硬盘只是普通的机械硬盘,速度相对而言会慢,所以redis又提供一种无磁盘化的复制方法,将RDB文件通过发送到slave节点socket上,不经过磁盘的持久化。


原理master节点会创建一个子进程,在等待一定时间后(目的是等待slave节点连接上来)将RDB文件发送到slave节点的socket上。所以,redis配置文件中有两个配置项,一个是打开无磁盘化复制数据的功能开关,一个是配置发送等待时间的,如下图:


image.png

等待时长:单位是s


image.png



Redis 哨兵机制与实现


哨兵机制的作用


哨兵是一个独立的进程,用于监听redis集群中redis的存活状态,是redis高可用的解决方案。一个哨兵可以监控多个master节点以及下面的slave节点,当master节点宕机后,所有的哨兵会通过选举机制,先选举出一个哨兵leader,有哨兵leader做故障转移,选举出一个新的master节点,保证集群的高可用性



哨兵机制的特性


  • 选举机制:当一定数量(这个数量可配置)的哨兵认为master节点宕机后,哨兵集群就会选出一个哨兵leader,leader就会从剩余的slave节点中选举出一个新的master
  • 当老的master节点恢复后,它会变成slave节点



配置哨兵


配置哨兵的数量一般会是奇数个,这样选举机制就是属于少数服从多数的策略 修改redis文件中的sentinel.conf文件

# 允许非哨兵进程所在本机访问哨兵
protected-mode no
# 哨兵进程占用的端口
port 26379
# 哨兵进程是否后台运行
daemonize yes
# 哨兵进程pid文件---存哨兵进程的进程id,默认就行,不用管它
pidfile /var/run/redis-sentinel.pid
# 哨兵日志文件地址
logfile /usr/local/redis/log/sentinel.log
# 哨兵进程工作空间
dir /usr/local/redis-config/sentinel-working
#哨兵监控的master节点信息 mymaster--master节点name(随便配)后面是ip+port,最后的数字代表当master宕机后,多少哨兵认为master宕机了,哨兵集群才统一认为master宕机
sentinel monitor <mymaster> <127.0.0.1> <6379> <2>
# master节点name和密码
sentinel auth-pass <mymaster> <password>
# 哨兵多久连不上master节点,认为节点宕机,默认30s
sentinel down-after-milliseconds <mymaster> 30000
# 选举出新master后,剩余slave节点同步master节点数据的并行度,1代表剩余slave节点一台一台同步数据
sentinel parallel-syncs <mymaster> <1>
# 哨兵故障转移执行等待时间,默认3分钟,防止哨兵在故障转移时宕机,出现没有进行转移的问题
sentinel failover-timeout <mymaster> <180000>
复制代码

上面是实现哨兵需要配置一些配置项。配置完成后记得将sentinel的工作空间文件夹创建下,不然启动哨兵会报错。


启动哨兵命令:


redis-sentinel <配置文件全路径> tail -f <哨兵log全路径>---查看哨兵日志

测试:停掉master节点,查看哨兵日志




哨兵相关FAQ


master节点恢复成slave后,不同步新master的数据,master_link_status:down


1.原master节点redis.conf文件中未设置masterauth,导致master成为slave节点后,连不上新master节点


一般master数据无法同步给slave的方案检查为如下: 网络通信问题,要保证互相ping通,内网互通。 关闭防火墙,对应的端口开发(虚拟机中建议永久关闭防火墙,云服务器的话需要保证内网互通)。 统一所有的密码,master节点和slave节点密码一样,不要漏了某个节点没有设置。




部署约定


  • 哨兵节点至少是3个或者奇数个
  • 哨兵分布式部署在不同的计算机节点
  • 一组哨兵只监听一组主从

















相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 缓存 监控
缓存击穿、缓存穿透、缓存雪崩 3大问题,如何彻底解决?
【10月更文挑战第8天】在分布式系统中,缓存的使用极大地提高了系统的性能和响应速度。然而,缓存击穿、缓存穿透和缓存雪崩是三个常见的缓存相关问题,它们可能导致系统性能下降,甚至引发系统崩溃。本文将深入探讨这三个问题的成因、影响以及彻底的解决方案。
69 1
|
4天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
13天前
|
缓存 监控 测试技术
如何利用浏览器的缓存来优化网站性能?
【10月更文挑战第23天】通过以上多种方法合理利用浏览器缓存,可以显著提高网站的性能,减少网络请求,加快资源加载速度,提升用户的访问体验。同时,要根据网站的具体情况和资源的特点,不断优化和调整缓存策略,以适应不断变化的业务需求和用户访问模式。
55 7
|
17天前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
51 10
|
19天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万级数据统计优化实践
【10月更文挑战第21天】 在处理大规模数据集时,传统的单体数据库解决方案往往力不从心。MySQL和Redis的组合提供了一种高效的解决方案,通过将数据库操作与高速缓存相结合,可以显著提升数据处理的性能。本文将分享一次实际的优化案例,探讨如何利用MySQL和Redis共同实现百万级数据统计的优化。
51 9
|
17天前
|
缓存 监控 NoSQL
Redis 缓存穿透的检测方法与分析
【10月更文挑战第23天】通过以上对 Redis 缓存穿透检测方法的深入探讨,我们对如何及时发现和处理这一问题有了更全面的认识。在实际应用中,我们需要综合运用多种检测手段,并结合业务场景和实际情况进行分析,以确保能够准确、及时地检测到缓存穿透现象,并采取有效的措施加以解决。同时,要不断优化和改进检测方法,提高检测的准确性和效率,为系统的稳定运行提供有力保障。
46 5
|
17天前
|
缓存 监控 NoSQL
Redis 缓存穿透及其应对策略
【10月更文挑战第23天】通过以上对 Redis 缓存穿透的详细阐述,我们对这一问题有了更深入的理解。在实际应用中,我们需要根据具体情况综合运用多种方法来解决缓存穿透问题,以保障系统的稳定运行和高效性能。同时,要不断关注技术的发展和变化,及时调整策略,以应对不断出现的新挑战。
39 4
|
19天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:优化百万数据查询的实战经验
【10月更文挑战第13天】 在处理大规模数据集时,传统的关系型数据库如MySQL可能会遇到性能瓶颈。为了提升数据处理的效率,我们可以结合使用MySQL和Redis,利用两者的优势来优化数据查询。本文将分享一次实战经验,探讨如何通过MySQL与Redis的协同工作来优化百万级数据统计。
45 5
|
27天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万数据量的优化实录
【10月更文挑战第6天】 在现代互联网应用中,随着用户量的增加和业务逻辑的复杂化,数据量级迅速增长,这对后端数据库系统提出了严峻的挑战。尤其是当数据量达到百万级别时,传统的数据库解决方案往往会遇到性能瓶颈。本文将分享一次使用MySQL与Redis协同优化大规模数据统计的实战经验。
105 3
|
5天前
|
消息中间件 NoSQL Redis
【赵渝强老师】Redis消息的生产者消费者模式
消息队列在Redis中可通过List数据结构实现,支持发布者订阅者和生产者消费者两种模式。生产者通过`lpush`向List添加消息,消费者通过`rpop`或`brpop`消费消息,后者支持阻塞等待。示例代码展示了如何使用Redis的生产者消费者模式。