Redis⾯试题汇总
Redis ⾯试题汇总
1.Redis 使⽤场景有哪些?
答:Redis 使⽤场景如下:
记录帖⼦点赞数、点击数、评论数
缓存近期热帖
plsql无法连接数据库缓存⽂章详情信息
记录⽤户会话信息
2.Redis 有哪些功能?
答:Redis 功能如下:
数据缓存功能
分布式锁的功能
⽀持数据持久化
⽀持事务
⽀持消息队列
3.Redis ⽀持哪些数据类型?
答:Redis ⽀持的数据类型如下:
String 字符串
List 列表
Set ⽆序集合
ZSet 有序集合
Hash 哈希类型
4.Redis 相⽐ Memcached 有哪些优势?
答:Redis 相⽐ Memcached 优势如下:
Memcached 所有的值均是简单的字符串,Redis ⽀持更为丰富的数据类型
Redis 的速度⽐ Memcached 要快
Redis 可以持久化
Redis 可以设置过期时间
Redis ⽀持主从同步
5.Redis ⽀持哪些淘汰策略?
答:Redis 淘汰策略如下:
noeviction:禁⽌淘汰数据;
allkeys-lru:尝试回收最少使⽤的键,使得新添加的数据有空间存放;
volatile-lru:尝试回收最少使⽤的键,但仅限于在过期集合的键,使得新添加的数据有空间存放;
allkeys-random:回收随机的键使得新添加的数据有空间存放;
volatile-random:回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键;
volatile-ttl:回收在过期集合的键,并且优先回收存活时间较短的键,使得新添加的数据有空间存放。
6.官⽅为什么不⽀持 Windows 版本?
答:Redis 官⽅是不⽀持 Windows 版的,因为⽬前 Linux 版本已经相当稳定,如果开发 Windows 版本,反⽽会带来兼容性等问题。
7.为什么 Redis 是单线程的?
答:因为 Redis 的瓶颈最有可能是机器内存或者⽹络带宽,⽽⾮单线程,既然单线程不是 Redis 的性能瓶颈,并且单线程⼜⽐较容易实现,所以 Redis 就选择使⽤单线程来实现。
单线程并不代表运⾏速度就慢,⽐如,Nginx 和 NodeJs 都是单线程⾼性能的代表。
8.为什么 Redis 需要把所有数据放到内存中?
答:Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的⽅式将数据写⼊磁盘,这样 Redis 就拥有了快速查询和数据持久化
等特征。
9.在 Redis 中 key 的最⼤容量是多少?
答:最⼤容量 512 MB,官⽅说明如下图所⽰:
10.Jedis 和 Redisson 有什么区别?
答:Jedis 和 Redisson 的区别如下:
Jedis 是 Redis 的 Java 实现客户端,其 API 提供了⽐较全⾯的 Redis 命令的⽀持;
Redisson 实现了分布式和可扩展的 Java 数据结构,和 Jedis 相⽐,功能较为简单,不⽀持字符串操作,不⽀持排序、事务、管道、分区等 Redis 特性。Redisson 的宗旨是促进使⽤者对 Redis 的关注分离,从⽽让使⽤者能够将精⼒更集中地放在处理业务逻辑上。
11.Redis 如何设置过期时间?如何设置永久有效?
答:Redis 通过 expire() ⽅法设置过期时间,语法:pire(key, expiration)。当 expire 的过期时间设置为 -1 时,表⽰永不过期。12.如何保证 Redis 的数据⼀致性?
答:可使⽤以下⽅法来保证 Redis 的数据⼀致性:
合理设置缓存的过期时间;
新增、更改、删除数据库操作时同步更新 Redis,可以使⽤事物机制来保证数据的⼀致性。
13.Redis 的数据结构是什么?它有什么优缺点?
答:Redis 的数据结构是跳跃表,跳跃表是⼀种基于链表的扩展,跳跃表还是⼀个链表,是⼀个有序的链表,在遍历的时候基于⽐较,但普通链表只能遍历,跳跃表加⼊了⼀个层的概念,层级越⾼元素越少,每次先从⾼层查,直到到合适的位置,从图中可以看到⾼层的节点远远少于底层的节点数,从⽽实现了跳跃式查。
跳跃表优点:
实现⽐红⿊树简单
⽐红⿊树更容易扩展
红⿊树插⼊删除时为了平衡⾼度需要旋转附近节点,⾼并发需要锁,跳跃表不需要考虑
跳跃表缺点:
⽐红⿊树占⽤更多的内存,每个节点的⼤⼩取决于该节点层数
空间局部性差导致缓存命中率低,⽐红⿊树略慢
14.Redis 为什么⽤跳跃表来存储?
答:第⼀是因为红⿊树存储⽐较复杂,调整涉及到多个节点的并发修改;第⼆是越接近根节点的地⽅越容易产⽣竞争,即使是不同叶⼦节点的操作由于平衡操作也可能逐级向上涉及到接近根的节点,⽽跳跃表可以⽤ CAS(Compare And Swap)来并发操作节点,⽐较容易实现,且更加局部化。
15.什么是缓存穿透?如何解决?
答:缓存穿透是指查询⼀个⼀定不存在的数据,由于缓存中没有,因⽽每次需要从数据库中查询,但数据库也没有相应的数据,所以不会写⼊缓存,这就将导致每次请求都会去数据库查询,这种⾏为就叫缓存穿透。
解决⽅案是不管查询数据库是否有数据,都缓存起来,只不过把没有数据的缓存结果的过期时间设置为⽐较短的⼀个值,⽐如 3 分钟。16.什么是缓存雪崩,该如何解决?
答:指缓存由于某些原因,⽐如,宕机或者缓存⼤量过期等,从⽽导致⼤量请求到达后端数据库,进⽽导致数据库崩溃的情况。
解决缓存雪崩的⽅案如下:
分析业务功能,尽量让缓存的失效时间点均匀分布;
使⽤ Redis 主备,保证缓存系统的⾼可⽤。
17.什么是缓存预热?有⼏种实现⽅式?
答:缓存预热是指系统上线后,将相关的缓存数据直接加载到缓存系统,这样就可以避免在⽤户请求的时候,先查询数据库,然后再将数据缓存的问题。
缓存预热的实现⽅式,可分为以下两种:
数据量不⼤的时候,⼯程启动的时候进⾏加载缓存动作;
数据量⼤的时候,设置⼀个定时任务脚本,进⾏缓存的刷新。
servlet容器只调用一次的方法是18.在 Java 程序中如何使⽤ Redis?
答:在 Java 程序中可使⽤ Jedis 来操作 Redis,使⽤步骤如下:
1)添加 Jedis 引⽤
\<dependency\>
\<groupId\>redis.clients\</groupId\>
\<artifactId\>jedis\</artifactId\>
\<version\&\</version\>
mysql面试题常问\</dependency\>
2)连接并操作 Redis
Jedis jedis = new Jedis("127.0.0.1",6379);
/
/ 存值
jedis.set("hello","world");
// 取值
<("hello");
// 关闭连接
jedis.close();
19.什么是 Redis 持久化?如何进⾏ Redis 持久化?
答:Redis 持久化是指将内存中的数据保存在磁盘中,重启的时候可以再次加载进⾏使⽤。 Redis 有以下两种持久化⽅案:RDB(Redis DataBase):是指在制定的时间间隔内将内存中的数据集快照写⼊磁盘;
AOF(Append Only File):该机制将以⽇志的形式记录服务器所处理的每⼀个写操作,在 Redis 服务器启动之初会读取该⽂件来重新构建数据库,以保证启动后数据库中的数据是完整的。
Redis 默认⽀持的持久化⽅式是 RDB ⽅式。
20.RDB 和 AOF 有什么区别?
答:RDB 和 AOF 的区别如下:
RDB 可能会引起⼀定程度的数据丢失,AOF 不会造成数据丢失
RDB 的启动效率更⾼
AOF 占⽤的空间⽐ RDB ⼤,AOF 的同步速度⽐ RDB 慢
总体来说如果对数据的完整性要求不⾼,RDB 是最好的解决⽅案,反之则选择 AOF。
21.Redis 的监控⼯具都有哪些?
spyder安装第三方库答:常⽤的 Redis 监控⼯具如下:
Redis-stat:采⽤ Ruby 开发,基于 Redis 的 info 命令来统计,不影响 Redis 的性能;
RedisLive:采⽤ Python 开发的可视化及查询分析⼯具,它是通过监控脚本来 Redis 提供的 MONITOR 命令从被监控 Redis 实例中获取数据,并存储到 Redis 的监控实例中。
22.如何定位 Redis 的慢查询?
答:使⽤ slowlog get 来定位慢查询操作,如下所⽰:
127.0.0.1:6379> slowlog get
1.
1. (integer) 0
2. (integer) 1565937939
3. (integer) 28003
4.
1. "lpush"html个人博客网站
2) "list"
3) "1"
4) "2"
5) "6"
6) "3"
7) "4"
8) "9"
9) "8"
其中:
1. 表⽰慢查询记录 id
2. 表⽰发起命令的时间戳
3. 表⽰命令耗时,单位为微秒
4. 表⽰该条记录的命令及参数
23.SAVE 和 BGSAVE 有什么区别?
答:SAVE 和 BGSAVE 都是⽤于 Redis 持久化的,它们的区别如下:
SAVE 直接调⽤ rdbSave 函数(⽤于 Redis 持久化的函数),阻塞 Redis 主进程,直到保存完成为⽌,在主进程阻塞期间,服务器不能处理客户端的任何请求;
BGSAVE 则会创建⼀个⼦进程,⼦进程负责调⽤ rdbSave 函数,并在保存完成之后向主进程发送完成信号,Redis 服务器在
BGSAVE 执⾏期间仍然可以继续处理客户端的请求。
24.Redis 是如何实现同步的?
答:Redis 可以实现主从同步和从从同步。当第⼀次同步时,主节点做⼀次 BGSAVE,并同时将后续修改操作记录到内存中,待完成后将RDB ⽂件全量同步到复制节点,复制节点接受完成后将 RDB 镜像加载到内存,加载完成后再通知主节点将期间修改的操作记录,同步到复制节点进⾏重放,这样就完成了同步过程。
25.Redis 可以切换数据库吗?如何切换?
答:Redis 不像 MySQL 等关系型数据库那样有数据库的概念,不同的数据存在不同的数据库中,Redis 数据库是由⼀个整数索引标识,⽽不是⼀个数据库名称,默认情况下客户端连接到数据库 0,可以在配置⽂件中控制数据库总数,默认是 16 个。
可以使⽤ select index 来切换数据库,如下所⽰:
127.0.0.1:6379> select 0
OK
26.Redis 有哪些集策略?
答:Redis 集策略有以下 3 种:
主从策略:1 台机器作为写操作,另外 2 台作为读操作,类似于 MySQL 的主从⽅式;
哨兵策略:增加 1 台机器作为哨兵,监控 3 台主从机器,当主节点挂机的时候,机器内部进⾏选举,从集中从节点⾥指定⼀台机器升级为主节点,从⽽实现⾼可⽤。当主节点恢复的时候,加⼊到从节点中继续提供服务;
集策略:Redis 3.0 之后增加了集的概念,可实现多主多从的结构,实现真正的⾼可⽤。
27.Redis 集⽅案都有哪些?
答:Redis 集实现⽅案如下:
Twemproxy 是 Twitter 开源的 Redis 代理,它的使⽤和普通 Redis 完全⼀致,它会以⼀个代理的⾝份接收请求,并使⽤ hash 算法将请求转接到具体 Redis,将结果再返回 Twemproxy;
Codis 是开源解决⽅案,也是⽬前⽤的最多的集⽅案,基本和 Twemproxy 效果⼀致,但它⽀持在节点数量改变情况下,旧节点数据可恢复到新 hash 节点;
Redis Cluster 是 Redis 3.0 ⾃带的集⽅案,特点在于他的分布式算法不是⼀致性 hash,⽽是 hash 槽的概念,以及⾃⾝⽀持节点设置从节点;
业务代码层实现,创建⼏个独⽴的 Redis 实例,在代码层对 key 进⾏ hash 计算,然后去对应的 Redis 实例操作数据。这种⽅式对hash 层代码要求⽐较⾼,考虑部分包括,节点失效后的替代算法⽅案,数据震荡后的⾃动脚本恢复、实例的监控等。获取网页json数据
28.Redis 如何做内存优化?
答:把相关的信息整体存储,⽽不是把每个信息独⽴存储,这样就可以有效的减少内存使⽤。
29.分布式锁设计时需要注意哪些事项?
答:通常分布式锁在设计时,需同时满⾜以下四个约束条件。
互斥性:在任意时刻,只有⼀个客户端能持有锁。
安全性:即不会形成死锁,当⼀个客户端在持有锁的期间崩溃⽽没有主动解锁的情况下,其持有的锁也能够被正确释放,并保证后续其他客户端能加锁。
可⽤性:就 Redis ⽽⾔,当提供锁服务的 Redis master 节点发⽣宕机等不可恢复性故障时,slave 节点能够升主并继续提供服务,⽀持客户端加锁和解锁;对基于分布式⼀致性算法实现的锁服务,如 ETCD ⽽⾔,当 leader 节点宕机时,follow 节点能够选举出新的leader 继续提供锁服务。
对称性:对于任意⼀个锁,其加锁和解锁必须是同⼀个客户端,即,客户端 A 不能把客户端 B 加的锁给解了。
30.Redis 集实现的原理是什么?
答:集的实现原理和集的实现⽅式有关,如下所述:
Redis Sentinal 着眼于⾼可⽤,在 Master 宕机时会⾃动将 Slave 提升为 Master,继续提供服务;
Redis Cluster 着眼于扩展性,在单个 Redis 内存不⾜时,使⽤ Cluster 进⾏分⽚存储。
31.Redis 常见的性能问题有哪些?
答:Redis 常见性能问题如下:
主服务器写内存快照,会阻塞主线程的⼯作,当快照⽐较⼤时对性能影响是⾮常⼤的,会间断性暂停服务,因此主服务器最好不要写内存快照;
Redis 主从复制的性能问题,为了主从复制的速度和连接的稳定性,主从库最好在同⼀个局域⽹内。
互动评论
评论
跳跃表仅⽤在实现有序集合和集节点中的内部数据结构。关于跳跃表那⼀个问题,答案不太对
⽼王(作者)1 天前
⿎掌
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论