热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[Redis系列]redis学习十三,Redis常问简单面试题

咱们一起来看看redis常问常用的面试题Redis是个啥?www.redis.cnredis中文网给了很明确且清晰的定义Redis是一个开源(BSD许可)的,内存中的数据结构存储系






咱们一起来看看 redis 常问常用的面试题


Redis 是个啥?

www.redis.cn/ redis 中文网给了很明确且清晰的定义



  • Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统


  • Redis 可以用作数据库、缓存和消息中间件


  • 支持的数据结构有 8

    字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets), bitmaps, hyperloglogs 和 geospatial



使用 redis 有什么益处?



  • 存取的数据都非常快,redis 的数据是直接在内存中操作的
  • 特性丰富:可用于缓存,消息队列,等等
  • 支持 8 种 数据类型

Redis 为什么这么快嘞?

首先 redis 是单线程的,很多人认为单线程就一定慢,多线程就一定快,这是一个误解



  • redis 使用多路 I/O 复用模型,非阻塞 的 IO
  • 采用单线程,就不会有上下文切换的消耗,不用去考虑加锁和解锁的事情,没有竞争资源出现的性能消耗
  • 数据结构很简单,上述 8 种 数据类型,一学就会
  • 操作 redis 的数据,基本是在妥妥的操作内存,必须快

Redis 可以持久化吗?可以的话,持久化的方式有哪些?

可以持久化,有 2 种方式, RDB 和 AOF , redis 默认是支持 RDB 持久化



  • RDB 持久化方式

在指定时间间隔内将内存中的数据集快照写入到磁盘中,这就是快照 snapshot ,恢复快照的时候,是把快照文件读入到内存中。

redis 通过 fork 的方式创建一个子进程来专门做持久化的动作

优势



  • 适合大规模的数据恢复
  • 对数据的完整性要求不高

劣势



  • 需要在一定的时间间隔进行操作,如果 redis 意外宕机,最后一次写入的数据就会丢失
  • fork 子进程的时候需要占用一定的空间


  • AOF 持久化方式

AOF 是 redis 的另外一种持久化方式,以日志的形式记录每一个写操作,将 redis 执行过的写操作全部记录下来,只允许追加文件,不允许改写文件

优势



  • 每一次操作 reids 都会被记录,文件的完整性好
  • 每秒同步一次,可能会丢失一秒的数据
  • 从不同步,这个效率是最高的

劣势



  • 相对于数据文件来说,aof 文件会远大于 rdb 文件,修复的速度也比 rdb 文件慢
  • aof 运行的效率比 rdb 慢,所以 redis 默认的配置是 rdb 持久化

Redis 应用场景有哪些嘞?



  • 简单的消息队列

简单的消息队列做发布订阅的功能,使用到 redis 中 List 数据结构,可以通过 lpush 和 rpop 写入和读取消息,这个仅仅适用于简单的消息队列,如果数据量大,要求数据一致性,性能要好等等,当然首选专业的消息队列组件



  • 用于缓存

将经常需要访问的数据访问 redis 中,并且要设置好 redis 的内存最大限制和删除 key 的策略



  • 用于计数器

例如网页访问量,点赞量等等,redis 支持自增和自减操作,数据都是在内存中,很适合做计数



  • 做分布式锁

redis 自带的命令 SETNX ,天然可以做分布式锁,用于管控多个节点的有序运行,当然 redis 自己也提供了 RedLock 给大家使用



RedLock 是个啥

Redis 官方站提供的基于 Redis 实现分布式锁的方式,它有如下特性:



  • 容错性

只要大部分 Redis 节点存活就可以正常提供服务



  • 安全特性

RedLock 是互斥访问的,永远只有一个 redis 客户端能拿到锁,执行操作



  • 避免死锁

最终 redis 客户端都可能拿到锁,不会出现死锁的情况




  • 做排行榜

使用 zset 做排行榜,top xx 等应用



  • 做共同关注,做发现身边的好友

redis 提供集合 set ,可以计算出共同的好友,共同的兴趣,等等应用


Redis 的删除过期的 key 是如何处理的?

有 3 种方式:



  • 定时过期

定时过期,就是每当设置一个 key 的时候,都给这个 key 设置对应的定时器,当这个 key ttl 到期时,就将这个 key 删除掉

每个 key 都设置了过期时间就要弄一个定时器,这样非常消耗 cpu 资源,进而影响 redis 性能



  • 定期过期

定期过期,就是设置每隔一段时间,扫描 redis 中设置过期时间的 key,并且删除掉其中已经过期的 key。



  • 惰性过期

惰性过期,就是每当访问这个 key 的时候,才去判断这个 key 是否失效,失效就删掉,若不访问,则这个 key 就一直存在内存中,会占用大量的内存


Redis 事务的本质是什么?

就是一组命令的集合,一个事务中所有的命令都会被序列化,在事务执行的过程,是按照顺序执行命令的,他们拥有



  • 一次性
  • 顺序性
  • 排他性

redis 的事务没有隔离级别的概念

redis 事务中,命令是这样执行的

命令放在事务中,并没有马上执行,而是发起执行命令的时候才会执行,通过 exec 触发

redis 是单条指令保证原子性,但是事务不保证原子性

执行一个事务的流程是这个样子的:



  • multi 开启事务
  • 各种命令入队
  • exec 执行事务

事务的 ACID 分别指的是什么?



  • Atomicity 原子性

原子性指的是,事务是一个不可分割的整体,要么一起成功,要么一起失败



  • Consistency 一致性

执行事务前和执行事务后,数据的完整性都必须保持一致



  • Isolation 隔离性

多个事务同时在处理的时候,互不干扰,互补影响,各玩各的



  • Durability 持久性

指的是,事务一旦被提交,那么影响的数据是持久性的


Redis 主从复制的原理是什么?

Slave 启动成功连接到 master 后会发送一个 sync 命令

master 收到命令后,启动后台存盘进程,同时收集所有接收到用于修改数据库集命令,在后台进程执行完毕后,master 进程将传送整个数据文件给到 slave ,并完成一次同步

全量复制

slave 服务接收到 master 传过来的数据后,将其存盘并加载到内存

增量复制

master 将新的收集到的所有修改的命令依次传递给 slave ,并完成同步

一旦重新连接 master 节点,一次完全的全量同步就会被执行


哨兵模式是干啥的?

哨兵模式,主要是用于实现 redis 集群的高可用

因为使用主从复制的方式,当 redis 主机宕机时,没有办法选举出一个主机出来,哨兵模式可以

哨兵的作用



  • 通过发送命令,Redis 服务器返回监控状态信息,包括主服务器和从服务器的
  • 若哨兵检测到主服务器宕机,会自动将slave 切换 master,然后通过发布订阅通知其他从服务器,修改配置文件,让他成为主机

主观下线

如果 master 服务器宕机了,那么其中一个哨兵就会检测到,系统并不会马上执行 failover 的过程,仅仅是当前这个哨兵,判断 master 不可用,这个就是主观下线

客观下线

集群中一般哨兵也是集群的,若部署了 3 个哨兵

当其他两个哨兵也发现 master 服务器不可用的时候,那么哨兵之间就会产生投票,具体的投票算法我们后续再写,投票的结构由一个哨兵发起,进行 failover 故障转移的操作,切换成功之后,就会通过发布订阅模式,让每一个监控的哨兵把自己监控的服务器切换到这个 master 服务器上, 这个就是 客观下线

redis 的 穿透,击穿,雪崩问题可以查看上一篇文章:【Redis 系列】redis 学习十二,redis 缓存穿透,缓存击穿,缓存雪崩

参考资料:

redis_doc


欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~




推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • 本文介绍了在Android设备上使用命令行来抓取log文件的方法,包括检查设备连接、清除log缓存、选择存放目录、运行程序等步骤,最后可以在桌面上生成log文件。 ... [详细]
author-avatar
qwqwd
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有