redis缓存和集群
1.缓存穿透
缓存穿透 是指查询一个数据库一定不存在的数据。
我们以前正常的使用Redis缓存的流程大致是:
第一次查询 先从jedis.get(setmealDetail{id}) ,如果 不存在 则查询数据库,获取后存入redis(setmealDetail{id})
如果套餐数据不存在,就不需要放入缓存
1、数据查询首先进行缓存查询 id=1setmealDetail_id = null
2、如果数据存在则直接返回缓存数据
3、如果数据不存在,就对数据库进行查询,并把查询到的数据放进缓存 1 null
4、如果数据库查询数据为空,则不放进缓存
例如我们的数据表中主键是自增产生的,所有的主键值都大于0。此时如果用户传入的参数为-1,会是怎么样?这个-1,就是一定不存在的对象。程序就会每次都去查询数据库,而每次查询都是空,每次又都不会进行缓存。假如有人恶意攻击,就可以利用这个漏洞,对数据库造成压力,甚至压垮我们的数据库。
解决方案: 为了防止有人利用这个漏洞恶意攻击我们的数据库,我们可以采取如下措施:
如果从数据库查询的对象为空,也放入缓存,key为用户提交过来的主键值,value为null,只是设定的缓存过期时间较短,比如设置为60秒。这样下次用户再根据这个key查询redis缓存就可以查询到值了(当然值为null),从而保护我们的数据库免遭攻击。到期就消失为了以后有真的有数据也要返回真实数据
如果id有序,存入null值时,可以存入id 的最大值(有数据),查询时判断查询id的范围是否大于最大值,直接返回null
【小结】
缓存穿透现象(查询不存在的数据),及解决方案 存null, 设置较短的过期失效时间, 对有序的数据,设置null值的范围, 使用布隆过滤器
2.缓存雪崩
现象描述: 缓存雪崩,是指在某一个时间段,缓存集中过期失效。在缓存集中失效的这个时间段对数据的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰。
解决方案: 为了避免缓存雪崩的发生,我们可以将缓存的数据设置不同的失效时间,这样就可以避免缓存数据在某个时间段集中失效。例如对于热门的数据(访问频率高的数据)可以缓存的时间长一些,对于冷门的数据可以缓存的时间短一些。甚至对于一些特别热门的数据可以设置永不过期(内存的开销)。还有其它第三方的缓存(Memory Cache, Jvm中的缓存: Spring Cache, Mybatis 二级缓存)
设置不同的失效时长 质数
延长有效期 expire key 时间
添加第三方缓存 重要的业务数据,高频访问的
【小结】
缓存雪崩现象(大量的缓存在同一时失效),及解决方案 设置不同的失效时间,延长有效时间,辅以第三方缓存
3.缓存击穿
现象描述:缓存击穿,是指一个key非常热点(例如双十一期间进行抢购的商品数据),在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求到数据库上,就像在一个屏障上凿开了一个洞。
解决方案:我们同样可以将这些热点数据设置永不过期就可以解决缓存击穿的问题了。或者阶段性的延长过期时间
【小结】
缓存击穿现象(高并发的key失效瞬间),及解决方案,延长过期时间甚至永久有效。 定时或人工删除
4.主从复制原理
5.sentinel架构
6.redis-cluster集群原理