面试必备(必背)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

相关推荐

不愿透露姓名的神秘牛友
10-22 00:14
探探荣耀通软/嵌软池子深度
想六点下班番石榴在线蹲牛友:作者提到公司探探哈哈哈哈
点赞 评论 收藏
分享
23 291 评论
分享
牛客网
牛客企业服务