
高级Redis
Redis缓存相关问题
- 缓存穿透
- 缓存雪崩
- 缓存击穿
1.1缓存穿透
缓存穿透是指查询一个数据库一定不存在的数据
我们以前正常使用Redis缓存的流程大致是:
- 数据查询前先进行缓存查询
- 如果数据存在则直接返回缓存数据
- 如果数据不存在,就对数据库进行查询,并把查询到的数据放进缓存
- 如果数据库中查询数据为空,则不放进缓存
如果我们的数据库中的主键是自增产生,所有主键都大于0,此时如果用户传入的主键值都为-1,就是一定不存在的对象。程序每次都会去查询数据库,而每次查询数据库的结果都是空,每次又不会进行缓存。假如有人想利用此漏洞进行恶意攻击,很容易对数据库造成很大的压力甚至压垮数据库。
解决措施:如果从数据库查询的对象为空,也放入缓存,key为用户提交过来的主键,value为null,只是设定的缓存过期时间比较短,比如设置成60s,这样下次用户再根据这个key查询redis缓存就可以查到值为null,葱儿保护数据库。
缓存雪崩,是指在某一个时间段,缓存集中过期失效,在缓存集中失效的这个时间段对数据的访问查询,都跑到数据库里面去,对于数据而言,就会产生周期性的压力波峰。1.2缓存雪崩
为了避免缓存雪崩的发生,我们可以将缓存的数据设置成不同的失效时间,这样可以避免缓存数据在某个时间段集中失效。
例如对于热门的数据(访问的频率较高),可以缓存的时间可以长一点,对于冷门的数据缓存的时间就可以相应的短一点甚至对于一些很很热门的数据可以设置永不过期。
缓存击穿,是指一个key非常热点(例如双十一期间进行抢购的商品数据),在不停的扛着大并发,大并发集中对这个一个点进行访问,当这个key在失效的瞬间,持续的高并发穿破缓存,直接请求数据库,就像在屏障上凿开了一个洞。1.3缓存击穿
解决方法同样,设置热点数据永不过期就可以了
为了解决单台Redis服务性能不足的问题,需要使用Redis的集群。Redis有很多方案,下面分别进行讲解。Redis集群方案
redis支持主从复制:2.1主从复制Replicaiton
在主从复制的模式下,Redis节点分为两种角色:主节点(master)和从节点(slave)。这种模式集群是由一个主节点和多个从节点构成~
原则:Master数据会同步到slave,而Slave的数据不会同步到Master,Slave启动的时候会连接Master来同步数据,Master负责写数据,Slave负责读数据
这是一个典型的分布式读写分离模型,我们可以利用master处理写操作,slave处理读操作。这样可以有效的减少单个机器的并发访问数量。
要实现主从复制
的模式非常简单,主节点不用做任何修改,直接启动服务器即可。从节点需要修改redis.conf
文件,加入配置slaveof <主节点ip地址> <主节点端口号>
,例如:master的ip和端口为192.168.200.129,端口号为6379,那么在slave的redis.conf
配置文件中只需要加入slaveof 192.168.200.129 6379
即可
分别连接主节点和从节点,测试发现主节点的写操作,从节点立刻就能看到相同的数据。但是在从节点进行写操作,提示 READONLY You can't write against a read only slave 不能写数据到从节点。
现在我们就可以通过这种方式配置多个从节点进行读操作,主节点进行写操作,实现读写分离。
我们现在已经给Redis实现了主从复制,可将主节点数据同步给从节点,实现了读写分离,提高Redis的性能。但是现在还存在一个问题,就是在主从复制这种模式下只有一个主节点,一旦主节点宕机,就无法再进行写操作了。也就是说主从复制这种模式没有实现高可用。那么什么是高可用呢?如何实现高可用呢?2.2哨兵sentinel
高可用(HA)是分布式系统架构设计中必须考虑的因素之一,它是通过架构设计减少系统不能提供服务的时间。保证高可用通常遵循下面几点:2.2.1高可用介绍
- 单点是系统高可用的大敌,应该尽量在系统设计的过程中避免单点。
- 通过架构设计而保证系统高可用的,其核心准则是:冗余。
- 实现自动故障转移。