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更适合需要高速读写、分布式支持、缓存策略相对简单的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/443470.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【项目记录】大模型基于llama.cpp在Qemu-riscv64向量扩展指令下的部署

概述 本文在qemu-riscv64平台上,利用向量扩展指令加速运行基于llama.cpp构建的大模型。 参考博客链接: Accelerating llama.cpp with RISC-V Vector Extension 基于RVV的llama.cpp在Banana Pi F3 RISCV开发板上的演示 llama.cpp工程 Llama.cpp是一个基…

AI教父荣获2024诺贝尔物理学奖:杰弗里·辛顿和他的深度学习之路!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…

Chrome浏览器调用ActiveX控件--allWebOffice控件功能介绍

allWebOffice控件概述 allWebOffice控件能够实现在浏览器窗口中在线操作微软Office及WPS办公文档的应用(阅读、编辑、保存等),支持编辑文档时保留修改痕迹,支持书签位置内容动态填充,支持公文套红,支持文档…

springMVC添加webapp

项目结构-->模块-->找到想添加的模块下的web 点击号 添加路径 会在.../src/main/目录下自动生成目录

Golang | Leetcode Golang题解之第467题环绕字符串中唯一的子字符串

题目: 题解: func findSubstringInWraproundString(p string) (ans int) {dp : [26]int{}k : 0for i, ch : range p {if i > 0 && (byte(ch)-p[i-1]26)%26 1 { // 字符之差为 1 或 -25k} else {k 1}dp[ch-a] max(dp[ch-a], k)}for _, v :…

【xilinx-versal】【Petalinux】I2C驱动开发问题记录

问题 调试中发现系统起来后无I2C设备。 仔细查找后发现没有配置versal的I2C控制器。 解决方法 打开versal的I2C控制器的配置 起来后I2C设备注册成功

使用idea和vecode创建vue项目并启动(超详细)

一、idea创建vue项目 创建项目之前先下载好插件 新建项目找到vue生成器 写好名称,找到自己需要存放的地址,node解释器安装方式可以看我上一个博客,vueCLI是选择vue的版本,我们可以使用idea自带的vue版本默认是vue3,创…

标准正态分布的数据 tensorflow 实现正态分布图,python 编程,数据分析和人工智能

import tensorflow as tf import matplotlib.pyplot as plt # 设置随机种子以获得可重复的结果 tf.random.set_seed(42) # 生成正态分布的数据 # mean0 和 stddev1 表示生成标准正态分布的数据 # shape(1000,) 表示生成1000个数据点 data tf.random.normal(mean0, stddev1, …

postman变量,断言,参数化

环境变量 1.创建环境变量 正式环境是错误的,方便验证环境变化 2.在请求中添加变量 3.运行前选择环境变量 全局变量 能够在任何接口访问的变量 console中打印日志 console.log(responseBody);//将数据解析为json格式 var data JSON.parse(responseBody); conso…

k8s中pod的管理

资源管理介绍 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务 所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器&…

NLP: SBERT介绍及sentence-transformers库的使用

1. Sentence-BERT Sentence-BERT(简写SBERT)模型是BERT模型最有趣的变体之一,通过扩展预训练的BERT模型来获得固定长度的句子特征,主要用于句子对分类、计算两个句子之间的相似度任务。 1.1 计算句子特征 SBERT模型同样是将句子标记送入预训练的BERT模型…

Web3 游戏周报(9.22 - 9.28)

回顾上周的区块链游戏概况,查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【9.22-9.28】Web3 游戏行业动态: Axie Infinity 将 Fortune Slips 的冷却时间缩短至 24 小时,从而提高玩家的收入。 Web3 游戏开发商 Darkbright Studios…

【源码+文档+调试讲解】二手物品调剂系统NODEJS

摘 要 二手物品调剂系统是一种在线平台,旨在促进用户之间的二手物品交易。该系统提供了一个方便的界面,让用户能够发布、浏览和搜索二手物品信息。用户可以根据自己的需求和兴趣,筛选出合适的物品,并通过系统与卖家进行联系。系统…

手撕Python之生成器、装饰器、异常

1.生成器 生成器的定义方式&#xff1a;在函数中使用yield yield值&#xff1a;将值返回到调用处 我们需要使用next()进行获取yield的返回值 yield的使用以及生成器函数的返回的接收next() def test():yield 1,2,3ttest() print(t) #<generator object test at 0x01B77…

气象大模型预测天气预报的原理

随着气象科学的发展&#xff0c;气象预报已经从早期的经验判断发展到基于数值模拟的高精度预测。气象大模型&#xff0c;作为一种强大的计算工具&#xff0c;利用大规模数据和复杂的物理模型&#xff0c;提供了精准的天气预报服务。本文将介绍气象大模型的原理&#xff0c;以及…

嵌入式面试——FreeRTOS篇(六) 任务通知

本篇为&#xff1a;FreeRTOS 任务通知篇 任务通知简介 1、任务通知介绍 答&#xff1a; 任务通知&#xff1a;用来通知任务的&#xff0c;任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。 使用队列、信号量、事件标志组时都需要另外创建一个结构体&#xff0c…

新个性化时尚解决方案!Prompt2Fashion:自动生成多风格、类型时尚图像数据集。

今天给大家介绍一种自动化生成时尚图像数据的方法Prompt2Fashion。 首先创建了一组描述&#xff0c;比如“适合婚礼的休闲风格服装”&#xff0c;然后用这些描述来指导计算机生成图像。具体来说&#xff0c;他们使用了大型语言模型来写出这些服装的描述&#xff0c;接着将这些描…

SpringBoot统一日志框架

在项目开发中&#xff0c;日志十分的重要&#xff0c;不管是记录运行情况还是定位线上问题&#xff0c;都离不开对日志的分析。 1.日志框架的选择 市面上常见的日志框架有很多&#xff0c;它们可以被分为两类&#xff1a;日志门面&#xff08;日志抽象层&#xff09;和日志实…

【万字长文】Word2Vec计算详解(三)分层Softmax与负采样

【万字长文】Word2Vec计算详解&#xff08;三&#xff09;分层Softmax与负采样 写在前面 第三部分介绍Word2Vec模型的两种优化方案。 【万字长文】Word2Vec计算详解&#xff08;一&#xff09;CBOW模型 markdown行 9000 【万字长文】Word2Vec计算详解&#xff08;二&#xff0…

网站集群批量管理-Ansible(playbook)

1.剧本概述 1. playbook 文件,用于长久保存并且实现批量管理,维护,部署的文件. 类似于脚本存放命令和变量 2. 剧本yaml格式,yaml格式的文件:空格,冒号 2. 区别 ans-playbookans ad-hoc共同点批量管理,使用模块批量管理,使用模块区别重复调用不是很方便,不容易重复场景部署服务…