Redis 面试题 001 - 010

001、什么是 Redis?

Redis 是一个使用 C 语言开发的内存数据库,读写速度非常快,它提供了多种数据类型来支持不同的业务场景,可以用作缓存、分布式锁甚至是消息队列。

002、缓存数据的处理流程?

如果用户请求的数据在缓存中存在的话就直接返回,如果不存在的话就看数据库中是否存在,数据库中有的话就更新缓存并返回对应的数据给用户,如果数据库中不存在的话就返回空数据。

image-20210307125429546

003、为什么要使用 Redis / 缓存?

主要是为了满足系统高性能、高并发的要求。

对于那种用户高频访问且不经常更改的数据,如果每次都从数据库中直接读取的话速度是比较慢的,很影响系统性能和用户体验,而如果把这些数据存入缓存中,用户只需要第一次访问数据库,之后只要缓存还有效就可以直接从缓存中读取数据,访问缓存相当于访问内存,速度是非常快的。

一般使用 Redis 缓存之后,数据库的 QPS 会有一个很大的提升,这意味着系统并发性能也会有一个很大的提升。

QPS(Query Per Second):服务器每秒可以执行的查询次数。

004、Redis 常见数据结构及使用场景分析?

string 以 k-v 键值对的形式存储数据,常用场景有缓存、计数器、分布式锁等。

list 是一个双向链表结构,易于插入和删除数据并且可以灵活调整链表长度,支持反向查找和遍历,但是随机访问比较困难,常用场景有消息队列、慢查询等。

redis-list

hash 类似于 JDK 1.8 之前的 HashMap,每一个 key 对应一个 field 和 value 的映射表,很适合存储对象,并且支持只修改对象中某个属性的值,一般我们可以用 hash 数据结构存储用户信息、商品信息、优惠券信息。

set 是一个无序不可重复的集合,它提供了接口来判断一个元素是否存在于 set 集合内,list 却没有,并且基于 set 可以实现交集、并集、差集的操作,因此常用于数据不能重复、或者求多个数据源交集、并集、差集的场景。

zset 也有人称为 sorted set,和 set 相比,zset 增加了一个权重参数 score,集合中的元素按照 score 进行排序,并且可以根据 score 的范围来获取元素列表,常用于需要对数据根据某个权重进行排序的场景,比如直播系统中在线用户列表、礼物榜单等。

005、Redis 单线程模型详解?

Redis 最核心的是文件事件处理器。文件事件处理器是单线程执行的,它内部通过 IO 多路复用技术来同时监听多个 socket,并根据 socket 目前执行的任务来为其关联不同的事件处理器,当被监听的 socket 准备好执行操作的时候,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用之前 socket 关联好的事件处理器来处理这些事件。

redis事件处理器

为什么 Redis 内部是单线程却还这么快?

我认为最主要的原因是:在内存中执行,使用 IO 多路复用技术(非阻塞 IO)。

006、Redis 为什么不使用多线程?

  1. 单线程编程容易并且更容易维护;
  2. Redis 的性能瓶颈不在 CPU ,主要在内存和网络;
  3. 多线程就会存在死锁、线程上下文切换等问题,甚至会影响性能。

007、Redis 6.0 之后为何引入了多线程?

主要是为了提高网络 IO 的读写性能,因为这算是 Redis 的一个性能瓶颈。

Redis 6.0 虽然引入了多线程,但是 Redis 的多线程只是在网络数据的读写这类耗时操作上使用了, 执行命令仍然是单线程顺序执行,因此仍然是线程安全的。

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

io-threads-do-reads yesCopy to clipboardErrorCopied

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

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

008、Redis 给缓存数据设置过期时间有啥用?

内存是有限的,如果缓存中的所有数据都一直保存的话,很快就会内存溢出。

过期时间除了有助于缓解内存消耗,还有什么作用?

在有些业务场景下某些数据只存在一段时间,比如短信验证码只在 10 分钟之内有效,用户登录的 token 只在一天内有效,对于这些数据我们就没必要往传统的关系型数据库存储了,直接存储在 Redis 中,设置一个过期时间,到期就自动失效了。

009、Redis 是如何判断数据是否过期的?

Redis 内部有一个过期字典 expires 来保存数据过期的事件。过期字典的键是一个指针,指向键空间中某个键对象,过期字典的值是一个longlong 类型的整数,这个整数保存了过期字典键所指向的对象的过期时间。

redis过期时间

010、过期数据的删除策略都有什么?

  1. 惰性删除:在取出 key 的时候检查数据是否过期。这样对 CPU 友好,但可能会造成太多的 key 没有被删除,占用内存。
  2. 定期删除:每隔一段时间随机抽取出一批 key 删除其中过期的 key,并且 Redis 底层会通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响。

Redis 是两种策略配合使用的,但还是会漏掉一些过期 key 无法删除,那么该怎么办呢?这时就要靠Redis 内存淘汰机制了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值