当前位置:首页 > 服务端 > Redis经典面试题

Redis经典面试题

一、redis是单线程架构还是多线程架构

redis整体来说并非只有一个线程(多线程),只是redis在处理网络请求,k/v读写操作这个过程是用一个线程来处理的,它的其他功能:持久化、异步删除、集群同步都是采用额外的线程来完成的。

二、单线程的redis为什么这么快

  1. 大部分操作基于内存,有高效的数据结构(简单动态字符串、双向链表、压缩列表、哈希表、跳跃表、整数数组)。
  2. 选择单线程,避免了多线程上下文切换和竞争。
  3. redis底层采用IO多路复用技术,能够保证大量并发下的效率,提高系统的吞吐量。

三、Redis6.x 之后为何引入了多线程?

Redis6.0 引入多线程主要是为了提高网络 IO 读写性能(Redis 的瓶颈并不在 CPU,而在内存和网络。)

虽然,Redis6.0 引入了多线程,但是 Redis 的多线程只是在网络数据的读写这类耗时操作上使用了, 执行命令仍然是单线程顺序执行。因此,你也不需要担心线程安全问题。

四、Redis6.x多线程的实现机制?

Redis经典面试题 _ JavaClub全栈架构师技术笔记
流程简述如下:

  • 主线程负责接收建立连接请求,获取 Socket 放入全局等待读处理队列。
  • 主线程处理完读事件之后,通过 RR(Round Robin)将这些连接分配给这些 IO 线程。
  • 主线程阻塞等待 IO 线程读取 Socket 完毕。
  • 主线程通过单线程的方式执行请求命令,请求数据读取并解析完成,但并不执行。
  • 主线程阻塞等待 IO 线程将数据回写 Socket 完毕。
  • 解除绑定,清空等待队列。

Redis经典面试题 _ JavaClub全栈架构师技术笔记
该设计有如下特点

  • IO 线程要么同时在读 socket,要么同时在写,不会同时读或写。
  • IO 线程只负责读写 socket 解析命令,不负责命令处理。

五、 Redis6.x默认是否开启了多线程?

Redis6.0 的多线程默认是禁用的,只使用主线程。
如需开启需要修改 redis 配置文件 redis.conf

io-threads-do-reads yes

开启多线程后,还需要设置线程数,否则是不生效的。同样需要修改 redis 配置文件 redis.conf

io-threads 4 #官网建议4核的机器建议设置为2或3个线程,8核的建议设置为6个线程

缓存穿透:key中对应的缓存数据不存在,导致去请求数据库,造成数据库的压力倍增的情况。

缓存击穿:redis过期后的一瞬间,有大量用户请求同一个缓存数据,导致这些请求都去请求数据库,造成数据库压力倍增的情,针对一个key而言。

缓存雪崩:缓存服务器宕机或者大量缓存集中某个时间段失效,导致请求全部去到数据库,造成数据库压力倍增的情况,这个是针对多个key而言。

六、缓存穿透

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,造成数据库的压力倍增的情况。

例:发起为id值为 -1 的数据或 id 为特别大不存在的数据。
Redis经典面试题 _ JavaClub全栈架构师技术笔记
解决方案:

  • 接口层增加校验,比如用户鉴权校验,参数做校验 比如:id 做基础校验,id <=0的直接拦截。
  • 对于像ID为负数的非法请求直接过滤掉,采用布隆过滤器(Bloom Filter)。
  • 针对在数据库中找不到记录的,我们仍然将该空数据存入缓存中,当然一般会设置一个较短的过期时间。

七、缓存雪崩

缓存服务器宕机或者大量缓存集中某个时间段失效,导致请求全部去到数据库,造成数据库压力倍增的情况,这个是针对多个key而言。

Redis经典面试题 _ JavaClub全栈架构师技术笔记
解决

  • 实现缓存高可用,通过redis cluster将热点数据均匀分布在不同的Redis库中也能避免全部失效的问题。
  • 批量往Redis存数据的时候,把每个Key的失效时间都加个随机值。
setRedis(Key,value,time + Math.random() * 10000);

八、缓存击穿

redis过期后的一瞬间,有大量用户请求同一个缓存数据,导致这些请求都去请求数据库,造成数据库压力倍增的情,针对一个key而言。

缓存击穿与缓存雪崩的区别是这里针对的是某一热门key缓存,而雪崩针对的是大量缓存的集中失效。
Redis经典面试题 _ JavaClub全栈架构师技术笔记
解决方案

  • 设置热点数据永远不过期。
  • 添加互斥锁,保证同一时刻只有一个线程可以访问数据库。

作者:用生命研发技术
来源链接:https://blog.csdn.net/qq_37242720/article/details/123741487

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/67933.html

分享给朋友: