1、 Redis作为缓存服务器
Redis作为缓存服务器是许多企业的选择之一。虽然技术非常成熟,但也存在一些问题。它指的是缓存渗透、缓存崩溃和缓存失效的问题,然后是分布式锁。
1.1缓存渗透
在今天的项目中,大多数采用垂直MVC架构。服务层调用DAO层,然后DAO层查询数据库。Redis作为缓存服务器,在服务层调用DAO层进行查询时首先查询缓存服务器。如果存在,则直接返回数据。否则,它将查询数据库。从中可以看出,这样做大大减少了磁盘I/O操作,并减轻了数据库的压力。
现在让我们假设数据库中有ID从1到1000的数据。现在,如果有人手动模拟ID为1001的请求,则缓存服务器中不存在数据,因此他们将查询数据库。那就有问题了。如果查询数据库有大量无效请求。这势必会对数据库造成难以承受的压力,这就是所谓的缓存渗透。
如何解决?
1.将查询的空值直接保存到缓存服务器,但不建议这样做,因为大量不同的请求ID也会查询数据库。
2.接口限流、降级和熔断
在项目中,您必须限制重要接口的流量。对于上述恶意攻击请求,您不仅必须限制流量,还必须做好降级和融合的准备。这可以有效地控制大量无效请求。
3.布隆过滤器
Bloomfilter类似于哈希集,用于快速确定集合中是否存在元素。它的典型应用场景是快速确定容器中是否存在密钥,如果不存在则直接返回。Blum过滤器的关键是大多数企业选择的哈希算法和容器大小。
1.2缓存故障
在高并发中,查询一些热点的值,但此时缓存刚刚过期,缓存丢失,导致大量请求直接落在数据库上。此时,如此大量的请求可能会导致数据库崩溃。
解决方案:
1.将热点密钥设置为永不过期。
2.使用互斥锁。
以上两种情况都属于缓存失效,但有一些小细节。也就是说,多个缓存同时失败,特别是在高并发期。为了避免多次缓存失败的问题,我们可以在设置超时时使用固定时间+随机时间。避免在缓存无法工作时大量查询数据库的请求。
1.3分布式锁
通常,分布式锁可以通过三种方式实现:1.乐观数据库锁;2.基于ZooKeeper的分布式锁;3.基于Redis的分布式锁;这里只记录了基于Redis的分布式锁。
分布式锁的要求:
互斥:确保在分布式应用程序集群中,同一锁只能由一台计算机上的一个线程同时执行。避免死锁:当客户端在持有锁而未解锁时崩溃时,它还可以确保其他客户端可以锁定。首先请参见以下代码:
公共列表<;商品>;GoodsManager(){System.out.println(“已调用业务层的GoodsManager方法”);return goodsDao.queryAllPage();//1.首先查询缓存服务器List<;Goods>;goodsList=(List<redisTemplate。opsForValue()。获取(“货物”);if(goodsList==null){//2.应用分布式锁RedisConnection conn=redisTemplate.getConnectionFactory().get-Connection();if(conn.setNX(“lock”.getBytes()),“1”.getBytes()){//3.为分布式锁设置超时conn.expire(“lock“.getByte(),60);System.out.println(“查询数据库中的所有商品”);//4。缓存中没有商品列表的数据goodsList=goodsDao。queryAllPage()//5.将结果放入缓存redisTemplate中。opsForValue()。set(“货物”,goodsList);redisTemplate。快递(“货物”,5,TimeUnit.MI NUTES);//6.释放分布式锁conn.dl(“lock”.getBytes());}否则{try{Thread.sleep(50);goodsManager();}catch(InterruptedException e){e.printStackTrace();}}return goodsList;}else{//缓存服务器中商品列表的数据返回goodsList;}}
代码设计思路:
1.请求调用方法。
2.进入Redis缓存,查询是否存在。如果没有,请查询数据库。
3.使用本机连接(setNX)获取分布式锁,然后设置超时。
设置超时时间的原因是,如果t
###2.1 Redis提供了两种持久化方法:RDB:它是备份时Redis内存中的数据结构(我们称之为快照)。AOF:用于在Redis执行写入命令后,在一定条件下将执行的写入命令依次保存在Redis文件中,然后依次执行这些保存的命令以回复Redis数据。
2.2 RDB原理分析
RDB持久性有两种操作模式:持久性的手动操作。
save:在持久化完成之前,当前的Redis服务器将被阻止。应禁止在线使用。Bgsave:此触发器方法派生一个子进程,该子进程负责持久化进程。因此,阻塞仅在分叉子进程时发生。bgsave和save的最大区别是,bgsave不会阻止客户端的写入操作。然而,如果bgsave失败,Redis将默认停止接受访问操作,否则没有人会注意到灾难。如果你不想这样做,你可以
停止写入bgsave错误yes设置为no
另一种是自动触发持久性。首先,我们可以在配置文件中配置快照规则。
保存900 1在900秒内执行写入命令并使用快照备份
保存300 10在300秒内执行10个写入命令并使用快照备份
保存60 10000在60秒内执行10000个写入命令并使用快照备份
注意:当Redis执行备份命令时,禁止写入该命令
2.3 AOF原理分析
一般来说,AOF的整个过程可以分为两个步骤:一个是命令的实时写入,另一个是重写AOF文件以减小AOF文件的大小。
附加AOF文件的一般过程是:命令写入–>;附加到aof_Buf(缓冲区)–>;同步到aof磁盘。为什么要先写入buf缓冲区,然后将其同步到磁盘?因为实时写入会带来大量的磁盘I/O操作,这将大大降低系统性能。
有几种关于AOF持久性的配置。
appendonly no是否启用AOF备份。默认值为no,并且未启用。如果需要启用,则更改为yes。Appendfilename“appendonly.aof”定义了append命令编写的文件是appendonly aof#appendfsync始终意味着执行的每个Redis命令都将同步保存到aof文件中。性能会受到影响,但安全性很高。Appendfsync everysec evarysec(默认值)表示每秒执行一次同步,性能将得到提高,但安全性将降低,一秒钟内的命令可能会丢失#Appendfsync no表示同步未同步。同步命令需要手动执行。性能有保证,但安全性差。2.4 Redis内存回收策略
在Redis中,conf中的配置项maxmemory策略用于配置Redis的内存回收策略以及当内存达到最大值时的内存处理方法。
Redis提供六种内存消除策略
易失性lru:allkeys-lru:Volatile random:allkeys random:avolatile ttl:noevication(默认):
在内存回收机制中,LRU算法和TTl算法在Redis中都不是精确的计算,而是近似算法。默认情况下,Redis配置了探测最大内存样本数,默认值为3。
3、 Redis高度可用
3.1、主从复制
当用户数量非常大时,单个Redis肯定是不够的。因此,我们更喜欢读/写分离。读/写分离的前提是读操作比写操作更频繁。将数据长期放置在多个服务器上可以消除单个服务器上的压力。
因此,服务器设置如下图所示:
假设一台服务器负责写操作,其他三台服务器负责读操作,以实现单独的写缓存功能。然而,存在一个明显的缺点,即读取数据的其他三个服务器之间的数据无法同步。这将导致数据不一致。此时,有必要在它们之间进行数据交换。
简要介绍主从复制的概念。如上图所示,主机负责写入数据,其他三台从机负责读取数据。当写入数据时,更新的数据将根据配置的属性自动复制到其他三个服务器,从而实现服务器之间的数据一致性
哨兵是一个独立的过程。Sentinel将检测多个Redis服务器,包括主服务器和从服务器。发送命令以使Redis服务器响应并检查其运行状态。当哨兵检测到主机停机时,它会自动将从机切换到主机,然后通知其他从机修改配置文件并通过发布订阅模式切换主机。为了实现哨兵的高可用性,可以将其配置为多哨兵模式,即多个哨兵进程在不同的服务器上运行,以检测各种Redis服务器,并且哨兵也会相互监视。在多哨兵模式下,一旦主设备关闭,哨兵1在检测到该结果时不会立即故障切换,但只有哨兵1的主管认为主设备不可用。当其他哨兵也检测到主人不可用,并且有一定数量的哨兵时,将在哨兵之间进行投票。投票结果由哨兵发起,将执行切换操作。切换完成后,每个哨兵将能够通过发布和订阅来切换他们监视的服务器的主机。3.哨兵模式配置
3.1,#配置哨兵配置文件:
redis/src/ssentinel.conf
3.2,#禁用保护模式
保护模式否
3.3,#配置主监控服务。最后2个表示当两个或多个哨兵认为主服务不可用时将执行故障切换
Sentinel监控服务器名称(用户定义)主服务IP端口2
3.4,#定义服务密码
Sentinel auth pass服务器名称(同上)密码
3.5,#启动哨兵模式;
./redis sentinel sentinel.conf
4.其他相关配置
毫秒后哨兵关闭:当哨兵检测到Redis服务时,当Redis服务在一毫秒内无法应答时,单个哨兵考虑的主观离线时间默认为30秒。
Sentinel故障切换超时:指定故障切换运行的毫秒数。当该数字超过此数字时,故障切换将被视为失败。默认值为3分钟。
哨兵通知脚本:指定哨兵检测到Redis实例异常时要调用的警报脚本。
3.3.碎片集群
分片集群的原理是多个缓存服务器两两通信,每个副本集有一个主实例和多个从实例。此外,每个副本集在数据库中存储一部分键值对,这解决了主从副本集中总数据存储的最小实例的限制,并大大扩展了缓存服务器的大小。
结构图如下:
1.碎片集群的特点
1.客户端直接连接到Redis节点,不需要中间代理层。
2.Redis集群将所有物理节点映射到[0-136383]插槽,由集群负责维护。
3.所有Redis节点彼此互连(PING-ONG机制),内部使用Gossip二进制协议优化数据传输。
4.当集群中超过一半的节点发生故障时,节点故障检测生效。
==问题:Redis集群中内置了16384个哈希槽。Redis集群如何决定将密钥放入哪个插槽==
当一个键值被放置在redis集群中时,redis首先使用crc16算法来计算该键的结果,然后将结果的剩余部分计算为16384。这样,每个键将对应于一个编号为0-16383的哈希槽。redis将根据节点的数量大致相等地将哈希槽映射到不同的节点。
2.集群建设步骤
前提条件:
删除appendonly。aof,转储。Redis/src下的rdb、nodes-6379.conf文件。
1.修改redis。conf,配置集群信息,并启用集群,
Cluster enabled yes指定群集的配置文件,
群集配置文件节点port.conf
2.使用redis trib。rb来构建集群。因为redis trib。rb是一个用Ruby实现的Redis集群管理工具,我们需要先安装Ruby环境
2.1.安装Ruby
yum-y安装zlib-ruby-rubygems
2.2安装Rubygems的Redis依赖项
gem安装-l redis-3.3.0.gem
3.安装依赖环境后,我们可以使用script命令
注意:此脚本文件位于解压缩目录src中。
执行命令:
./redis三角形。Rb创建–副本0 192.168.10.167:6379 192.168.10.167:3380 192.168.10.167:8381打开16379 Redis端口+1W
1. 转载请保留原文链接谢谢!
2. 本站所有资源文章出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。
3. 本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户擦亮眼睛自行鉴别,做一个有主见和判断力的用户。
4. 本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。
5. 您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
6. 联系方式:
7. 重点提示:不要轻信文件或者视频里的任何加微信或者二次收费的信息!!!
暂无评论内容