Redis面试篇3
1、Redis的数据类型,以及每种数据类型的使用场景?
- 常见的几种数据类型和使用场景如下:
- 字符串(String):字符串类型是Redis最基本的数据结构,一个键最大能存储512MB。
- 使用场景:适用于计数器、分布式锁、缓存等常见。
- 列表(List):列表是链表结构,可以在头部和尾部添加元素。
- 使用场景:可以做简单的消息队列功能。利用Irange命令,做基于Redis的分页功能。
- 集合(Set):集合是通过哈希表实现的无序集合,每个元素都是独一无二的。
- 使用场景:适用于好友关系、共同好友等去重和计算交集、并集、差集的场景。
- 哈希(Hash):哈希结构类似于关联数组,由字段和值组成。
- 使用场景:适用于对象缓存。
- 有序集合(Sorted Set):有序集合类似于集合,不同的是每个元素都会关联一个权重(score),按照权重进行排序。
- 使用场景:排行榜、带权重的任务队列等场景。
- 位图(BitMap):用于存储二进制位的数据结构,可以进行位运算,支持高效的位图计算。
- 使用场景:用户签到记录。
- 地理位置(Geo):用于存储地理位置信息的数据结构。
- 使用场景:附近的酒店、餐厅。
- HyperLogLog:用于进行基数计数的数据结构,支持高效的对大量元素进行去重统计。
- 使用场景:网站的UV统计。
- 字符串(String):字符串类型是Redis最基本的数据结构,一个键最大能存储512MB。
2、Redis的过期策略以及内存淘汰机制
- Redis的过期策略和内存淘汰机制如下:
- 过期策略:Redis中可以设置key的过期时间,过期时间到期后,key将会自动被删除。Redis提供了两种不同的过期策略:
- 定时删除:在设置key过期的同时,创建一个定时器,当过期时间到达时,就会立即删除该key。
- 惰性删除:再获取某个key的值时,先检查该key是否过期,如果过期就删除,否则返回该key的值。
- Redis默认使用惰性删除策略。
- 内存淘汰机制:当Redis内存达到了最大限制时,需要从内存中删除一些数据。Redis提供了多种内存淘汰机制:
- noeviction:当内存空间不足以容纳新写入数据时,新写入操作会报错,这种方式不会删除任何数据,应该只用于特殊场景。
- allkeys-lru:当内存空间不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(LRU算法)。这是Redis默认的淘汰策略。
- allkeys-random:从所有key中随机选择一些进行删除。
- volatile-lru:当内存空间不足以容纳新写入数据时,再设置了过期时间的键空间中,移除最近最少使用的key(LRU算法)。
- volatile-ramdom:从设置了过期时间的key中随机选择一些进行删除。
- volatile-ttl:从设置了过期时间的key中,根据过期时间的先后顺序进行删除,越早过期的越优先删除。
- 过期策略:Redis中可以设置key的过期时间,过期时间到期后,key将会自动被删除。Redis提供了两种不同的过期策略:
3、 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级都了解吗?
- 简述其概念如下
- 缓存雪崩:指在某个时间段内缓存集体过期失效或缓存服务重启,导致大量请求都落到数据库上,从而导致数据库崩溃的情况。
- 缓存穿透:指查询一个不存在的数据,由于缓存没有命中,导致所有的请求都会到数据库上,造成数据库压力过大,严重的可能会导致数据库宕机。
- 缓存预热:指系统上线后,将相关的缓存数据直接加载到缓存系统中,避免在用户请求过程中因没有预先加载而导致缓存穿透的现象。
- 缓存更新:指对数据库中的数据更新时,同时更新缓存中的数据,保证缓存数据和数据库的一致性。
- 缓存降级:指在缓存失效或缓存访问异常时,为了保证系统的可用性,通过一些机制,将请求转发到其他服务或者直接返回默认值,从而避免系统崩溃或者因为缓存故障导致业务受损。
- 常见的Redis缓存降级策略包括:
- 熔断降级:当Redis缓存故障或者超时时,系统会进入熔断状态,所有请求奖杯转发到备用服务或者直接返回默认值。
- 限流降级:当Redis缓存无法处理所有请求时,系统会采用限流策略,限制访问流量,保护系统资源,避免系统崩溃。
- 数据降级:当Redis缓存故障时,系统可以返回默认值,避免因缓存故障导致业务受损。
4、什么情况下可能会导致Redis阻塞?
- Redis可能出现阻塞的情况包括:
- Redis主线程在执行阻塞命令(如
BRPOP、BLPOP、BRPOPLPUSH、SUBSCRIBE等)时,会阻塞其他客户端的请求,直到命令执行完毕才能继续处理其他请求。 - Redis主线程在执行某些耗时的命令(如
SORT、KEYS等)时,也会阻塞其他客户端的请求,同样需要等待命令执行完毕后才能继续处理其他请求。 - Redis内存使用达到最大限制时,执行写操作(如
SET、INCR等)可能会导致Redis阻塞。这是因为Redis需要执行内存回收操作以释放内存空间,如果回收操作耗时过长,就会导致Redis阻塞。 - Redis主从同步过程中,如果主库无法及时响应从库的同步请求,就会导致从库阻塞,无法继续进行数据同步。
- Redis主线程在执行阻塞命令(如
- 对于这些阻塞情况,可以采取一些措施来避免或减少阻塞的影响,例如
- 尽可能使用非阻塞命令,例如
LPUSH和RPOP代替BLPOP,使用Lua脚本实现多个操作的原子性等。 - 尽量避免使用耗时的命令或对大数据集进行操作,如果必须使用,可以考虑将这些操作放在后台进行。
- 设置合理的内存使用上限,同时使用内存淘汰策略来控制内存使用情况。
- 配置合理的主从架构,避免主库过于繁忙,导致从库同步阻塞。
- 尽可能使用非阻塞命令,例如
5、 怎么提高缓存命中率?
- 提高缓存命中率可以采取以下措施:
- 预热缓存:在系统启动的时候,将一些热点数据提前加载到缓存中,可以避免在系统运行时出现缓存穿透和缓存雪崩的情况。
- 增加缓存容量:增加缓存容量可以缓存更多的数据,从而提高缓存命中率。
- 优化缓存设计:合理的缓存设计是提高缓存命中率的前提,包括选择合适的数据结构、缓存过期时间、缓存的key命名等。
- 使用多级缓存:多级缓存可以将热点数据缓存在更快速、容量更小的缓存中,减少从慢速缓存或者数据库中读取数据的次数。
- 缓存穿透处理:针对一些缓存中不存在,但是经常被查询的数据,可以采取布隆过滤器或设置空值等方式来进行预判,避免缓存穿透的情况。
- 建立读写分离的架构:将读请求和写请求分别处理,读请求可以直接从缓存中读取数据,写请求更新数据库后再更新缓存,从而避免缓存和数据库的一致性问题。
6、 Redis如何解决key冲突?
- 如果两个key的名字相同,后一个key会覆盖前一个key。因此,为了避免key冲突,最好为每一个key取一个独特的、易于辨识的名称。
- 通常可以使用业务名和参数来区key,这样可以避免key冲突,同时也方便业务逻辑的管理和维护。
7、 Redis报内存不足怎么处理?
- 可以考虑以下几种处理方式:
- 增加物理内存:增加Redis所在服务器的物理内存,可以让Redis有更多的空间来存储数据。
- 减少数据量:可以删除一些已经不再使用的数据,或者将一些数据进行持久化,以释放内存。设置缓存淘汰策略,提高内存的使用效率。
- 修改Redis配置:可以调整Redis配置文件中的一些参数,如maxmemory等,增加Redis可用内存。
- 使用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是两种常用的缓存系统,它们的区别如下:
- 数据类型:Redis支持更丰富的数据类型,包括字符串、哈希、列表、集合、有序集合等,而Memcached仅支持简单的键值对存储。
- 持久化:Redis支持数据的持久化,可以将数据写入磁盘,而Memcached不支持数据的持久化。
- 分布式支持:Memcached天生支持分布式,多个节点可以组成一个集群,而Redis的分布式支持需要通过集群、分片等方式实现。
- 性能:在单机环境下,Redis的性能通常比Memcached更好,但在分布式环境下,由于网络通信开销的增加,两者的性能差距可能会减小。
- 缓存策略:Redis支持更多的缓存策略,比如LRU(最近最少使用)、LFU(最少使用)、随机等,而Memcached仅支持LRU。
- 应用场景: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文件: <!-- 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、启动系统,进入开界面,在界面中按“e"进入编辑界面 2、进入编辑界面,使用键盘上的上下键把光标往下移动,找到以”Linux16“开通内容所在的行数,在行的最后面输入:init/bin/sh 3、输入完成后&…...
后端参数校验方式
1. 使用Hibernate Validator进行注解校验 这是Java中最常用的参数校验方式,基于JSR 303/JSR 380规范的实现,通常结合Valid或Validated注解进行参数校验。 使用步骤: 添加依赖(如果使用Spring Boot,通常已经内置了Hi…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
【阅读笔记】MemOS: 大语言模型内存增强生成操作系统
核心速览 研究背景 研究问题:这篇文章要解决的问题是当前大型语言模型(LLMs)在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色,但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成(RA…...
