面试必备(必背)Redis

在近几年的面试过程中,redis变成了一个必考题,不知道是面试官确实对这方面感兴趣还是项目中使用redis越来越多。这里整理了几个常见的问题,redis八股文。

1、简单说一下什么是Redis

关键字:Key-Value类型的内存数据库,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB,支持保存多种数据结构,支持Key-Value设置expire时间释放内存。

Redis的全称是:Remote Dictionary.Server,本质上是一个Key-Value类型的内存数据库,很像Memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。

因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。

Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 Memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。

比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。

另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的Memcached来用。 Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

2、Redis基本数据类型与常用指令

关键词:String、List、Set、Zset、Hash

String

redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。

List链表(Redis用双端链表实现List)。

使用List结构,我们可以轻松地实现最新消息排队功能(比如新浪微博的TimeLine)。List的另一个应用就是消息队列,可以利用List的 PUSH 操作,将任务存放在List中,然后工作线程再用 POP 操作将任务取出进行执行。

Set 无序集合。

集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

Zset

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

3、Redis持久化机制

关键词:

RDB,即 Redis DataBase:把 Redis 服务器中内存的数据保存到一个 dump 文件中,数据的集合         AOF,即 Append-only file:把所有对 Redis 服务器进行修改的命令保存到一个 aof 文件中,命令的集合

RDB,即 Redis 的内存快照,它是在某一个时间点将 Redis 的内存数据全量写入一个临时文件,当写入完成后,用该临时文件替换上一次持久化生成的文件,这样就完成了一次持久化过程。

触发过程

RDB 持久化触发分为手动和自动两种方式。

手动方式有两种:save 命令和 bgsave 命令。

自动触发方式save m n该方式在 redis.conf 中进行了说明,m 表示"间隔时间",n 表示 "变更次数",只有同时符合这两个条件才会

触发,否则"变更次数"会被继续累加到下一个"间隔时间"上。同时,该方式也不会阻塞。这个可以认为是 bgsave 的自动触发过程。

4、Redis对于过期键的删除策略

关键字:定时删除、惰性删除、定期删除

定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作;

惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过

期,那就返回该键;

定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于删除多少过期键,以及要检查多少个数据库,则

由算法决定。

5、Redis有哪几种数据淘汰策略

关键字:6种 1默认、2allkeys、3volatile

默认

  • noenviction:Redis 的默认策略,不回收数据,当达到最大内存时,新增数据返回 error

allkeys 是从全部数据集淘汰数据

  • allkeys-lru:从数据集(server.db[i].dict)中,使用LRU算法 淘汰最近最少使用的数据

  • allkeys-random:从数据集(server.db[i].dict)中,随机淘汰数据

volatile 是对已设置过期时间的数据集淘汰数据:

  • volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中,使用LRU算法 淘汰最近最少使用的数据

  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中,越早过期的越优先被淘汰

  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中,随机淘汰数据

6、你是怎么理解Redis事务的

关键词:开启事务multi、命令入列、执行事务exec/放弃事务discard

事务指的是提供一种将多个命令打包,一次性按顺序地执行的机制,并且保证服务器只有在执行完事务中的所有命令后,才会继续处理此客户端的其他命令。事务也是其他关系型数据库 所必备的基础功能。

开启事务,multi 命令用于开启事务,multi 命令可以让客户端从非事务模式状态,变为事务模式状态,不支持嵌套使用。

命令入列,客户端进入事务状态之后,执行的所有常规 Redis 操作命令(非触发事务执行或放弃和导致入列异常的命令)会依次入列,命令入列成功后会返回 QUEUED。

执行事务的命令是 exec,放弃事务的命令是 discard。

不支持事务回滚

7、简单说明 Redis 分布式锁

关键词:单线程、重复值不可插入并返回false

使用Redis分布式锁的原理:首先,redis是单线程的,这是前提条件。redis中有值超时的设置以及重复值不可插入并返回false功能

能保证在一个进程执行了一个访问公共资源的方法时,往redis中设置了一个标识(加锁)等另一个进程同样操作这个方法时,再去

加锁,就发现已经有了,就等待,并不停的尝试加锁。

8、单线程的redis对应多核CPU怎样提升效率

关键字:多个redis

同一个服务器部署多个Redis的实例

9、Redis常见性能问题和解决方案

关键字: 持久化、同一个局域网内、单向链表结构

(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件

(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

(4) 尽量避免在压力很大的主库上增加从库

(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

10、Redis如何做内存优化

关键字:散列表

尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面。

11、Redis使用场景

使用场景就很多了,可以根据项目过成中的应用场景进行描述也可以从一下几个方面进行思考
会话缓存(Session Cache)、全页缓存(FPC)、队列排行榜/计数器发布/订阅

面试小技巧:拿不准的就说不知道,面试官一般都是公司的资深技术员,对我们这些做技术的人来说学习能力和技能掌握的准确度很重要




#面试复盘##面经##笔记##技术栈##题解#
全部评论
🎉恭喜同学成功投稿参与【面试复盘】,并通过审核! 😉请留意你的私信,官方红N人员将与你取得联系,进行奖励发放~ 👉🏻戳:https://www.nowcoder.com/discuss/872618了解更多活动详情~
1 回复 分享
发布于 2022-04-21 12:20
标题写错Redis了
点赞 回复 分享
发布于 2022-05-07 11:09

相关推荐

点赞 评论 收藏
分享
双飞二本嵌入式求拷打我是在&nbsp;BOSS&nbsp;上投递的简历,好多都没人回复,这是开场白和简历求大神帮忙看看。您好!我是2025届应届生,最快可在一周内上岗,能够实习六个月以上,并接受加班。以下是我的核心优势和相关经验:1.&nbsp;嵌入式开发能力:&nbsp;&nbsp;&nbsp;熟练掌握STM32系列单片机及其外设(如GPIO、定时器、ADC、DAC、I2C、SPI、UART等),能够独立完成硬件驱动开发和调试。&nbsp;&nbsp;熟悉FreeRTOS实时操作系统,具备多任务调度和资源管理经验。&nbsp;&nbsp;熟悉LVGL图形库开发,能够实现嵌入式设备的图形界面设计。2.&nbsp;硬件设计能力:&nbsp;&nbsp;&nbsp;具备PCB设计经验,曾为2023年工创赛物流搬运赛道设计小车主板,带领团队获得国家级银奖。&nbsp;&nbsp;&nbsp;熟悉硬件原理图分析,能够快速理解并调试硬件电路。3.&nbsp;机器人开发与竞赛经验:&nbsp;&nbsp;&nbsp;在全国大学生智能车竞赛、ROS机器人竞赛中多次获得国家级奖项,具备丰富的机器人开发经验。&nbsp;&nbsp;&nbsp;熟悉Linux环境,对ROS和ROS&nbsp;2有一定了解,能够进行机器人系统的开发与调试。4.&nbsp;编程能力:&nbsp;&nbsp;&nbsp;熟悉C/C++,熟悉Python,能够高效完成嵌入式开发和算法实现。&nbsp;&nbsp;&nbsp;具备良好的代码规范和文档编写能力。5.&nbsp;团队协作与领导能力:&nbsp;&nbsp;&nbsp;在多个项目中担任核心开发或团队负责人,具备良好的沟通能力和团队协作精神。&nbsp;&nbsp;&nbsp;在工创赛中带领团队完成项目规划、任务分配和技术攻关,展现了较强的领导力。我对嵌入式开发、机器人技术和智能硬件充满热情,期待加入贵公司,与团队共同成长,为公司创造价值!如果有合适的岗位,欢迎随时联系我,期待进一步沟通!
沉淀一会:嵌入式就是狗屎
点赞 评论 收藏
分享
03-12 21:51
门头沟学院 C++
pdd卡怎么严吗&nbsp;笔试a出来两道,第三题a出来20%直接给挂了😭😭😭
鳍足目:我a了2.5道也挂了,但是组里同学只a了1.6道进面了,而且我和他都是无实习,本硕同校,感觉全是玄学
投递拼多多集团-PDD等公司10个岗位 > 拼多多求职进展汇总
点赞 评论 收藏
分享
评论
23
292
分享

创作者周榜

更多
牛客网
牛客企业服务