Redis常见面试问题

46道史上最全Redis面试题,面试官能问的都被我找到了(含答案) 因为 bgsave 会消耗比较长的时间,不够实时,在停机的时候会导致大量的数据丢失,需要 aof 来配合,在 redis 实例重启时,优先使用 aof 来恢复内存的状态,如果没有 aof 日志,就会使用 rdb 文件来恢复。网络模型,memcache 使用非阻塞的 IO 复用模型,redis 也是使用非阻塞的 IO 复用模型,但是 redis 还提供了一些非 KV 存储之外的排序,聚合功能,复杂的 CPU 计算,会阻塞整个 IO 调度,从这点上由于 redis 提供的功能较多,memcache 更快些。.. 阅读详情

Redis 有哪些数据类型

  • String字符串:可以是字符串,整数或者浮点数,整数和浮点数可执行自增操作:incr key,整数自增可以用来实现全局唯一id的生成。String是最常用的一种类型,以key-value形式存在于内存中。
  • List列表:底层采用链表或者ziplist实现,里面的元素可重复。可以用来存储一些按时间顺序的消息显示.
  • Set集合:底层采用hashtable或者intset实现。不能有重复元素。可用来执行交集,并集,差集等。可用来实现获得共同好友等功能
  • Zset有序集合:底层采用ziplist或者skiplist来实现。集合内元素有序且无重复,由于集合内元素带有权重属性,可用来实现排行榜等功能。
  • Hash散列:底层采用ziplist或者hashtable实现。可以用来存储复杂对象。

详见:redis设计与实现读书笔记——底层数据结构

Redis 持久化机制

  • RDB:RDB持久化既可以手动执行也可以根据服务器配置选项定期执行,手动执行有两种命令:
  1. BGSAVE:派生出一个子进程,然后由子进程负责创建RDB文件,父进程继续处理命令请求。
  2. SAVE:阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求

自动间隔性保存配置,若提供以下配置:

Save 900 1

Save 300 10

Save 60 1000

只要满足以下三个条件中的任意一个,BGSAVE命令就会被执行:

服务器在900秒之内,至少执行了一次修改;服务器在300秒之内至少执行了10次修改,服务器在60秒之内至少进行了1000次修改。

原理:服务器状态的数据结构中保存了dirty(距离上一次成功执行SAVE或者BGSAVE命令后,服务器对数据库状态进行了几次更改),lastsave(记录上次成功执行SAVE或BGSAVE命令的时间),每100ms统计一次currenttime-lastsave和dirty大小,如果同时满足条件之一,则执行BGSAVE命令。

  • AOF:通过保存Redis服务器所执行的写命令来记录数据库状态。

服务器每次结束一个事件循环之前都会调用flushAppendOnlyFile函数,考虑是否需要将aof_buf缓冲区中的内容写入和保存到AOF文件中,其行为取决于appendfsync:

  1. Always:将aof_buf缓冲区中的所有内容写入并同步AOF文件
  2. No:将aof_buf缓冲区中的所有内容写入AOF文件,不进行同步操作,何时同步由操作系统来决定。
  3. Everysec:将aof_buf缓冲区中的所有内容写入AOF文件,如果上次同步AOF文件的时间距离现在超过1s,则对其进行同步

Redis 为什么是单线程的

 Redis客户端对服务端的每次调用都经过了服务端接收客户端命令-执行命令-返回结果三个过程,redis的单线程指的是执行命令过程使用单个线程执行。多个客户端并发请求执行的命令会被放在队列里依次执行。因为CPU不是redis的瓶颈,由于redis命令基本都是纯内存操作,每个命令都执行的很快,单线程实现简单且避免了线程切换和竞态的消耗,所以选择了单线程实现。如果CPU成为redis瓶颈了,可以使用多开几个redis进程搭建集群。

使用缓存的合理性问题

  1. 缓存雪崩:redis服务器出现故障,所有请求到达数据库层,数据库崩溃。
  2. 缓存穿透:伪造请求恶意攻击缓存,即发送大量请求查找不存在于缓存种的数据,缓存被穿透就会访问数据库,会对数据库造成很大压力甚至崩溃。解决方案:将不存在的数据也缓存起来或者使用布隆过滤器过滤恶意请求。
  3. 缓存预热:redis服务器开机时,直接加载热点数据。
  4. 缓存更新:数据库被更新时,缓存需要被同步更新
  5. 缓存降级:为了防止redis服务器出现故障时,数据库跟着崩溃。如果无法通过redis获得请求数据,直接返回默认数据而不请求数据库。
  6. 热点数据才有必要被缓存
  7. 对每个键设置失效时间
  8. 经常修改的数据不应该被放入缓存

Redis常见的回收策略

Redis数据量达到设定的最大内存时,需要驱逐数据,有以下6种策略。

  1. Noeviction:不删除策略,如果存达到使用上线,则报错
  2. Allkeys-lru:对所有的key,使用lru算法回收最近最少使用的键。
  3. Volatile-lru:对设置了过期时间的key,使用lru算法回收最近最少使用的键。
  4. Allkeys-random:对所有key,随机回收部分key
  5. Volatile-lru:对设置了过期时间的key,随机回收部分key
  6. Volatile-ttl:对设置了过期时间的key,回收剩余存活时间最短的key

对于volatile-*策略,如果数据库种没有设置过期时间的key,则基本与noevinction策略相同。

Redis过期策略是怎么实现的呢

  • 定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。对内存友好,对CPU不友好。通过无序链表维护时间事件,遍历链表寻找到期的时间事件,执行删除键操作
  • 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;否则,返回该键。对cpu友好,对内存不友好。
  • 定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。设置每次检查的数据库数量n和每个数据库检查的键数量k,数据库通过遍历方式访问,访问到当前数据库时,每次随机抽取一个键,如果过期则删除,共抽取k次,然后访问下一个数据库。若过程中达到了时间上限,则停止删除,下次再从停止的数据库开始。

Redis集群方案与实现

redis官方的redis-cluster:使用hash slot方式,将16348个hash slot 覆盖到所有节点上。对于存储的每个key值,使用CRC16(KEY)&16348=slot得到他对应的hash slot。在访问key时就去找他的hash slot在哪一个节点上,然后由当前访问节点从实际被分配了这个hash slot的节点去取数据。节点之间使用轻量协议通信,减少带宽占用,性能很高,自动实现负载均衡与高可用,自动实现failover  并且支持动态扩展。官方已经玩到可以1000个节点 实现的复杂度低。

由于redis选举机制,每个redis集群至少需要三个主节点;要保证集群的高可用,每个主节点都至少需要配备一个从节点。所以一共至少需要6个节点。

将一个节点加入集群:CLUSTER MEET <ip> <port>

将槽指派给节点负责:CLUSTER ADDSLOTS <slot> [slot…]

当客户端向节点发送与数据库键有关的命令时,接收命令的节点会计算出命令要处理的数据库属于哪个槽,并检查这个槽是否指派给了自己:如果键所在的槽刚好指派给当前节点,那么节点直接执行这个命令;否则,节点向客户端返回一个MOVED错误,指引客户端转向正确的节点,并再次发送之前想要执行的命令。

详见:redis设计与实现读书笔记——集群

Redis复制的过程

复制分为同步和命令传播两个操作:同步操作用于将从服务器的数据库状态更改至主服务器当前所处的数据库状态;命令传播操作则用于在主服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态。

  • 同步:客户端向从服务器发送SALVEOF命令要求从服务器复制主服务器时,从服务器首先需要执行同步操作。
  1. 从服务器向主服务器发送SYNC命令。
  2. 收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有命令。
  3. 当主服务的BGSAVE命令执行完毕时,主服务器会将BG命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态。
  4. 主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库更新至主服务器当前的状态。
  • 命令传播:主服务器将收到的写命令传播给从服务器。

详见:redis设计与实现读书笔记——复制

redis面试常见问题 文章目录为什么要用 Redis/为什么要用缓存?Redis 常见数据结构以及使用场景分析1.String2.Hash3.List4.Set5.Sorted SetRedis 事务缓存穿透什么是缓存穿透?缓存穿透情况的处理流程是怎样的?有哪些解决办法?缓存雪崩什么是缓存雪崩?有哪些解决办法?如何解决 Redis 的并发竞争 Key 问题如何保证缓存与数据库双写时的数据一致性? 为什么要用 Redis/为什么要用缓存? 简单,来说使用缓存主要是为了提升用户体验以及应对更多的用户。 下面我们主要从“高性能”和“高 阅读详情

相关推荐

仿真每日一练 | 有限元模态分析详解

结构的振动一直是工业领域产品分析的重点,在振动的仿真分析中,模态分析是其最基本的分析类型,通过研究结构的固有频率和振型对产品的设计提供指导。2.2、在interaction模块,通过special->Spring,在各点之间分别创建弹簧单元,弹簧刚度为1000。2.1、在interaction模块,创建两个RP点,与两侧RP点各间隔100大小,如图3所示;其中M、K、C均为n*n的矩阵,s、x、v为n*1的矢量,n为系统自由度数量。3、在Assembly模块创建装配体,两点之间的距离为100,如图2所示;

ansysxuexizhe的博客 1655

【万字长贴】redis知识点整理

附上了高清知识图谱

GitChat 954

Ubuntu服务器通过IPV6端口转发搭建幻兽帕鲁私服实战

本文详细介绍了在Ubuntu服务器上通过IPV6端口转发搭建幻兽帕鲁私服的完整教程。针对只有公网IPV6地址的服务器环境,提供了从硬件检查、端口转发工具配置到游戏服务器安装的全流程解决方案,帮助玩家轻松实现多人联机游戏体验。

weixin_30652491的博客 490

精选 21道 Redis 最常问面试题!收藏一波 !

redis是一个高性能的key-value数据库,它是完全开源免费的,而且redis是一个NOSQL类型数据库,是为了解决高并发、高扩展,大数据存储等一系列的问题而产生的数据库解决方案,是一个非关系型的数据库。...

w915209092的博客 5649

Unity UI Toolkit避坑指南:从官方Samples到实际项目,这些‘坑’我帮你踩过了

本文分享了Unity UI Toolkit在实际项目中的避坑经验和优化技巧,包括动画系统的高效替代方案、3D世界UI的创新实现方式、USS样式继承的反直觉规则等。通过详细的代码示例和性能优化策略,帮助开发者避免常见陷阱,提升开发效率。

weixin_29535577的博客 343

RDkit入门

今天开始写RDkit的入门教程,每天学习和写一小点,相信一句话“不积跬步无以至千里,不积小流无以成江海”,所以就慢慢来,一点一滴积累叭,从最简单的开始喽希望自己每天都能保持写博客的好习惯,把自己的代码笔记就极在这里,RDkit一块啃了很久的骨头,今天终于要下定决心,好好总结一波了,希望保持这个更新的频率,每天都能有所学。............

博客而已 6684

关于Redis的最常见的十道面试题

一共十道关于Redis的常见面试题,都是比较容易疏忽并且面试的时候,经常会考到的面试题,文章中有详细的解释和底层原理来帮助你更好的来理解面试题!!!

loss_rose777的博客 4万+

税务某局 webpack 登录接口逆向分析

我们再回到接口逻辑去看一下,发现每次请求前,还有两个接口,getpublickey和sendsm4,这里分析了一下调用逻辑,sm4这个接口用到一个参数是由publickey返回的一个参数而来,这个参数又经过内部加密处理,我们找到这个参数加密的地方,大概是在这个位置。我们还是顺着逻辑将加载器扣下来,然后用一个变量去接收,有了加载器,我们直接把加密代码扣下来做下处理,把一些用到的参数整理下如下。打上断点分析后,_utils_getuuid这个很长的变量也是加载器的一个函数,我们将这段代码也扣下来,如下。

码王吴彦祖的博客 402

Redis常见面试问题汇总

Redis基础 Redis面试八股文

weixin_52242569的博客 1079

2025.05.29【Network】多组学分析:网络互作图绘制

本文介绍了使用R语言进行网络图绘制的方法与技巧。重点讲解了三个核心R包的使用:igraph用于网络图数据准备与基础绘制,ggraph基于图形语法实现高级可视化,networkD3则为网络图添加交互功能。文章涵盖了从基本概念、包安装、创建网络图对象,到自定义样式布局、添加交互性等完整流程,并提供了度分布、聚类系数等网络分析指标的计算方法。通过清晰的代码示例,帮助读者掌握生物信息学数据可视化的关键技能,为复杂数据的直观展示和分析提供实用工具。

227

linux系统下XDMA驱动的安装与测试问题总结

先看两个常见的问题。一个是驱动安装问题,一个是驱动测试错误;error 512 能识别PCIE的设备,但是The kernel modle installed correctly, but no devices were recognized.

whm128的博客 3806

Redis面试常见问题——使用场景问题

布隆过滤器主要是用于检索一个元素是否在一个集合中。我们当时使用的是Redisson实现的布隆过滤器。它的底层原理是,先初始化一个比较大的数组,里面存放的是二进制0或1。一开始都是0,当一个key来了之后,经过3次hash计算,模数组长度找到数据的下标,然后把数组中原来的0改为1。这样,三个数组的位置就能标明一个key的存在。查找的过程也是一样的。布隆过滤器有可能会产生一定的误判,我们一般可以设置这个误判率,大概不会超过5%。其实这个误判是必然存在的,要不就得增加数组的长度。

m0_74197695的博客 1013

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java开发面试中关于redis常见的2个问题

理解RDB和AOF的机制、优缺点以及如何根据业务需求(对数据丢失的容忍度、性能要求、备份策略)进行组合配置,是评估候选人是否具备Redis实战经验的重要方面。同时启用RDB和AOF是生产环境下的常见且推荐的做法。Redis凭借其高性能、丰富的数据结构和易用性,在Java应用中扮演着越来越重要的角色,尤其是在提升性能、实现分布式协作方面。

weixin_45706752的博客 1801

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Redis常见面试问题总结

Redis常见面试问题及分析

雨田说码 5923

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Redis缓存常见面试问题

水墨青 2655

Redis 面试指南:常见问题及最佳答案

为了保证事务的原子性,Redis 在执行事务期间会将所有被事务影响的键值对放入一个队列中,并在事务执行成功后一次性提交到数据库中。RDB 是将 Redis 数据库中的数据快照保存到硬盘上,而 AOF 则是将 Redis 中所有的写操作追加到一个文件中。本文将总结 Redis 面试中常见的问题,并提供最佳答案,以帮助读者更好地准备 Redis 面试。Redis 是一个内存型的键值存储系统,支持多种数据结构(如字符串、哈希表、列表、集合等),并且支持事务和持久化。5. Redis 支持的事务机制是什么?

qq_33665793的博客 886

Redis常见面试问题分析

说说你对Redis的了解? Redis(Remote Dictionary Server)是一个基于C语言编写的内存数据库,基于Key/Value结构存储数据,读写速度很快,一般会用来做缓存、消息队列,分布式锁,同时还支持事务 、持久化、集群等。 说说Redis中的数据类型? 常见的有五种基本数据类型和三种特殊数据类型,基本数据结构:String、 list、set、zset和hash,三种特殊数据类型:位图(bitmaps) 、计数器(hyperloglogs)和地理空间(geospatial index

雨田说码 5461

Redis面试常见问题

Redis面试常见问题

制定持续可量化的目标,不断坚持。 1363

Redis的那些最常见面试问题【转】

Redis的那些最常见面试问题 转自https://www.cnblogs.com/Survivalist/p/8119891.html   随笔:经过长达一周的奔波和面试,电话面试,回首今天终于成功的入职了,总共面试了大概10家公司,包括阿里,京东,IBM等等,京东技术过了,学历因为非统招就被pass了,阿里面了2次电话面试就没下文了,估计是我当时最后提问题的时候减分了吧,其他的也有一些of...

GUARDIANONE的博客 313

Redis面试常见问题及解决方案

redis常见面试问题-缓存 穿透 击穿 雪崩及分布式锁

10年老JAVA大数据技术人的专栏 437

Redis的那些最常见面试问题

 随笔:经过长达一周的奔波和面试,电话面试,回首今天终于成功的入职了,总共面试了大概10家公司,包括阿里,京东,IBM等等,京东技术过了,学历因为非统招就被pass了,阿里面了2次电话面试就没下文了,估计是我当时最后提问题的时候减分了吧,其他的也有一些offer,不是不想去,就是了无音讯了,眼看年关将近,也由不得我挑挑拣拣了,就直接进了我现在这家公司,主要是感觉公司人不错,薪水这方面也就没有计较太...

weixin_30364325的博客 63
上一篇: spring容器加载过程
下一篇: 2018java准备过的面试题(一)java基础
CCCCC_SSSSS
博客等级 码龄10年 3粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值