当前位置: 首页 > news >正文

Redis面试篇3

1、Redis的数据类型,以及每种数据类型的使用场景?

  • 常见的几种数据类型和使用场景如下:
    1. 字符串(String):字符串类型是Redis最基本的数据结构,一个键最大能存储512MB。
      • 使用场景:适用于计数器、分布式锁、缓存等常见。
    2. 列表(List):列表是链表结构,可以在头部和尾部添加元素。
      • 使用场景:可以做简单的消息队列功能。利用Irange命令,做基于Redis的分页功能。
    3. 集合(Set):集合是通过哈希表实现的无序集合,每个元素都是独一无二的。
      • 使用场景:适用于好友关系、共同好友等去重和计算交集、并集、差集的场景。
    4. 哈希(Hash):哈希结构类似于关联数组,由字段和值组成。
      • 使用场景:适用于对象缓存。
    5. 有序集合(Sorted Set):有序集合类似于集合,不同的是每个元素都会关联一个权重(score),按照权重进行排序。
      • 使用场景:排行榜、带权重的任务队列等场景。
    6. 位图(BitMap):用于存储二进制位的数据结构,可以进行位运算,支持高效的位图计算。
      • 使用场景:用户签到记录。
    7. 地理位置(Geo):用于存储地理位置信息的数据结构。
      • 使用场景:附近的酒店、餐厅。
    8. HyperLogLog:用于进行基数计数的数据结构,支持高效的对大量元素进行去重统计。
      • 使用场景:网站的UV统计。

 2、Redis的过期策略以及内存淘汰机制

  • Redis的过期策略和内存淘汰机制如下:
    1. 过期策略:Redis中可以设置key的过期时间,过期时间到期后,key将会自动被删除。Redis提供了两种不同的过期策略:
      • 定时删除:在设置key过期的同时,创建一个定时器,当过期时间到达时,就会立即删除该key。
      • 惰性删除:再获取某个key的值时,先检查该key是否过期,如果过期就删除,否则返回该key的值。
      • Redis默认使用惰性删除策略。
    2. 内存淘汰机制:当Redis内存达到了最大限制时,需要从内存中删除一些数据。Redis提供了多种内存淘汰机制:
      • noeviction:当内存空间不足以容纳新写入数据时,新写入操作会报错,这种方式不会删除任何数据,应该只用于特殊场景。
      • allkeys-lru:当内存空间不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(LRU算法)。这是Redis默认的淘汰策略。
      • allkeys-random:从所有key中随机选择一些进行删除。
      • volatile-lru:当内存空间不足以容纳新写入数据时,再设置了过期时间的键空间中,移除最近最少使用的key(LRU算法)。
      • volatile-ramdom:从设置了过期时间的key中随机选择一些进行删除。
      • volatile-ttl:从设置了过期时间的key中,根据过期时间的先后顺序进行删除,越早过期的越优先删除。

3、 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级都了解吗?

  • 简述其概念如下
    1. 缓存雪崩:指在某个时间段内缓存集体过期失效或缓存服务重启,导致大量请求都落到数据库上,从而导致数据库崩溃的情况。
    2. 缓存穿透:指查询一个不存在的数据,由于缓存没有命中,导致所有的请求都会到数据库上,造成数据库压力过大,严重的可能会导致数据库宕机。
    3. 缓存预热:指系统上线后,将相关的缓存数据直接加载到缓存系统中,避免在用户请求过程中因没有预先加载而导致缓存穿透的现象。
    4. 缓存更新:指对数据库中的数据更新时,同时更新缓存中的数据,保证缓存数据和数据库的一致性。
    5. 缓存降级:指在缓存失效或缓存访问异常时,为了保证系统的可用性,通过一些机制,将请求转发到其他服务或者直接返回默认值,从而避免系统崩溃或者因为缓存故障导致业务受损。
  • 常见的Redis缓存降级策略包括:
    1. 熔断降级:当Redis缓存故障或者超时时,系统会进入熔断状态,所有请求奖杯转发到备用服务或者直接返回默认值。
    2. 限流降级:当Redis缓存无法处理所有请求时,系统会采用限流策略,限制访问流量,保护系统资源,避免系统崩溃。
    3. 数据降级:当Redis缓存故障时,系统可以返回默认值,避免因缓存故障导致业务受损。

4、什么情况下可能会导致Redis阻塞?

  • Redis可能出现阻塞的情况包括:
    1. Redis主线程在执行阻塞命令(如BRPOPBLPOPBRPOPLPUSHSUBSCRIBE等)时,会阻塞其他客户端的请求,直到命令执行完毕才能继续处理其他请求。
    2. Redis主线程在执行某些耗时的命令(如SORTKEYS等)时,也会阻塞其他客户端的请求,同样需要等待命令执行完毕后才能继续处理其他请求。
    3. Redis内存使用达到最大限制时,执行写操作(如SETINCR等)可能会导致Redis阻塞。这是因为Redis需要执行内存回收操作以释放内存空间,如果回收操作耗时过长,就会导致Redis阻塞。
    4. Redis主从同步过程中,如果主库无法及时响应从库的同步请求,就会导致从库阻塞,无法继续进行数据同步。
  • 对于这些阻塞情况,可以采取一些措施来避免或减少阻塞的影响,例如
    1. 尽可能使用非阻塞命令,例如LPUSHRPOP代替BLPOP,使用Lua脚本实现多个操作的原子性等。
    2. 尽量避免使用耗时的命令或对大数据集进行操作,如果必须使用,可以考虑将这些操作放在后台进行。
    3. 设置合理的内存使用上限,同时使用内存淘汰策略来控制内存使用情况。
    4. 配置合理的主从架构,避免主库过于繁忙,导致从库同步阻塞。

5、 怎么提高缓存命中率?

  • 提高缓存命中率可以采取以下措施:
    1. 预热缓存:在系统启动的时候,将一些热点数据提前加载到缓存中,可以避免在系统运行时出现缓存穿透和缓存雪崩的情况。
    2. 增加缓存容量:增加缓存容量可以缓存更多的数据,从而提高缓存命中率。
    3. 优化缓存设计:合理的缓存设计是提高缓存命中率的前提,包括选择合适的数据结构、缓存过期时间、缓存的key命名等。
    4. 使用多级缓存:多级缓存可以将热点数据缓存在更快速、容量更小的缓存中,减少从慢速缓存或者数据库中读取数据的次数。
    5. 缓存穿透处理:针对一些缓存中不存在,但是经常被查询的数据,可以采取布隆过滤器或设置空值等方式来进行预判,避免缓存穿透的情况。
    6. 建立读写分离的架构:将读请求和写请求分别处理,读请求可以直接从缓存中读取数据,写请求更新数据库后再更新缓存,从而避免缓存和数据库的一致性问题。

6、 Redis如何解决key冲突?

  • 如果两个key的名字相同,后一个key会覆盖前一个key。因此,为了避免key冲突,最好为每一个key取一个独特的、易于辨识的名称。
  • 通常可以使用业务名和参数来区key,这样可以避免key冲突,同时也方便业务逻辑的管理和维护。

7、 Redis报内存不足怎么处理?

  • 可以考虑以下几种处理方式:
    1. 增加物理内存:增加Redis所在服务器的物理内存,可以让Redis有更多的空间来存储数据。
    2. 减少数据量:可以删除一些已经不再使用的数据,或者将一些数据进行持久化,以释放内存。设置缓存淘汰策略,提高内存的使用效率。
    3. 修改Redis配置:可以调整Redis配置文件中的一些参数,如maxmemory等,增加Redis可用内存。
    4. 使用Redis集群:可以将数据分散在多个Redis节点中,每个节点存储一部分数据,从而减少单个Redis实例的内存使用量。 

8、热点数据和冷数据是什么?

  • 热点数据和冷数据是根据数据被访问的频率来进行划分的。
    • 热点数据值的是被频繁访问的数据,通常是系统的核心数据,例如热门商品、热门文章、热门活动等,这些数据的访问量非常高,如果没有得到有效的缓存优化,系统将会面临严重的性能问题。
    • 冷数据则相反,指的是不经常被访问的数据,它们的数据访问频率较低,例如旧的文章、过期的活动等。
  • 了解热点数据和冷数据对于缓存设计和优化非常重要,因为不同的数据需要采用不同的缓存策略。
    • 例如对于热点数据需要采用缓存预热、缓存更新等策略来保证缓存的命中率,而对于冷数据则可以采用懒加载等策略来避免不必要的缓存开销。

9、 为什么Redis的操作是原子性的,怎么保证原子性?

  • Redis的操作是原子性的,是因为Redis是单线程的,Redis中的所有操作都是在一个单线程中执行,这样就可以避免并发的环境下多个线程同时修改同一个键值对的问题。在Redis中,任何一个操作都是原子性的,要么执行成功,要么执行不成功。如果一个操作包含多个步骤,那么这些步骤会被当成一个整体,要么全部执行成功,要么全部不执行。
  • Redis保证原子性的方式主要有两种:事务和Lua脚本。在事务中,Redis会将多个命令打包成一个事务进行执行,事务中的所有命令都会在一次操作中被执行,要么全部执行成功,要么全部不执行。而Lua脚本则可以将多个操作打包成一个原子性的操作进行执行,这个操作要么全部执行成功,要么全部不执行。另外,Redis还提供了一些原子性操作,例如INCR、DECR等,这些操作都是原子性的。
  • 在并发环境下,如果多个线程同时执行get和set命令,可能会出现竞争条件,从而导致数据不一致的问题。但是如果使用Redis提供的原子性操作INCR,则不会存在这种问题,因为INCR命令是原子性的。
  • 因此可以使用Redis事务或者Redis+Lua的方式保证多个命令在并发中的原子性,或者使用Redis提供的原子性操作。

10、 Memcached和Redis的区别都有哪些?

  • Memcached和Redis是两种常用的缓存系统,它们的区别如下:
    1. 数据类型:Redis支持更丰富的数据类型,包括字符串、哈希、列表、集合、有序集合等,而Memcached仅支持简单的键值对存储。
    2. 持久化:Redis支持数据的持久化,可以将数据写入磁盘,而Memcached不支持数据的持久化。
    3. 分布式支持:Memcached天生支持分布式,多个节点可以组成一个集群,而Redis的分布式支持需要通过集群、分片等方式实现。
    4. 性能:在单机环境下,Redis的性能通常比Memcached更好,但在分布式环境下,由于网络通信开销的增加,两者的性能差距可能会减小。
    5. 缓存策略:Redis支持更多的缓存策略,比如LRU(最近最少使用)、LFU(最少使用)、随机等,而Memcached仅支持LRU。
    6. 应用场景:Redis更适合需要丰富数据类型、支持持久化、缓存策略较多、单机性能较好的场景;而Memcached更适合需要高速读写、分布式支持、缓存策略相对简单的场景。

相关文章:

Redis面试篇3

1、Redis的数据类型,以及每种数据类型的使用场景? 常见的几种数据类型和使用场景如下: 字符串(String):字符串类型是Redis最基本的数据结构,一个键最大能存储512MB。 使用场景:适用于计数器、分布式锁、缓…...

集成方案 | 借助 Microsoft Copilot for Sales 与 Docusign,加速销售流程!

加速协议信息提取,随时优化邮件内容~ 在当今信息爆炸的时代,销售人员掌握着丰富的数据资源。他们能够通过 CRM 平台、电子邮件、合同库以及其他多种记录系统,随时检索特定个人或组织的关键信息。这些数据对于销售沟通至关重要。然而&#x…...

k8s 1.28.2 集群部署 MinIO 分布式集群

文章目录 [toc]MinIO 介绍MinIO 生产硬件要求MinIO 存储要求MinIO 内存要求MinIO 网络要求MinIO 部署架构分布式 MinIO复制的 MinIO 部署 MinIO创建目录节点打标签创建 namespace创建 pv创建 MinIO配置 ingress问题记录通过代理服务器访问 MinIO 的 Object Browser 界面一直显示…...

HAL库常用的函数:

目录 HAL库: 1.GPIO常用函数: 1.HAL_GPIO_ReadPin( ) 2.HAL_GPIO_WritePin( ) 3.HAL_GPIO_TogglePin( ) 4.HAL_GPIO_EXTI_IRQHandler( ) 5.HAL_GPIO_EXTI_Callback( ) 2.UART常用函数: 1.HAL_U…...

如何捕捉行情爆发的前兆

在金融市场的激烈角逐中,每一次行情的爆发都是投资者获取丰厚回报的关键时刻。然而,如何识别并把握这些时刻,却是一门需要深厚金融专业知识和敏锐洞察力的艺术。今天,我们就来深入探讨行情爆发的初期信号,揭示那些能够…...

【万字长文】Word2Vec计算详解(一)CBOW模型

【万字长文】Word2Vec计算详解(一)CBOW模型 写在前面 本文用于记录本人学习NLP过程中,学习Word2Vec部分时的详细过程,本文与本人写的其他文章一样,旨在给出Word2Vec模型中的详细计算过程,包括每个模块的计…...

React Native源码学习

核心组件 基础组件:View、Text、Image、TextInput、ScrollView(性能没有FlatList好,因为它会一次性把子元素渲染出来)、StyleSheet交互组件:button列表视图:FlatList(优先渲染屏幕上可见的元素&…...

【计网】从零开始认识https协议 --- 保证安全的网络通信

在每个死胡同的尽头, 都有另一个维度的天空, 在无路可走时迫使你腾空而起, 那就是奇迹。 --- 廖一梅 --- 从零开始认识https协议 1 什么是https协议2 https通信方案2.1 只使用对称加密2.2 只使用非对称加密2.3 双方都使用非对称加密2.4 …...

Ubuntu安装 MySQL【亲测有效】

在Ubuntu上安装MySQL数据库的步骤通常包括更新软件包列表、安装MySQL服务器、启动并配置MySQL服务等。以下是一个详细的安装指南: 一、更新软件包列表 首先,打开终端并输入以下命令来更新Ubuntu的软件包列表: sudo apt update二、安装MySQ…...

Unity 从零开始搭建一套简单易用的UGUI小框架 扩展与优化篇(完结)

一个通用的UGUI小框架就算是写完了,下面是一步步的思考与优化过程 Unity 从零开始搭建一套简单易用的UGUI小框架 基础分析篇-CSDN博客 Unity 从零开始搭建一套简单易用的UGUI小框架 功能撰写与优化篇-CSDN博客 从使用者的角度来整理一下可能会发出的疑问 0. Panel…...

MySQL多表操作--外键约束多表关系

外键约束介绍 Mysql外键约束(foreign key)是表的一个特殊字段,常与主键约束一起使用。外键约束是一种用于维护两个表之间数据一致性的方法。它确保引用表中的每个值都存在于主表中的某个列中。外键约束通常用于实现数据库的参照完整性。对于两…...

【python入门到精通专题】8.装饰器

装饰器是python语言中的语法糖,可以通过装饰器对函数的功能进行拓展。 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数。 def say_hello():print("hello!")def say_goodbye():print("hello!") # 此处应打印go…...

Halcon Blob分析提取小光斑

文章目录 算子complement 返回一个区域的补集select_region_point 选择包含指定像素的所有区域intensity 计算灰度值的均值和偏差 案例 算子 complement 返回一个区域的补集 complement(Region : RegionComplement : : )Region (输入对象):这指的是输入的一个或多…...

Lua

1.声明一个变量 只要赋值一个变量,就相当于新建了一个变量,默认全局变量,加一个local前缀之后,这个变量就变成了局部变量 a1//全局变量 local b2//局部变量2.nil类型 在Lua里没有被声明过的变量都是nil,nil是一种类…...

模型 总观效应

系列文章 分享 模型,了解更多👉 模型_思维模型目录。超越自我,洞见生命之渺小。 1 总观效应的呈现和应用 1.1 回首创业路,星辰大海的启示 陈浩是一名连续创业者,他的创业历程充满了起伏和挑战。在经历了几次失败后&a…...

【HarmonyOS NEXT】实现页面水印功能

关键词:鸿蒙、水印、Watermark、页面、触摸问题 注:本期文章同样适用 OpenHarmony 的开发 在app开发过程中时常会出现敏感信息页面,为保护信息安全和及时的数据追踪,通常会采用给页面加水印的形式,那么本期文章会介绍…...

selenium自动化测试之Junit

1. 常用的注解 将junit的索引添加到pom文件&#xff1a; <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId&…...

【氮化镓】基于氮化镓的互补逻辑集成电路[Nature Electronics]

【摘要】本文介绍了一种基于氮化镓(GaN)的互补金属氧化物半导体(CMOS)逻辑集成电路,该电路利用氧等离子体处理技术实现了增强型n沟道和p沟道GaN场效应晶体管的单片集成。研究者们展示了包括反相器、与非门、或非门和传输门在内的基本逻辑门,以及多级逻辑电路,如锁存器和…...

Linux之如何找回 root 密码?

1、启动系统&#xff0c;进入开界面&#xff0c;在界面中按“e"进入编辑界面 2、进入编辑界面&#xff0c;使用键盘上的上下键把光标往下移动&#xff0c;找到以”Linux16“开通内容所在的行数&#xff0c;在行的最后面输入&#xff1a;init/bin/sh 3、输入完成后&…...

后端参数校验方式

1. 使用Hibernate Validator进行注解校验 这是Java中最常用的参数校验方式&#xff0c;基于JSR 303/JSR 380规范的实现&#xff0c;通常结合Valid或Validated注解进行参数校验。 使用步骤&#xff1a; 添加依赖&#xff08;如果使用Spring Boot&#xff0c;通常已经内置了Hi…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...