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

基础面试题整理6之Redis

1.Redis的应用场景

Redis支持类型:String、hash、set、zset、list

String类型

hash类型 

set类型

zset类型

list类型

 一般用作缓存,例如 如何同时操作同一功能 

2.redis是单线程

Redis服务端(数据操作)是单线程,所以Redis是并发安全的,因为无论客户端有多少个请求线程,在Redis执行命令时还是顺序执行

但是I/O线程(网络请求)在Redis6.0版本之前是和服务端共用一个线程,Redis6.0版本之后就和Redis服务端不共用。

所以如果删除key或者新增key时,若数据量很大会造成阻塞,因为命令排队执行

3. redis底层结构

Redis由key-value形式存储在哈希字典dict中。

key通过hash算法转换为数字根据下标存储在数组中,但是也会存在不同的key通过hash算法计算出相同下标,此时会对相同下标进行链表存储,若数组长度大于64且链表大于8,则会转换为红黑树存储;当红黑树长度为6时则会自动转换为链表式存储。【hashmap的底层】

dict由两个数组(ht[0]/ht[1])、重新哈希索引构成。而数组ht[0]则是由dictEntry链表、数组大小、数组已用大小构成。dictEntry由key、value、next(下一个指针)组成。

扩容rehash

  • 每个数据库中都有一个dict存储key-value数据,维护了两张hash表。正常使用0号表,若需要扩容,rehash时需要0号表和1号表共同使用。
  • 查询时先从0号表中找,后判断是否在rehash,若在rehash则从1号表找;若不在则直接返回
  • 插入时若发生rehash时插入到1号表,若未发生rehash时则插入到0号表。

key是字符串类型,value可以是String、list、set、zset、hash。

字符串String

type:String

encoding:raw/embstr、int 对应的内部结构是sds、int

sds:简单动态字符串,和Java的StringBuffer类似,可自动分配内存及释放内存

其他类型TODO

4.set命令使用时一般会对key设置过期时间

set命令若是没有对key设置过期时间,一般默认永不过期;所以一般redis用作缓存时读取到数据后会将数据清除,或者对数据设置过期时间

5. redis过期策略

当redis所用内存超过maxmemory时,会触发主动清理策略,所以若未出现误操作,redis没有过期但是数据还是被删除了,原因可能是这个主动清理策略导致的,可以看是否是这个原因;

此时默认为0,表示没有设置最大内存

  • 针对设置过期时间的key:
    • volatile-ttl:根据过期时间的先后顺序进行删除,越早过期越先被删除;
    • volatile-random:随机删除
    • volatile-lru(least recently used):最近最少使用 
    • volatile-lfu(least frequently used):最近不经常使用
  • 针对所有key:
    • allkeys-random:随机删除
    • allkeys-lru:最近最少使用
    • allkeys-lfu:最近不经常用
  • 不处理:
    • noeviction:不会删除数据,只是再次访问提示报错

一般都使用lru算法;但热点数据会使用lfu算法;

过期可以删除策略

惰性删除

key过期时是不会检查的,只有再次访问到key时(get命令)才会检测是否已过期,过期则会删除,但是不是会访问全部key的;所以存在大量过期key未被删除,占用内存

定期删除

每隔一段时间检测key是否过期,过期则删除;可通过配置时间间隔(set命令的过期时间)来调整,视项目情况而定

定时删除

通过集合及定时器来删除(zadd命令),对每个过期时间的key建一个定时器,到过期时间则删除key,所以耗CPU,影响服务的响应时间;

Redis将惰性删除和定期删除的结合使用

6.redis主从、哨兵、集群

主从

主节点(master)提供对外服务,从节点(slave)主要是备份;当master挂了,运维人员会介入将其他slave中的一台作为master,待之前挂掉的master恢复后,以slave模式启动,以当前master为主节点(ABC三个节点,开始A为master,BC为slave节点,当A挂掉时,将C作为主节点,AB为从节点继续工作)

哨兵

  • 哨兵集群会随时监控master节点与slave节点的状态及情况,当master节点挂掉时,会自动判断哪台slave节点作为master节点并将其他节点改为以master节点为首的slave节点,所以哨兵模式不需要运维介入,自己执行,但是时间就说不准,可能几秒或十几秒的。
  • 当有客户端请求访问,优先发给哨兵判断哪台为master节点,得到结果后,再去访问master节点。
  • 因为哨兵模式是自己执行,所以时间不确定,若此时有请求进来,会造成瞬间访问断联的情况。
  • 每个节点的内存不宜过大,因为持久化文件过大,导致主从数据同步非常慢。

集群

  • 集群主要解决高并发操作;
  • 集群由多个分片构成的,每个master存储不同的数据,各master之间是互通的,可以检测心跳
  • 当出现某一个分片的master挂掉,该分片下面的某一个slave会调整为master节点,其他节点会调整为slave节点。

redis集群数据hash分片

redis集群将数据分为16384个槽位,每个节点占用一部分槽位,槽位信息存储在每个节点;

客户端发送请求后,会先根据key计算出hash值,后除以16384取余得到所在节点的位置;

redis集群的节点超时限制

若由于网络信号问题,出现检测不到其中master节点信息,此时会自动判断并选举新的master节点。若出现网络频繁抖动,则会频繁主从切换。此时可配置节点超时信息配置

redis.conf配置文件 cluster-node-timeout 15000

redis集群的master节点要大于3个

当集群中一个分片的master挂掉后,该下面的slave节点选举是由其他分片的master节点参与的,要大于集群的一半的master节点同意才可选举成功。

相关文章:

基础面试题整理6之Redis

1.Redis的应用场景 Redis支持类型:String、hash、set、zset、list String类型 hash类型 set类型 zset类型 list类型 一般用作缓存,例如 如何同时操作同一功能 2.redis是单线程 Redis服务端(数据操作)是单线程,所以Redis是并发安全的,因…...

MySQL基础查询篇(7)-常用的字符串函数

MySQL数据库是目前广泛应用于各种系统中的一种关系型数据库管理系统。在MySQL中,有许多常见的字符串函数,可以对字符串进行各种处理和操作。本文将介绍MySQL数据库中常用的一些字符串函数,并提供详细示例。 CONCAT函数:用于将两个…...

如何实现视线(目光)的检测与实时跟踪

如何实现视线(目光)的检测与实时跟踪 核心步骤展示说明 找到人脸 检测人脸特征点 根据特征点找到人眼区域 高精度梯度算法检测瞳孔中心 根据眼睛周边特征点计算眼睛中心 瞳孔中心和眼睛中心基于视线模型计算视线方向 视线方向可视化 详细实现与说明: https://stud…...

STM32 FSMC (Flexible static memory controller) 灵活静态内存控制器介绍

文章目录 1. 介绍FSMC2. FSMC特点3. Block示意图4. AHB接口4.1 Supported memories and transactionsGeneral transaction rulesConfiguration registers 5. 外部设备地址映射5.1 NOR/PSRAM地址映射将NOR Flash/PSRAM的支持进行封装 5.2 NAND/PC Card地址映射 1. 介绍FSMC 说到…...

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书信息维护模块UI设计实现

锋哥原创的PyQt6图书管理系统视频教程: PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…...

SpringBoot源码解读与原理分析(六)WebMvc场景的自动装配

文章目录 2.6 WebMvc场景下的自动装配原理2.6.1 WebMvcAutoConfiguration2.6.2 Servlet容器的装配2.6.2.1 EmbeddedTomcat、EmbeddedJetty、EmbeddedUndertow2.6.2.2 BeanPostProcessorsRegistrar(后置处理器的注册器)2.6.2.3 两个定制器的注册 2.6.3 DispatcherServlet的装配2…...

git恢复rebase过程中遇到权限问题和丢失的提交

文章目录 一、检查丢失的提交是否还在 reflog 中二、创建一个新分支来恢复丢失的提交三、处理权限问题四. 使用 git fsck 查找丢失对象1、创建一个新分支来恢复该提交2、检查和合并提交 五. 介绍git中命令reflog 与 fsck1、git reflog2、git fsck使用场景 一、检查丢失的提交是…...

Spring boot 集成redis

一、使用spring bootspring-boot-starter-data-redis 导入maven包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> spring boot配置文件 spring.re…...

c++ STL系列——(一)概述

引言 在软件开发的世界里&#xff0c;C一直是一门备受青睐的编程语言&#xff0c;特别是在需要高性能和灵活性的场合。而C的标准模板库&#xff08;Standard Template Library&#xff0c;简称STL&#xff09;无疑是这门语言中最强大的工具之一。STL提供了一系列的数据结构和算…...

AI-数学-高中-25-三角函数一图像解决三角函数不等式

原作者视频&#xff1a;【三角函数】【考点精华】1图像解决三角函数不等式问题(基础&#xff09;_哔哩哔哩_bilibili 1.三角函数图像法&#xff1b; 2.不好画图像时&#xff1a;任意角的三角函数图像&#xff0c;在象限中比较&#xff0c;在4个象限中寻找角度的关系。 示例1…...

在Ubuntu上安装JetBrains Toolbox并解决libfuse.so.2依赖问题

在安装JetBrains Toolbox的过程中&#xff0c;我们遇到了libfuse.so.2依赖缺失的问题。这个问题通常发生在尝试运行AppImage格式的程序时&#xff0c;如果系统缺少必要的FUSE&#xff08;Filesystem in Userspace&#xff09;支持。以下是我在解决这个问题并在Ubuntu上成功安装…...

在vscode上传项目到gitee

一、在Gitee上新建一个仓库 Tip&#xff1a;若已经创建过了&#xff0c;直接跳到第二部分看VsCode如何上传代码到Gitee 创建仓库比较简单&#xff0c;下面两张图就是整个过程&#xff0c;这里不在赘述&#xff0c;具体如下&#xff1a; 二、VsCode连接Gitee上创建的仓…...

比较两次从接口获取的数据,并找出变动的字段

问题&#xff1a;有这么一个接口数据&#xff0c;每次会返回这么一个数据: [{Id:1,pending:65,queued:0,completed:0},{Id:2,pending:0,queued:0,completed:0}]&#xff0c;请问再次请求这个接口的时候如何将获取的数据和上一次获取到的数据进行比较&#xff0c;找出变动的字段…...

Java并发基础:LinkedBlockingDeque全面解析!

内容概要 LinkedBlockingDeque提供了线程安全的双端队列实现&#xff0c;它支持在队列两端高效地进行插入和移除操作&#xff0c;同时具备阻塞功能&#xff0c;能够很好地协调生产者与消费者之间的速度差异&#xff0c;其内部基于链表结构&#xff0c;使得并发性能优异&#x…...

Zabbix6.x配置中文界面 解决乱码问题

Zabbix6.x配置中文界面 解决乱码问题 Zabbix6.x界面无法选择中文&#xff0c;通过安装语言包解决。后面也解决了zabbix6中文方块&#xff08;乱码&#xff09;问题。 配置中文语言包 系统中默认没有携带中文语言包&#xff0c;可以通过以下命令查看 localectl list-locales #…...

next项目页面性能调优

next项目页面性能调优 一般来说性能优化可以分为加载时、运行时两部分的优化。 扩展参考链接&#xff1a; 前端性能优化 24 条建议 Webpack 4进阶–从前的日色变得慢 &#xff0c;一下午只够打一次包 Webpack 分包优化首屏加载 参考指标 FCP&#xff08;First Contentful P…...

性能评测|虚拟化和裸金属 K8s 哪个性能更好?

本文重点 整体而言&#xff0c;SKS&#xff08;虚拟机 Kubernetes&#xff09;可以达到裸金属 Kubernetes 性能的 82% – 96%&#xff0c;满足绝大部分场景下生产容器应用的性能需求。更多虚拟化与裸金属 Kubernetes 架构、特性、适用场景与性能对比&#xff0c;欢迎阅读文末电…...

【大厂AI课学习笔记】【1.6 人工智能基础知识】(1)人工智能、机器学习、深度学习之间的关系

6.1 人工智能、机器学习与深度学习的关系 必须要掌握的内容&#xff1a; 如上图&#xff1a;人工智能>机器学习>深度学习。 机器学习是人工智能的一个分支&#xff0c;该领域的主要研究对象是人工智能&#xff0c;特别是如何在经验学习中改进具体算法的性能。 深度学习…...

计算机毕业设计基于的农村蔬菜销售系统SSM

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; vue mybatis Maven mysql5.7或8.0等等组成&#xff0c;B…...

【Chrono Engine学习总结】3-地型terrain

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 1、关于物体材质 在介绍地型之前&#xff0c;要初步了解chrono中关于材质的一些基本概念。 首先&#xff0c;最基本的材质类是ChMaterialSurface,其进一步包括&…...

【多模态技术解析】先对齐再融合:动量蒸馏如何重塑视觉与语言表征学习

1. 为什么视觉和语言要先对齐再融合&#xff1f; 想象一下你正在教一个小朋友认识动物。如果先给他看一张猫的图片&#xff0c;再告诉他"这是狗"&#xff0c;小朋友肯定会困惑。这就是典型的模态未对齐问题——视觉信息和语言信息没有正确匹配。在多模态AI领域&#…...

百考通:AI全流程智能化驱动数据分析,让数据价值高效落地

在数字化浪潮席卷各行各业的今天&#xff0c;数据已成为核心生产要素&#xff0c;但如何从海量数据中挖掘价值、辅助决策&#xff0c;始终是企业与个人面临的核心难题。传统数据分析流程繁琐、技术门槛高、周期漫长&#xff0c;让许多非专业人士望而却步。百考通&#xff08;ht…...

【C/C++基础】C++输入流实战:cin、getline与缓冲区的那些事儿

1. C输入流基础&#xff1a;从键盘到缓冲区的旅程 每次在终端敲下字符时&#xff0c;你可能没意识到这些数据要先经历一场"缓冲区历险记"。想象缓冲区就像快递柜&#xff0c;键盘输入相当于快递员把包裹&#xff08;数据&#xff09;放进柜子&#xff0c;而cin等输入…...

从PMOS、NMOS到CMOS:揭秘现代芯片的互补设计哲学

1. 从PMOS与NMOS的相爱相杀说起 我第一次接触MOSFET晶体管是在大学实验室里&#xff0c;当时对着示波器上那些跳动的波形百思不得其解。教授指着电路板说&#xff1a;"记住&#xff0c;PMOS和NMOS就像电路世界的阴阳两极。"这句话让我花了整整三年时间才真正理解。 P…...

别再只盯着TOF了!聊聊FMCW激光雷达:它凭什么能直接测速,还自带‘抗干扰’光环?

FMCW激光雷达&#xff1a;重新定义自动驾驶感知边界的三大技术革命 当特斯拉的纯视觉方案与激光雷达阵营的路线之争还在持续时&#xff0c;一种被称为"激光雷达中的特斯拉"的技术正在悄然改写游戏规则。FMCW&#xff08;调频连续波&#xff09;激光雷达不像传统TOF&a…...

UniAD高版本环境实战:CUDA11.6+PyTorch1.12避坑全记录(附完整依赖清单)

UniAD高版本环境实战&#xff1a;CUDA11.6PyTorch1.12避坑全记录&#xff08;附完整依赖清单&#xff09; 当计算机视觉工程师尝试复现前沿论文时&#xff0c;环境配置往往成为第一道门槛。UniAD作为自动驾驶领域的统一大模型&#xff0c;其官方文档推荐的环境配置&#xff08;…...

【机器人导航】Ubuntu16.04下北斗星通接收机硬件连接与串口配置指南

1. 北斗星通接收机硬件连接指南 第一次接触北斗星通接收机时&#xff0c;我完全被它铝合金外壳的专业感震撼到了。这种工业级设备虽然看起来复杂&#xff0c;但只要掌握正确方法&#xff0c;连接起来其实比想象中简单得多。我们以NC502-D型接收机为例&#xff0c;这是机器人导航…...

终极免费图像浏览器:90+格式支持与专业体验指南

终极免费图像浏览器&#xff1a;90格式支持与专业体验指南 【免费下载链接】ImageGlass &#x1f3de; A lightweight, versatile image viewer 项目地址: https://gitcode.com/gh_mirrors/im/ImageGlass ImageGlass是一款专为Windows用户设计的轻量级开源图像浏览器&am…...

UniApp项目实战:手把手教你集成百度离线人脸SDK实现App实名认证(含完整代码)

UniApp实战&#xff1a;百度离线人脸SDK集成全流程与避坑指南 移动应用开发中&#xff0c;实名认证功能已成为金融、社交、电商等领域的标配需求。对于使用UniApp框架的开发者而言&#xff0c;如何高效集成百度离线人脸SDK实现安全可靠的认证流程&#xff0c;是提升产品竞争力的…...

解锁英雄联盟智能游戏辅助:终极效率提升指南

解锁英雄联盟智能游戏辅助&#xff1a;终极效率提升指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在快节奏的英雄联盟对战中…...