redis最全面试题

Redis面试题汇总 什么是Redis? ​Redis 是一个使用 C 语言开发的 非关系型 数据库,Redis 的数据是存在内存中的,读写速度非常快。Redis 经常用来做缓存、分布式锁,消息队列。Redis 支持多种数据类型,事务 持久化、Lua 脚本、多种集群方案。 什么是分布式缓存? ​分布式缓存主要解决的是单机缓存的容量受服务器限制并且无法保存通用的信息。因为,本地缓存只在当前服务里有效,比如如果你部署了两个相同的服务,他们两者之间的缓存数据是无法共享的。主要的技术是 Memcached 和 Redis。 .. 阅读详情

1、redis使用的是单线程为什么还这么快

  •  redis是基于内存操作的读写快
  • redis使用的io多路复用的内存模型
  • 单线程好处减少多线程之间切换带来的资源消耗 2 

2、redis的数据结构及其使用场景       

   string,hash,list,set,sortset                  

    string是以一种纯字符串作为value的形式存在的。也是这几种之中使用最多的数据结构。value可以存储json格式、数值型等。

string使用场景            

    string使用场景一般是存储简单的键值类型。比如用户信息,登录信息,配置信息等。还有一种用得比较多的是string的incr/decr操作,即自减/自增操作。调用它是原子性的,无论调用多少次,都一一计算成功。例如需要增减库存的操作。

尽管string的value可以存储很大,甚至500多MB的容量。但是在性能上来说,我们尽量存储value的值不要过1MB。

    hash是一个集合,使用过hash的人都知道,hash的读取性能都一样快。在redis中,hash因为是一个集合,所以有两层。第一层是key:hash集合value,第二层是hashkey:string value。所以判断是否采用hash的时候可以参照有两层key的设计来做参考。并且注意的是,设置过期时间只能在第一层的key上面设置。

hash使用场景                         

    使用hash,一般是有那种需要两层key的应用场景,也可以是‘删除一个key可以删除所有内容’的场景。例如一个商品有很多规格,规格里面有不同的值。

   如果需要删除商品时,可以一次性删除‘商品id’的key,则商品里面的所有规格也会删除,而不需要找到对应的规格再做处理。如果查找商品id与规格id1的商品时,则通过两个key查找即可。或者查找所有商品的规格,查找商品id即可。

    需要注意的是,经过测试,在性能上来说一般hash里面的第二层key,不要超过200个为佳。尽管hash里面的key-value能达到500多MB的存储容量。

 

  list是一个集合,而在redis中,list的使用场景多种多样。在redis中,插入list中的值,只需要找到list的key即可,而不需要像hash一样插入两层的key。list是一种有序的、可重复的集合。

list使用场景                       

    list可以使用左推、左拉、右推、右拉的方式。所以你可以使用list作为集合存储,比如存储某宝商铺里面的所有商品。

    也可以用作轻量级别的队列来使用。左推左拉、右推右拉。

   需要注意的是尽管redis可以使用推拉的队列模式,但是一定要注意场景。因为redis的队列是一种轻量级别的,没有队列重试、队列重放机制。消费完队列消息在redis代表已经删除了。

消息队列之发布订阅模式           

    redis除了list的推拉队列模式之外,还有一种是发布订阅的模式。发布订阅模式有是publish/subscribe的命令。与推拉队列模式不同之处在于,订阅者可以订阅多个频道,发布者可以向指定的频道或者所有频道发送消息。

    之所以在上面的list中结束这种队列模式,主要为了对比这两种的区别。

3、redis持久化方式

   1、redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化)

       RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。

        ①、redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件。正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的。
        ②、对于RDB方式,redis会单独创建(fork)一个子进程来进行持久化,而主进程是不会进行任何IO操作的,这样就确保了redis极高的性能。
        ③、如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。

   2、另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)。

       ①、AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.默认的AOF持久化策略是每秒钟fsync一次(fsync是指把缓存中的写指令记录到磁盘中),因为在这种情况下,redis仍然可以保持很好的处理性能,即使redis故障,也只会丢失最近1秒钟的数据。
如果在追加日志时,恰好遇到磁盘空间满、inode满或断电等情况导致日志写入不完整,也没有关系,redis提供了redis-check-aof工具,可以用来进行日志修复。
   ②、因为采用了追加方式,如果不做任何处理的话,AOF文件会变得越来越大,为此,redis提供了AOF文件重写(rewrite)机制,即当AOF文件的大小超过所设定的阈值时,redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。举个例子或许更形象,假如我们调用了100次INCR指令,在AOF文件中就要存储100条指令,但这明显是很低效的,完全可以把这100条指令合并成一条SET指令,这就是重写机制的原理。
    ③、在进行AOF重写时,仍然是采用先写临时文件,全部完成后再替换的流程,所以断电、磁盘满等问题都不会影响AOF文件的可用性。

preview

4、过期键删除策略

  • 定时删除:在设置键的过期时间的同时,创建一个定时器(timer ),让定时器在键的过期时间来临时,立即执行对键的删除操作。
  • 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
  • 定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。

5、内存淘汰机制

最大内存的设置是通过设置maxmemory来完成的,格式为maxmemory bytes ,当目前使用的内存超过了设置的最大内存,就要进行内存释放了, 当需要进行内存释放的时候,需要用某种策略对保存的的对象进行删除。Redis有六种策略(默认的策略是volatile-lru)。

redis中当内存超过限制时,按照配置的策略,淘汰掉相应的key-value,使得内存可以继续留有足够的空间保存新的数据。redis 确定驱逐某个键值对后,会删除这个数据并,并将这个数据变更消息发布到本地(AOF 持久化)和从机(主从连接)。

  1. volatile-lru:使用LRU算法进行数据淘汰(淘汰上次使用时间最早的,且使用次数最少的key),只淘汰设定了有效期的key ;
  2. allkeys-lru:使用LRU算法进行数据淘汰,所有的key都可以被淘汰;
  3. volatile-random:随机淘汰数据,只淘汰设定了有效期的key;
  4. allkeys-random:随机淘汰数据,所有的key都可以被淘汰;
  5. volatile-ttl:淘汰剩余有效期最短的key;
  6. no-enviction:不删除任意数据(但redis还会根据引用计数器进行释放),这时如果内存不够时,会直接返回错误 

一、LRU数据淘汰机制

在服务器配置中保存了 lru 计数器 server.lrulock,会定时(redis 定时程序 serverCorn())更新,server.lrulock 的值是根据 server.unixtime 计算出来的。

另外,从 struct redisObject 中可以发现,每一个 redis 对象都会设置相应的 lru。可以想象的是,每一次访问数据的时候,会更新 redisObject.lru。

LRU 数据淘汰机制是这样的:

在数据集中随机挑选几个键值对,取出其中 lru 最小的键值对淘汰。所以,你会发现,redis并不是保证取得所有数据集中最近最少使用(LRU)的键值对,而只是随机挑选的几个键值对中的。

二、TTL数据淘汰机制

redis 数据集数据结构中保存了键值对过期时间的表,即 redisDb.expires。和 LRU 数据淘汰机制类似。

TTL 数据淘汰机制是这样的:

从过期时间的表中随机挑选几个键值对,取出其中 ttl 最大的键值对淘汰。同样你会发现,redis并不是保证取得所有过期时间的表中最快过期的键值对,而只是随机挑选的几个键值对中的。

过期键删除策略和内存淘汰机制之间的关系:

  • 过期健删除策略强调的是对过期健的操作,如果有健过期了,而内存还足够,不会使用内存淘汰机制,这时也会使用过期健删除策略删除过期健。
  • 内存淘汰机制强调的是对内存的操作,如果内存不够了,即使有的健没有过期,也要删除一部分,同时也针对没有设置过期时间的健。
最全面的redis常见面试题总结 浅问题全部是博主面试学习过程中总结的。全部手码,如果喜欢或者对你有帮助的话可以点赞加收藏!!! 这篇文章是从易到难来拆解redis的常见面试题的,大家可以依次来看。目录1、redis和mamcached的区别2、redis设置过期时间 expire3、内存淘汰机制 6种4、持久化机制(快照RDB,追加文件AOF)5、缓存雪崩6、缓存穿透7、如何解决redis并发竞争key问题8、缓存与数据库双写时的数据一致性问题9、redis集群过程1、主从复制2、 哨兵3、redis集群 1、redis和mam 阅读详情

相关推荐

Java最全面试题->数据库/中间件->Redis面试题

缓存穿透一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力,就叫做缓存穿透。避免对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。缓存雪崩。

白菜治 1685

Redis学习笔记(3)-Redis事务,过期时间,队列

事务 MULTI表示开启事务 然后执行了2个语句 在执行的过程中,他们并没有真正执行,而是挂起。 等到输入EXEC的时候才会真正的执行。 这样保证了事务的特性,要么都执行,要么都不执行。 请注意,Redis的事务并没有事务回滚功能。 若第一行语句成功,第二行语句出错失败,第一行语句的结果任然是执行了的。 过期时间 过期时间的设置能够让Redis将已经存储的数据,到了过期时间后自动删除。 设置k

恶性佛 5215

Redis面试题(总结最全面的面试题)

什么是Redis?Redis有哪些优缺点?优点缺点使用redis有哪些好处?为什么要用 Redis / 为什么要用缓存高性能:高并发:为什么要用 Redis 而不用 map/guava 做缓存?缓存分为本地缓存和分布式缓存。以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。使用 redis 或 memcached 之类的称为分布式缓存,在多实例的情

q66562636的博客 414

46道史上最全Redis面试题,面试官能问的都被我找到了(含答案)

Redis 的全称是:Remote Dictionary.Server,本质上是一个 Key-Value 类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据 flush 到硬盘上进行保存。因为是纯内存操作,Redis 的性能非常出色,每秒可以处理超过 10 万次读写操作,是已知性能最快的Key-Value DB。

jjc4261的博客 2万+

AI Agent在营销领域的实战策略

本文从第一性原理出发,系统性拆解AI Agent在营销领域的落地逻辑、技术架构、实现方案与实战策略。全文覆盖从基础概念到高级优化的全层级知识:底层理论层面推导营销Agent的效用函数与决策框架;技术架构层面提出"感知-记忆-规划-行动-反思"五组件可落地架构;实践层面提供生产级代码实现、多行业案例与ROI提升方法论;前沿层面探讨多Agent协同、世界模型仿真等下一代技术方向。

操作系统内核探秘的博客 227

MMORPG网络游戏开发之任务系统的架构与设计

在网路游戏中做任务已经成为游戏很重要的一个核心功能和玩法,如何做好一个灵活可扩展的任务系统的架构与设计,今天来给大家分享一些我们的设计经验。接下来我把整个的任务系统分成以下6个模块:对于单机游戏而言,这6个模块都放在客户端直接处理,对于网路游戏而言,模块1~5实现在服务端,模块6实现在客户端。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习unity的零基础小白,也有一些正在从事unity开发的技术大佬,欢迎你来交流学习。...

voidinit的专栏 3049

Redis核心技术深度解析:从单线程模型到分布式锁设计|2023面试必备+实战指南

本文系统剖析Redis核心工作机制与高频面试要点,涵盖:单线程高性能实现原理、渐进式ReHash黑科技、多线程IO演进路线、缓存穿透/雪崩/击穿终极解决方案、分布式锁Redisson看门狗机制、Cluster集群高可用方案等核心技术。通过源码级解析+大厂实战案例,深度讲解Redis在亿级流量场景下的缓存设计范式与性能调优策略,特别适合中高级开发者突破技术瓶颈。附赠:布隆过滤器实现原理、Pipeline性能优化技巧、热key探测方案等进阶内容,助你构建完整的Redis知识体系。

Zyw907155124的博客 2万+

PackML工业标准解析:统一机器状态管理与数据交换的实践指南

在工业自动化与智能制造领域,实现设备间的互联互通与高效协同是核心挑战。这背后依赖于一套标准化的机器行为与数据交换规范,其原理在于通过定义统一的状态模型与接口协议,消除不同厂商设备间的“语言”隔阂。这项技术的核心价值在于大幅降低系统集成复杂度、提升运维效率与生产透明度,是构建数字化工厂的基石。其典型应用场景包括包装机械、离散制造产线等需要多设备协同的领域。本文聚焦的PackML(包装机械语言)标准,正是这一理念的杰出实践,它通过一套严谨的**状态机模型**和**数据标签(PackTags)** 体系,为机器提

weixin_30070339的博客 399

2026全网最硬核Redis面试题(大厂必备)

最近也在面试,所以把面试过程中遇到的面试题都记录下来,跟大家分享一下

qq_40853117的博客 2万+

PCL 模型滤波器【2025最新版】

根据给定的模型系数在点云中提取对应于模型的点云数据。博客长期更新,本文最新更新时间为:2025年6月17日。

点云侠的博客 4384

SpringCloud详细教程(下)

SpringCloud详细教程,springcloud完全教程。Springcloud微服务教程(上)的姊妹篇:介绍了其它SpringCloud组件。

鸟哥哥的专栏 4万+

Redis 最全面试题

Redis 中的事务是一组命令的集合,将一组需要一起执行的命令放到multi和exec两个命令之间。multi 命令代表事务开始,exec命令代表事务结束。它可以保证一次执行多个命令,每个事务是一个单独的隔离操作,事务中的所有命令都会序列化、按顺序地执行。但是要注意Redis的事务功能很弱。在事务回滚机制上,Redis只能对基本的语法错误进行判断。如下,当语法命令错误时,会造成整个事务无法执行,事务内的操作都没有执行:如下,当命令错误时,虽然有异常提示,但是事务执行成功。

z_ssyy的博客 1177

【VS Code插件开发】通用功能(二)

本篇主要从command(命令)、menus(菜单)、快捷键三个方面讲解,都归于通用功能。

编码世界 1万+

Redis 最全面试题及答案

基础 Redis是单线程还是多线程 单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。 Redis 用 TCP 协议 Socket 来监听和读写网络请求,将需要监听的事件放入 Epoll(IO多路复用)事件管理器,然后收集触发的事件并循环一个一个处理进行相应的命令处理。 Redis为什么不使用多线程 Redis 核心就是如果我的...

岁月安然 5507

多agv系统调度的MATLAB仿真

从起点出发,到货物点领取货物最后到卸货点,以完成任务总时间最短为目标进行单目标优化,约束条件为,任务不冲突,路径不冲突,要能实现路径规避 ,4-6台agv一起工作。左右货架间隔可通过1个agv,上下货架间隔可通过两个agv,通道为双向行驶通道。一台agv只能带一个货物,优化目标为完成任务总的时间最短,agv的速度是匀速,转弯也不会减速,取货物时间为固定值。上面的图里面货物看为正方形跟agv一样的长度大小,agv试做是跟货物一样大小的正方形agv的速度是每秒1个车身。多台agv一起完成...

FPGA/MATLAB学习教程/源码/项目合作开发 7563

【MATLAB代码】UKF组合导航例程,15维状态量、3维观测量。附完整的代码,有中文注释、误差输出图像

摘要 本文提出了一种基于15维误差状态模型的UKF组合导航算法,实现了三维位置、速度和姿态的高精度估计。算法采用严格的误差状态模型,包含位置(3)、速度(3)、姿态(3)、陀螺偏差(3)和加速度计偏差(3)共15个状态量,通过3维GNSS位置观测进行校正。仿真结果表明,相比纯IMU积分,UKF算法能有效抑制误差积累,显著提高导航精度。文中提供了完整的MATLAB源代码,可直接运行并复现三维轨迹对比、位置/速度曲线及误差分析结果。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 311

Redis最全面试题

一、概述 Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。 键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。 Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性能。 二、数据类型 数据类型 可以存储的值 操作 STRING 字符串...

u010766519的博客 350

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Redis 最全面试题(2021)

Redis 介绍 Redis是一个开源的使用ANSI C语言编写、遵循BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言API的非关系型数据库。 Redis 支持的数据类型 String (字符串) 格式:set key value String 类型是二进制安全的。Redis的string可以包含任何数据,比如jpg图片或者序列化的对象。 String 类型是redis最基本的数据类型,一个键最大能存储512MB。 Hash(哈希) 格式:hmset name

qq_40430818的博客 4849

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Redis最新最全面试题

原文:https://blog.youkuaiyun.com/u010682330/article/details/81043419 1、什么是Redis? Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写...

IBLiplus的博客 386

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

最全面的Redis面试题,BAT大厂面试必备

前言 又到一年金九银十跳槽季,很多程序员都开始了疯狂刷题之旅,但是这样刷题的效率极其低下,所以小编特意整理了大厂中最常见的**50道大厂Redis面试题(附答案)**答案在文章末尾,帮助大家在最短的时间内复习更多的知识。废话不多说,正文走起! 50道大厂Redis面试题 1、什么是 Redis? 2、Redis 相比 memcached 有哪些优势? 3、Redis 支持哪几种数据类型? 4、Redis 主要消耗什么物理资源? 5、Redis 的全称是什么? 6、Redis 有哪几种数据淘汰策略? 7、R

weixin_44906118的博客 1896

redis总结最全面的面试题

1、什么是 Redis? 2、Redis 相比 memcached 有哪些优势? 3、Redis 支持哪几种数据类型? 4、Redis 主要消耗什么物理资源? 5、Redis 的全称是什么? 6、Redis 有哪几种数据淘汰策略? 7、Redis 官方为什么不提供 Windows 版本? 8、一个字符串类型的值能存储最大容量是多少? 9、为什么 Redis 需要把所有数据放到内存中? 10、Redis 集群方案应该怎么做?都有哪些方案? 11、Redis 集群方案什么情况下会导致整个集群

javalingyu的博客 343

【面试必备】Redis最全面试题

出自:https://github.com/CyC2018/CS-Notes程序员乔戈里整理01概述Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存...

优快云大数据 478

Redis面试题(总结最全面的面试题!!!)

1.什么是Redis Redis 是一个使用 C 语言写成的,开源的高性能key-value非关系缓存数据库。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。Redis的数据都基于缓存的,所以很快。但是redis会把更新的数据写入磁盘中,保证了数据的安全不丢失,而且Redis的操...

小杰爱吃蛋的博客 7030

【面试收藏】Redis最全面试题

出自:https://github.com/CyC2018/CS-Notes程序员乔戈里整理一、概述二、数据类型STRINGLISTSETHASHZSET三、数据结构字典跳跃表四、使用场...

磊哥聊Java 429
上一篇: 1、spring源码解析(一)设计模式讲解
下一篇: springboot打包docker 镜像
曲终--人散
博客等级 码龄14年 23粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值