<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,在 从机选举中产生新的主机。
新主登基,旧主称臣
集群操作:
详见我的资源下载区