使用Redis缓存的流程大致是:
- 数据查询首先进行缓存查询
- 如果数据存在直接返回缓存数据
- 如果数据不存在,就对数据库进行查询,并把查询到的数据放入缓存中
- 如果数据查询为空,不放入缓存
如:在数据表中主键是自增产生的,所以所有的主键都大于0,此时如果用户传入参数-1,在缓存中和数据库中都不会存这一条数据;程序就会每次都会查询数据库,但每一次查询的数据都是空,并且也不会进行缓存;如果有人利用这一点进行恶意攻击,就会对数据库造成压力,甚至压垮数据库
解决措施:如果从数据库查询的数据是空,也会放入缓存中,以查询的条件为key,value为null,只是设置缓存过期的时间比较短,比如:60s;这样用户如果进行频繁的进行这样同一个操作,走的就是缓存(查询的结果还是null),从而将数据库保护起来免遭攻击
缓存雪崩:指在某一时间段,缓存集中过期失效; 出现的问题当缓存集中失效后,这个时间段对数据的访问查询都落到了数据库上;这对于数据库而言,就会产生周期性的压力波峰
解决措施:避免缓存雪崩,可以将缓存的数据设置不同的失效时间,这样就可以避免缓存中的数据在某一时间集中失效;对于一些热门数据而言可以将缓存的时间设置的长一些;对于一些冷们数据就可以将它的缓存时间设置的短一些;甚至对于有一些特别热门的数据甚至可以设置为永不过期
缓存击穿:指一个key非常的热点(如双十一热们的商品数据),在不停的扛着大量的并发,者一些的并发都集中到了这一点上,当这一个key在失效的瞬间,持续大量的并发就直接的打到了数据库上,就想在屏幕上开了一个动 解决措施将这些热点数据设置为永不过期设置对这一个数据的并发达到一个什么量级,就将这一个key设置更长的时间



