redis

发布时间 2023-03-25 22:23:54作者: StudyHardWork

1.redis的应用场景

  • 1.5大value类型:
  • 2.基本上就是缓存。

2.redis是单线程还是多线程?

  • 1.无论什么版本工作线程就是一个。
  • 2.6.x版本出现了IO多线程。
  • 3.单线程,满足redis的串行原子性,只不过IO多线程后,把输入和输出放到更多的线程里面去并行,好处:1.执行时间缩短,更快。2.更好的压榨系统资源。

3.redis存在线程安全的问题吗?为什么?

redis可以保证内部串行,外界使用时要自行保障顺序。

4.遇到缓存穿透?

  • 穿透即在redis没有这个数据,请求直接到数据库,解决方案:1,将缓存里没有,数据库也没有的数据,请求后将数据以key为null的方式加到redis缓存里。2.使用布隆过滤器。
  • 当请求同一个key并大量很大时,因为redis时串行的,大量请求同时到达redis,请求会在redis里排队等待执行,第一个请求查redis没找到,请求会到达数据库,并将null值设置到redis,redis里此时还有剩下的大量串行请求也会按顺序请求到数据库上,造成数据库压力增大。解决方案:加锁,当请求取redis没有取到的时候再去抢锁,抢到锁的请求再去访问数据库,并设值到redis。

5.缓存击穿?

  • 热点key过期(或者从来没有被缓存的key),在大量并发请求下,某个key的过期造成大量请求落到数据库上。
    解决方案,同上,加锁,请求redis没有的情况下,所有请求取竞争同一把锁,抢到锁的请求再去查询数据库, 并更新redis,没有抢到的就让线程sleep(非阻塞状态,不会占用cpu调度)。

6.如何避免缓存雪崩?

缓存雪崩:大量的key同时过期,到时大量的请求落到数据库上。
解决方案:1.key的随机过期。2.加锁同上,只不过不同的key要用不同的锁,锁的隔离。AKF的分治。