当前位置: 首页 > 后端技术 > Java

【Redis基础】推荐给大家的“主从模式”+“缓存穿透”技巧

时间:2023-04-01 19:21:09 Java

Redis缓存穿透redis缓存穿透:前提——访问redis不存在的key时,会查询数据库;当大量请求同时查询一个redis中不存在的key时,会查询数据库,会超过当时数据库的负载能力,严重的会造成宕机。这时候缓存实际上会失效。图:Redis缓存穿透方案布隆过滤器布隆过滤器(英文:BloomFilter)是由布卢姆在1970年提出的,它实际上是一个长二进制向量和一系列随机映射函数。布隆过滤器可用于检索元素是否在集合中。其优点是空间效率和查询时间远超一般算法,缺点是存在一定的误识别率和删除难度。原理当一个元素加入到集合中时,通过K个哈希函数将该元素映射到位数组中的K个点,并将它们置为1,检索时只需要看这些点是否都为1即可知道(approximately)是否在集合中:如果这些点中有任何一个为0,则被检查的元素一定不存在;如果都为1,则被检查的元素可能在。这就是Bloomfilter的基本思想。Redis缓存雪崩及预防当缓存服务器重启或一定时间内大量缓存失效时,失效时也会对后端系统(如DB)造成很大的压力,导致后端的数据库故障,导致应用服务器雪崩。预防方案避免了缓存的集中失效。为不同的键设置不同的超时时间,以增加互斥锁、控制数据库请求和重建缓存。提高缓存HA,如:redis集群。multiple-Get查询优化的底层是redis的mget命令,可以用来根据keyset进行查询。Redis客户端使用套接字与Redis服务器通信。get命令会检查一个key建立连接,检查完后关闭,而mget命令会检查一批连接。Pipeline批量查询Pipeline允许客户端一次发送多条命令,而无需等待上一条命令执行的结果。不仅减少了RTT,还减少了IO调用的次数(IO调用涉及到用户态和内核态的切换)。Redis主从模式概念图。主从模式是redis常见的集群部署方式,通常是一个主从。一主两从:一主多从原理:redis从节点上线后,会向主节点发送ping命令。此时主节点会将当前内存RDB文件通过网络传输发送给从节点。在服务器上,从节点下载RDB文件,然后从自己硬盘上的RDB文件中恢复数据。在数据恢复过程中,如果主节点有数据写入,主节点会将写命令放入缓冲区,从节点数据恢复完成后,主节点会将缓冲区中的数据发送给从节点节点,从而保证主从节点的数据一致性。由于主节点只负责写命令,从节点负责读命令,所以永远只会读取从节点的数据。配置操作查看当前redis节点的复制信息。在redis-cli中输入inforeplication命令。下图显示当前redis节点的角色是master,有一个slave节点与之相连。主节点复制信息:2.下图显示了从节点的一些信息。可以看出当前redis节点的角色是slave,master主节点的连接状态为up。从节点复制信息:以上是redis搭建完成后的信息,下面是搭建redis主从模式的步骤2.修改从节点redis的redis.conf文件搜索:replication,找到位置在下图。3、添加上图中的两行,分别代表主节点的ip/端口和主节点的连接密码。配置完成后,当前从节点会像主节点一样自动注册连接。一般来说,slave节点只允许读操作,不允许写操作,写操作只能从master节点进行,所以需要关闭slave节点的写操作权限(一般默认是关闭的).如下图所示:配置完成后,重启slave节点redis,即可成功!!Redis无盘复制数据一般来说,rerdis主从模式,从节点同步主节点的数据就是主节点通过网络将RDB文件传输到从节点的硬盘上,然后从节点同步硬盘上的RDB文件。由于数据复制是通过硬盘的IO操作进行的,由于硬盘只是一个普通的机械硬盘,所以速度可能会比较慢,所以redis也提供了无盘复制的方式,将RDB文件发送到socket从节点,没有磁盘持久性。原理主节点会创建一个子进程,等待一定时间后(目的是等待从节点连接),将RDB文件发送到从节点的socket。所以redis的配置文件中有两个配置项,一个是开启无盘复制数据的功能开关,另一个是配置发送等待时间,如下图:等待时间:单位是sRedis哨兵机制以及实现哨兵机制的功能是一个独立的进程,用于监控redis在redis集群中的生存状态,是redis的高可用解决方案。一个哨兵可以监控多个主节点和后面的从节点。当master节点宕机时,所有sentinel首先会通过选举机制选举出一个sentinelleader,由sentinelleader进行failover,选举出新的master节点,保证集群的高可用。sentinel机制的特点选举机制:当一定数量(这个数量是可配置的)的sentinel认为master节点宕机时,sentinel集群会选举出一个sentinelleader,leader会从剩余的slave节点中进行选择。选举新的主人。当旧的主节点恢复时,它将成为从节点。配置哨兵。配置的哨兵数量一般会是奇数,所以选举机制是一种属于少数服从多数的策略。修改redis文件中的sentinel.conf#允许非哨兵进程访问哨兵protected-modeno#哨兵进程占用的端口port26379#哨兵进程是否后台运行daemonizeyes#哨兵进程pid文件---保存sentinel进程的进程id,默认即可,不需要忽略即可pidfile/var/run/redis-sentinel.pid#sentinel日志文件地址log#sentinelprocessworkspacedir/usr/local/redis-config/sentinel-working#sentinel监控的master节点信息mymaster--master节点名(可选)后面是ip+port,最后一个数字代表什么时候master挂了,有多少sentinel认为master挂了,sentinel集群认为master挂了sentinelmonitor<127.0.0.1><6379><2>#master节点名和密码sentinelauth-pass#sentinel多长时间无法连接到master节点,该节点被认为down了,默认是30ssentineldown-after-milliseconds30000#选举出新的master后,剩下的从节点同步主节点的数据并行度,1代表剩余slave-nodes同步数据sentinelparallel-syncsonebymymaster<1>#Sentinelfailover执行等待时间,默认3分钟,防止sentinel在failover时宕机,sentinelfailover-timeout<180000>以上是实现Sentinel需要配置一些配置项配置完成后记得创建Sentinel的工作空间文件夹,否则启动Sentinel会报错。启动Sentinel命令:redis-sentinel<配置文件全路径>tail-f---查看Sentinel日志测试:停止master节点,查看Sentinel日志Sentinel相关FAQmaster节点恢复后slave,不同步新的Master数据,master_link_status:down原master节点的redis.conf文件中没有设置masterauth,导致master变成slave节点,无法连接到新的master节点。一般情况下,master的数据是无法同步到slave的。确保它们可以互相ping通,并且可以在内网互通。关闭防火墙并开发相应的端口(建议在虚拟机中永久关闭防火墙,云服务器需要保证内网互通)。统一所有密码,主节点和从节点密码相同,别忘了某个节点没有设置。部署约定哨兵节点至少3个或奇数个哨兵分布部署在不同的计算机节点上。一组哨兵只监视一组主从。本文由多帖博客平台OpenWrite发布!