Redis知识

  • 什么是Redis
  • 数据持久化
  • 数据删除策略
  • Redis缓存穿透、击穿、雪崩问题处理
  • 缓存穿透
  • 缓存击穿
  • 缓存雪崩


什么是Redis

Redis是一个基于内存读写数据的高性能非关系型数据库,数据格式以key-value形式存储。企业开发中常用来存放缓存数据,减少关系型数据库的压力,提高请求的响应效率。

数据持久化

Redis使用内存来提高读写数据的效率,但是数据在内存中容易丢失,所以Redis提供了两种数据持久化机制。

  1. AOF
    持久化机制: 当Redis数据发生更新时,会将操作命令记录在一个日志文件当中,在日志文件结尾追加。Redis重启时,将日志文件的命令重新执行一遍,以达到数据恢复的目的。
    优点: 每次数据变化都会记录下来,数据不易丢失
    缺点:
    耗性能:每次记录操作时,都会开启一个进程来记录操作命令。
    恢复数据慢:恢复数据时需要将日志中的全部命令执行一遍
  2. RDB
    持久化机制: 每间隔一段时间,将当前Redis数据库中的所有数据以快照的形式存储到文件当中,当Redis重启时会将快照中的数据加载到Redis中。
    优点: 恢复数据快,直接恢复快照中的数据
    缺点:
    数据容易丢失:在保存快照的时间间隔时发生宕机,这段时间的数据是无法恢复的
    耐久性差 :保存快照是需要耗费性能的,如果在保存快照时对数据进行读写,会存在等待响应的时间
  3. 当然,两者可以组合使用,既可以保证数据的快速恢复又可以保证数据不丢失

数据删除策略

Redis的数据可以设置有效时间,当Redis数据失效时,Redis有多种机制来清除失效的数据。

  1. 定期删除(立即删除)
数据一旦过期立即删除

优点: 快速删除不需要的数据,及时释放内存,节约内存
缺点: 如果到期的数据量过大过多,会对CPU造成压力,影响性能

  1. 定期删除(随机删除)
根据CPU的性能和内存占用情况对已过期的数据进行不定时的清除
  1. 惰性删除
数据到期时不进行删除,直到数据被访问时才进行删除

优点: 发现时才删除数据,节约CPU性能
缺点: 内存中可能会存在大量的过期数据,内存压力会较大

Redis缓存穿透、击穿、雪崩问题处理

Redis缓存数据流程:

一般来讲,redis在项目中缓存的逻辑是先判断缓存中是否存在数据,如果存在直接返回,如果不存在,从数据库查找后再缓存到Redis中,然后再返回数据。

流程图如下:

redis 写入记录 redis写入失败补偿机制_redis

缓存穿透

问题场景:

缓存穿透是指用户查询的数据在缓存和数据库中都不存在,然后请求量过大,导致数据库的压力过大,一般是有人恶意攻击的情况下导致,比如查根据用户id查询个人信息,但是有人一直通过 id = -1频繁访问接口,很明显用户id为-1的用户不存在。

解决方案:
1.可以设计访问请求监测机制,拦截非法请求用户
2.缓存的数据为key-value格式,可以将value设置为null,防止数据库产生过大压力

缓存击穿

问题场景:

缓存击穿一般是指缓存中没有的数据,数据库中存在,然后过大的并发量导致数据库压力过大。

举例说明:场假如某一商品为秒杀商品,将此商品信息放入缓存中,以减少查询数据库的压力,缓存有效期为商品秒杀结束前。此逻辑看似合理,但在实际应用场景中,秒杀结束后,用户依然会频繁访问此商品,此时缓存已过期,所有请求查询都会访问数据库,导致数据库压力过大。

解决方案:
1.延长数据的有效期或设置热点数据为永不过期
2.设置互斥锁减少访问数据库的请求

缓存雪崩

问题场景:

缓存雪崩一般是指某一时刻,缓存数据全部过期失效或者缓存服务器宕机,所有数据请求都通过数据库查询,数据库压力瞬间增大
缓存击穿与雪崩的区别:缓存击穿是指访问某一条数据,并发量过大。缓存雪崩是指缓存大量请求去访问不通的数据,而缓存中不存在。

解决方案:
1.随机延长数据的有效期,防止数据同时过期,减少访问数据库的频率
2.Redis集群防止单点故障