关于面试:锁屏面试题百日百刷Redis篇二

41次阅读

共计 3492 个字符,预计需要花费 9 分钟才能阅读完成。

锁屏面试题百日百刷,每个工作日保持更新面试题。锁屏面试题 app、小程序现已上线,已收录了每日更新的面试题的所有内容,还蕴含特色的解锁屏幕温习面试题、每日编程题目邮件推送等性能。让你在面试中后人一步,吊打面试官! 接下来的是今日的面试题:

====Redis 的优缺点?
长处:
a) 性能极高 – Redis 能反对超过 100K+ 每秒的读写频率。
b) 丰盛的数据类型 – Redis 反对二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
c) 原子 – Redis 的所有操作都是原子性的,同时 Redis 还反对对几个操作全并后的原子性执行。
d)丰盛的个性 – Redis 还反对 publish/subscribe, 告诉, key 过期等等个性。
毛病:
a)因为是内存数据库,所以,单台机器,存储的数据量,跟机器自身的内存大小无关。尽管 redis 自身有 key 过期策略,然而还是须要提前预估和节约内存。如果内存增长过快,须要定期删除数据。
b)如果进行残缺重同步,因为须要生成 rdb 文件,并进行传输,会占用主机的 CPU,并会耗费现网的带宽。不过 redis2.8 版本,曾经有局部重同步的性能,然而还是有可能有残缺重同步的。比方,新上线的备机。
c)批改配置文件,进行重启,将硬盘中的数据加载进内存,工夫比拟久。在这个过程中,redis 不能提供服务。

==== 讲一讲 Redis 的长久化?
RDB 长久化:该机制能够在指定的工夫距离内生成数据集的工夫点快照(point-in-time snapshot)。
AOF 长久化:记录服务器执行的所有写操作命令,并在服务器启动时,通过从新执行这些命令来还原数据集。AOF 文件中的命令全副以 Redis 协定的格局来保留,新命令会被追加到文件的开端。Redis 还能够在后盾对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保留数据集状态所需的理论大小
无长久化:让数据只在服务器运行时存在。
同时利用 AOF 和 RDB:当 Redis 重启时,它会优先应用 AOF 文件来还原数据集,因为 AOF 文件保留的数据集通常比 RDB 文件所保留的数据集更残缺。

==== 讲一讲 RDB 长久化和 AOF 长久化的优缺点?
RDB 的优缺点:
长处:RDB 是一个十分紧凑(compact)的文件,它保留了 Redis 在某个工夫点上的数据集。这种文件非常适合用于进行备份:比如说,你能够在最近的 24 小时内,每小时备份一次 RDB 文件,并且在每个月的每一天,也备份一个 RDB 文件。这样的话,即便遇上问题,也能够随时将数据集还原到不同的版本。RDB 十分实用于劫难复原(disaster recovery):它只有一个文件,并且内容都十分紧凑,能够(在加密后)将它传送到别的数据中心,或者亚马逊 S3 中。RDB 能够最大化 Redis 的性能:父过程在保留 RDB 文件时惟一要做的就是 fork 出一个子过程,而后这个子过程就会解决接下来的所有保留工作,父过程毋庸执行任何磁盘 I/O 操作。RDB 在复原大数据集时的速度比 AOF 的复原速度要快。
毛病:如果你须要尽量避免在服务器故障时失落数据,那么 RDB 不适宜你。尽管 Redis 容许你设置不同的保留点(save point)来管制保留 RDB 文件的频率,然而,因为 RDB 文件须要保留整个数据集的状态,所以它并不是一个轻松的操作。因而你可能会至多 5 分钟才保留一次 RDB 文件。在这种状况下,一旦产生故障停机,你就可能会失落好几分钟的数据。每次保留 RDB 的时候,Redis 都要 fork() 出一个子过程,并由子过程来进行理论的长久化工作。在数据集比拟宏大时,fork() 可能会十分耗时,造成服务器在某某毫秒内进行
解决客户端;如果数据集十分微小,并且 CPU 工夫十分缓和的话,那么这种进行工夫甚至可能会长达整整一秒。
AOF 的优缺点。
长处:
1、应用 AOF 长久化会让 Redis 变得非常耐久(much more durable):你能够设置不同的 fsync 策略,比方无 fsync,每秒钟一次 fsync,或者每次执行写入命令时 fsync。AOF 的默认策略为每秒钟 fsync 一次,在这种配置下,Redis 依然能够保持良好的性能,并且就算产生故障停机,也最多只会失落一秒钟的数据(fsync 会在后盾线程执行,所以主线程能够持续致力地解决命令申请)。AOF 文件是一个只进行追加操作的日志文件(append only
log),因而对 AOF 文件的写入不须要进行 seek,即便日志因为某些起因而蕴含了未写入残缺的命令(比方写入时磁盘已满,写入中途停机,等等),redis-check-aof 工具也能够轻易地修复这种问题。
2、Redis 能够在 AOF 文件体积变得过大时,主动地在后盾对 AOF 进行重写:重写后的新 AOF 文件蕴含了复原以后数据集所需的最小命令汇合。整个重写操作是相对平安的,因为 Redis 在创立新 AOF 文件的过程中,会持续将命令追加到现有的 AOF 文件外面,即便重写过程中产生停机,现有的 AOF 文件也不会失落。而一旦新 AOF 文件创建结束,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。
毛病:
对于雷同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。依据所应用的 fsync 策略,AOF 的速度可能会慢于 RDB。在个别状况下,每秒 fsync 的性能仍然十分高,而敞开 fsync 能够让 AOF 的速度和 RDB 一样快,即便在高负荷之下也是如此。不过在解决微小的写入载入时,RDB 能够提供更有保障的最大延迟时间(latency)。
AOF 在过来已经产生过这样的 bug:因为个别命令的起因,导致 AOF 文件在从新载入时,无奈将数据集复原成保留时的原样。(举个例子,阻塞命令 BRPOPLPUSH 就已经引起过这样的 bug。)测试套件里为这种状况增加了测试:它们会主动生成随机的、简单的数据集,并通过从新载入这些数据来确保一切正常。尽管这种 bug 在 AOF 文件中并不常见,然而比照来说,RDB 简直是不可能呈现这种 bug 的。

====Redis 是单过程单线程的吗?
Redis 是单过程单线程的,redis 利用队列技术将并发拜访变为串行拜访,打消了传统数据库串行管制的开销。

====Redis 中一个字符串类型的值能存储最大容量是多少?
512M

====redis 过期键的删除策略?
1、定时删除: 在设置键的过期工夫的同时,创立一个定时器 timer). 让定时器在键的过期工夫来长期,立刻执行对键的删除操作。
2、惰性删除: 放任键过期不论,然而每次从键空间中获取键时,都查看获得的键是 否过期,如果过期的话,就删除该键; 如果没有过期,就返回该键。
3、定期删除: 每隔一段时间程序就对数据库进行一次查看,删除外面的过期键。至 于要删除多少过期键,以及要查看多少个数据库,则由算法决定。

====Redis 有哪几种回收策略(淘汰策略)?
volatile-lru:从已设置过期工夫的数据集(server.db[i].expires)中筛选最近起码应用的数据淘汰
volatile-ttl:从已设置过期工夫的数据集(server.db[i].expires)中筛选将要过期的数据淘汰
volatile-random:从已设置过期工夫的数据集(server.db[i].expires)中任意抉择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中筛选最近起码应用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意抉择数据淘汰
no-enviction(驱赶):禁止驱赶数据
留神这里的 6 种机制,volatile 和 allkeys 规定了是对已设置过期工夫的数据集淘汰数据还是从全副数据集淘汰数据,前面的 lru、ttl 以及 random 是三种不同的淘汰策略,再加上一种 no-enviction 永不回收的策略。
应用策略规定:
1、如果数据出现幂律散布,也就是一部分数据拜访频率高,一部分数据拜访频率 低,则应用 allkeys-lru
2、如果数据出现平等散布,也就是所有的数据拜访频率都雷同,则应用 allkeys-random

====Redis 的同步机制理解么?
Redis 能够应用主从同步,从从同步。第一次同步时,主节点做一次 bgsave,并同时将后续批改操作记录到内存 buffer,待实现后将 rdb 文件全量同步到复制节点,复制节点承受实现后将 rdb 镜像加载到内存。加载实现后,再告诉主节点将期间批改的操作记录同步到复制节点进行重放就实现了同步过程。

更多面试题或学习资源可查看我主页或评论获取

正文完
 0