Redis--★常见问题(持续更新)

本文探讨了缓存系统的三大问题——缓存穿透、缓存雪崩和缓存击穿,以及它们的解决方案。针对缓存穿透,提出设置空值缓存和不同过期时间的策略;为防止缓存雪崩,建议采用分层过期时间和集群高可用;缓存击穿的对策包括互斥锁和热key永不失效。此外,介绍了Redis的主从复制集群方案,通过主从分离减轻数据库压力,并讨论了哨兵模式以确保高可用性。
摘要由CSDN通过智能技术生成

<1 对数据库造成压力:

1 缓存穿透(请求直接穿过redis,查数据库,反复横跳—redis变为摆设)

缓存穿透是指查询一个数据库一定不存在的数据,每次请求都会直接把压力给数据库
我们以前正常的使用Redis缓存的流程大致是:
1、数据查询首先进行缓存查询
2、如果数据存在则直接返回缓存数据
3、如果数据不存在,就对数据库进行查询,并把查询到的数据放进缓存
4、如果数据库查询数据为空,则不放进缓存

例如我们的数据表中主键是自增产生的,所有的主键值都大于0。此时如果用户传入的参数为-1,会是怎么样?这个-1,就是一定不存在的对象。程序就会每次都去查询数据库,而每次查询都是空,每次又都不会进行缓存。假如有人恶意攻击,就可以利用这个漏洞,对数据库造成压力,甚至压垮我们的数据库。

为了防止有人利用这个漏洞恶意攻击我们的数据库,我们可以采取如下措施:

如果从数据库查询的对象为空,也放入缓存,key为用户提交过来的主键值,value为null,只是设定的缓存过期时间较短,比如设置为60秒。这样下次用户再根据这个key查询redis缓存就可以查询到值了(当然值为null),从而保护我们的数据库免遭攻击。

2.缓存雪崩(短时间大量请求压向数据库/redis主机挂了导致全盘崩溃)

缓存雪崩,是指在某一个时间段,缓存集中过期失效。在缓存集中失效的这个时间段对数据的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰

so,将失效时间分层设置,相当于缓冲
为了避免缓存雪崩的发生,我们可以将缓存的数据设置不同的失效时间,这样就可以避免缓存数据在某个时间段集中失效。例如对于热门的数据(访问频率高的数据)可以缓存的时间长一些,对于冷门的数据可以缓存的时间段一些。甚至对于一些特别热门的数据可以设置永不过期。

zy解决:
1.事前—redis集群高可用(主从+哨兵/cluster)
2.事中—hystrix/阿里sentinal限流降级+本地ehcache
3.事后—开启持久化机制,尽快恢复集群

3.缓存击穿(热点缓存失效瞬间,大量请求集中凿向数据库)

缓存击穿,是指一个key非常热点(例如双十一期间进行抢购的商品数据),在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求到数据库上,就像在一个屏障上凿开了一个洞。

解决缓存击穿:

1.互斥更新 随机退避 差异失效时间
2.热key永不失效
3.互斥锁独占锁防止击穿(给查询的操作加锁)

★★★真实案例:taobao聚划算功能+防止击穿实现

<2集群方案

1.主从复制:

原则:Master会将数据同步到slave,而slave不会将数据同步到master。Slave启动时会连接master来同步数据。
可以利用master来处理操作,slave提供操作。这样可以有效减少单个机器的并发访问数量。
主节点不用做任何修改,直接启动服务即可。从节点需要修改redis.conf配置文件,加入配置:slaveof 主节点ip地址 主节点端口号,例如master的ip地址为192.168.200.129,端口号为6379,那么slave只需要在redis.conf文件中配置slaveof 192.168.200.129 6379即可。

在这里插入图片描述

1.当从机连上主机后,从机向主机发送进行数据同步的消息;
2.主机收到消息,将数据持久化,把rdb文件发送至从机,从机拿到rdb进行读取
3.每次主机进行写操作后,和从机进行数据同步

2.薪火相传

上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力,去中心化降低风险。

用 slaveof
中途变更转向:会清除之前的数据,重新建立拷贝最新的
风险是一旦某个slave宕机,后面的slave都没法备份
主机挂了,从机还是从机,无法写数据了

3.反客为主

哨兵模式Sentinal(反客为主自动版)

当主机挂掉,根据优先级别slave-priority,在 从机选举中产生新的主机。

新主登基,旧主称臣

在这里插入图片描述

集群操作:

详见我的资源下载区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值