深度学习面试八股文之Redis篇

  • 3.bitmap: bitmap 就是通过最小的单位 bit 来进行0或者1的设置,表示某个元素对应的值或者状态。一个 bit 的值,或者是0,或者是1;也就是说一个 bit 能存储的最多信息是2。bitmap 常用于统计用户信息比如活跃粉丝和不活跃粉丝、登录和未登录、是否打卡等

3.redis为什么这么快?


官方数据 redis 可以做到每秒近10w的并发,这么快的原因主要总结为以下几点:

  • 1:完全基于内存操作

  • 2:使用单线程模型来处理客户端的请求,避免了上下文的切换

  • 3:IO 多路复用机制

  • 4:自身使用 C 语言编写,有很多优化机制,比如动态字符串 sds

4.听说 redis 6.0之后又使用了多线程,不会有线程安全的问题吗?


不会

其实 redis 还是使用单线程模型来处理客户端的请求,只是使用多线程来处理数据的读写和协议解析,执行命令还是使用单线程,所以是不会有线程安全的问题。

之所以加入了多线程因为 redis 的性能瓶颈在于网络IO而非CPU,使用多线程能提升IO读写的效率,从而整体提高redis的性能。

5.redis 的持久化机制有哪些?优缺点说说


redis 有两种持久化的方式,AOF 和 RDB.

AOF:

  • redis 每次执行一个命令时,都会把这个「命令原本的语句记录到一个.aod的文件当中,然后通过fsync策略,将命令执行后的数据持久化到磁盘中」(不包括读命令),

AOF的优缺点

  • AOF 的「优点」:

  • 1.AOF可以「更好的保护数据不丢失」,一般AOF会以每隔1秒,通过后台的一个线程去执行一次fsync操作,如果redis进程挂掉,最多丢失1秒的数据

  • 2.AOF是将命令直接追加在文件末尾的,「写入性能非常高」

  • 3.AOF日志文件的命令通过非常可读的方式进行记录,这个非常「适合做灾难性的误删除紧急恢复」,如果某人不小心用 flushall 命令清空了所有数据,只要这个时候还没有执行 rewrite,那么就可以将日志文件中的 flushall 删除,进行恢复

  • AOF 的「缺点」:

  • 1.对于同一份数据源来说,一般情况下AOF 文件比 RDB 数据快照要大

  • 2.由于 .aof 的每次命令都会写入,那么相对于 RDB 来说「需要消耗的性能也就更多」,当然也会有 aof 重写将 aof 文件优化。

  • 3.「数据恢复比较慢」,不适合做冷备。


RDB:

  • 某个时间点 redis 内存中的数据以二进制的形式存储的一个.rdb为后缀的文件当中,也就是「周期性的备份redis中的整个数据」,这是redis默认的持久化方式,也就是我们说的快照(snapshot),是采用 fork 子进程的方式来写时同步的。

RDB的优缺点

  • RDB的优点:

  • 1.它是将某一时间点redis内的所有数据保存下来,所以当我们做「大型的数据恢复时,RDB的恢复速度会很快」

  • 2.由于RDB的FROK子进程这种机制,队友给客户端提供读写服务的影响会非常小

  • RDB的缺点:

  • 1:「有可能会产生长时间的数据丢失」

  • 举个例子假设我们定时5分钟备份一次,在10:00的时候 redis 备份了数据,但是如果在10:04的时候服务挂了,那么我们就会丢失在10:00到10:04的整个数据

  • 2:可能会有长时间停顿:我们前面讲了,fork 子进程这个过程是和 redis 的数据量有很大关系的,如果「数据量很大,那么很有可能会使redis暂停几秒」

6. Redis的过期键的删除策略有哪些?


过期策略通常有以下三种:

  • 定时过期每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。

  • 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。

  • 定期过期每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。

7. Redis的内存满了怎么办?


实际上Redis定义了「8种内存淘汰策略」用来处理redis内存满的情况:

  • 1.noeviction:直接返回错误,不淘汰任何已经存在的redis键

  • 2.allkeys-lru:所有的键使用lru算法进行淘汰

  • 3.volatile-lru:有过期时间的使用lru算法进行淘汰

  • 4.allkeys-random:随机删除redis键

  • 5.volatile-random:随机删除有过期时间的redis键

  • 6.volatile-ttl:删除快过期的redis键

  • 7.volatile-lfu:根据lfu算法从有过期时间的键删除

  • 8.allkeys-lfu:根据lfu算法从所有键删除

8.Redis 的热 key 问题怎么解决?


热 key 就是说,在某一时刻,有非常多的请求访问某个 key,流量过大,导致该 redi 服务器宕机

解决方案:

  • 可以将结果缓存到本地内存中

  • 将热 key 分散到不同的服务器中

  • 设置永不过期

9.缓存击穿、缓存穿透、缓存雪崩是什么?怎么解决呢?


缓存穿透:

  • 缓存穿透是指用户请求的数据在缓存中不存在并且在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍,然后返回空。

解决方案:

  • 布隆过滤器

  • 返回空对象

缓存击穿:

  • 缓存击穿,是指一个 key 非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个 key 在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

解决方案:

  • 互斥锁

  • 永不过期

缓存雪崩:

  • 缓存雪崩是指缓存中不同的数据大批量到过期时间,而查询数据量巨大,请求直接落到数据库上导致宕机。

解决方案:

  • 均匀过期

  • 加互斥锁

  • 缓存永不过期

  • 双层缓存策略

10.Redis 有哪些部署方式?


  • 单机模式:这也是最基本的部署方式,只需要一台机器,负责读写,一般只用于开发人员自己测试

  • 哨兵模式:哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。它具备自动故障转移、集群监控、消息通知等功能。

  • cluster集群模式:在redis3.0版本中支持了cluster集群部署的方式,这种集群部署的方式能自动将数据进行分片,每个master上放一部分数据,提供了内置的高可用服务,即使某个master挂了,服务还可以正常地提供。

  • 主从复制:在主从复制这种集群部署模式中,我们会将数据库分为两类,第一种称为主数据库(master),另一种称为从数据库(slave)。主数据库会负责我们整个系统中的读写操作,从数据库会负责我们整个数据库中的读操作。其中在职场开发中的真实情况是,我们会让主数据库只负责写操作,让从数据库只负责读操作,就是为了读写分离,减轻服务器的压力。

11.哨兵有哪些作用?


  • 1.监控整个主数据库和从数据库,观察它们是否正常运行

  • 2.当主数据库发生异常时,自动的将从数据库升级为主数据库,继续保证整个服务的稳定

12.哨兵选举过程是怎么样的?


  • 1.第一个发现该master挂了的哨兵,向每个哨兵发送命令,让对方选举自己成为领头哨兵

  • 2.其他哨兵如果没有选举过他人,就会将这一票投给第一个发现该master挂了的哨兵

  • 3.第一个发现该master挂了的哨兵如果发现由超过一半哨兵投给自己,并且其数量也超过了设定的quoram参数,那么该哨兵就成了领头哨兵
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
g" alt=“img” style=“zoom: 33%;” />

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

[外链图片转存中…(img-MejglvEF-1713749627662)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 19
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis面试八股文主要包括以下几个方面: 1. Redis的特点和优势:Redis是一个高性能的非关系型键值对数据库,其数据存储在内存中,读写速度非常快。它支持多种数据类型,包括String、Hash、List、Set、ZSet等,还支持持久化和事务操作。此外,Redis还支持主从复制和单线程的命令处理,具有较好的性能和可扩展性。 2. Redis的数据结构和常用命令:Redis提供了多种数据结构,如字符串、哈希表、列表、集合和有序集合,并提供了相应的命令进行操作。例如,使用SET命令可以设置字符串值,使用HSET命令可以设置哈希表字段值,使用LPUSH命令可以将元素插入列表的头部等。 3. Redis的持久化机制:Redis支持RDB和AOF两种持久化机制。RDB是将当前数据集的快照保存到磁盘上,而AOF则是通过追加方式记录每个写操作到日志文件中。这两种机制可以保证数据的安全性和可恢复性。 4. Redis的主从复制:Redis通过主从复制实现数据的备份和读写分离。主节点将数据同步到从节点,从节点可以处理读操作,从而提高系统的并发处理能力和可靠性。 5. Redis的高可用性和集群模式:为了提高Redis的可用性,可以通过搭建Redis集群来实现数据的分布和负载均衡。Redis集群使用分片的方式将数据分散到多个节点上,并通过Gossip协议实现节点间的通信和数据同步。 6. Redis的性能优化和调优:为了提升Redis的性能,可以通过配置合适的缓存大小、使用合理的数据结构、优化命令使用方式等手段进行性能优化和调优。 7. Redis的高可靠性和数据一致性:为了保证Redis的高可靠性和数据一致性,可以通过配置合理的主从复制和持久化方式,并使用合适的监控和告警系统进行监控和故障处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值