面试题百日百刷-Redis篇(三)

2021/7/11 2:05:52

本文主要是介绍面试题百日百刷-Redis篇(三),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

锁屏面试题百日百刷,每个工作日坚持更新面试题。锁屏面试题app、小程序现已上线,官网地址:https://www.demosoftware.cc/#/introductionPage。已收录了每日更新的面试题的所有内容,还包含特色的解锁屏幕复习面试题、每日编程题目邮件推送等功能。让你在面试中先人一步,吊打面试官!接下来的是今日的面试题:

 

 

====Redis中Pipeline有什么好处,为什么要用pipeline?

 

可以将多次 IO 往返的时间缩减为一次,前提是 pipeline 执行的指令之间没有因果相关性。使用redis-benchmark 进行压测的时候可以发现影响 redis 的 QPS 峰值的一个重要因素是 pipeline 批次指令的数目。

 

 

 

====是否使用过 Redis 集群,集群的原理是什么?

 

1. 、Redis Sentinal 着眼于高可用, 在 master 宕机时会自动将 slave 提升为master, 继续提供服务。

 

2. 、Redis Cluster 着眼于扩展性, 在单个 redis 内存不足时, 使用 Cluster 进行分片存储。

 

 

 

====Redis 集群方案什么情况下会导致整个集群不可用?

 

有 A,B,C 三个节点的集群,在没有复制模型的情况下,如果节点 B 失败了,那么整个集群就会以为缺少 5501-11000 这个范围的槽而不可用。

 

 

 

====Redis 支持的Java 客户端都有哪些?官方推荐用哪个?

 

Redisson、Jedis、lettuce 等等, 官方推荐使用 Redisson。

 

 

 

====Jedis 与 Redisson 对比有什么优缺点?

 

Jedis 是 Redis 的 Java 实现的客户端, 其 API 提供了比较全面的 Redis 命令的支持;Redisson 实现了分布式和可扩展的 Java 数据结构,和 Jedis 相比,功能较为简单, 不支持字符串操作, 不支持排序、事务、管道、分区等 Redis 特性。Redisson 的宗旨是促进使用者对 Redis 的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

 

 

 

====Redis 如何设置密码及验证密码?

 

设置密码: config set requirepass 123456 授权密码:auth 123456

 

 

 

====说说 Redis 哈希槽的概念?

 

Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念, Redis 集群有2的14次方(16384)个哈希槽,每个key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽, 集群的每个节点负责一部分 hash 槽。

 

 

 

====Redis用了哈希槽的概念,而没有用一致性哈希算法,这样做的原因是为什么呢?

 

Redis Cluster是自己做的crc16的简单hash算法,没有用一致性hash。Redis的作者认为它的crc16(key) mod 16384的效果已经不错了,虽然没有一致性hash灵活,但实现很简单,节点增删时处理起来也很方便。

 

 

 

====Redis 集群的主从复制模型是怎样的?

 

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有 N-1 个复制品。

 

 

 

====Redis 集群会有写操作丢失吗?为什么?

 

Redis 并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。

 

 

 

====Redis 集群之间是如何复制的?

 

异步复制

 

 

 

====Redis 集群最大节点个数是多少?

 

2的14次方(16384)

 

 

 

====Redis 集群如何选择数据库?

 

 Redis 集群目前无法做数据库选择, 默认在 0 数据库。

 

 

 

====说一说Redis中的事务?

 

1、Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

 

1)批量操作在发送 EXEC 命令前被放入队列缓存。

 

2)收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。

 

3)在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

 

2、一个事务从开始到执行会经历以下三个阶段:

 

开始事务。

 

命令入队。

 

执行事务。

 

3、redis中相关的指令有:

 

DISCARD

 

取消事务,放弃执行事务块内的所有命令。

 

EXEC

 

执行所有事务块内的命令。

 

MULTI

 

标记一个事务块的开始。

 

UNWATCH

 

取消 WATCH 命令对所有 key 的监视。

 

WATCH key [key ...]

 

监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

 

4、单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

 

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

 

redis 127.0.0.1:7000> multi

 

OK

 

redis 127.0.0.1:7000> set a aaa

 

QUEUED

 

redis 127.0.0.1:7000> set b bbb

 

QUEUED

 

redis 127.0.0.1:7000> set c ccc

 

QUEUED

 

redis 127.0.0.1:7000> exec

 

1) OK

 

2) OK

 

3) OK

 

 

 

====Redis key 的过期时间和永久有效分别怎么设置?

 

使用EXPIRE 和 PERSIST 命令。

 

 

 

====Redis 如何做内存优化?

 

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

 

 

 

更多面试题可关注"demo锁屏面试题"公众号通过小程序或App获取面试题和学习资源

 



这篇关于面试题百日百刷-Redis篇(三)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程