基础面试题整理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系列——(一)概述
引言 在软件开发的世界里,C一直是一门备受青睐的编程语言,特别是在需要高性能和灵活性的场合。而C的标准模板库(Standard Template Library,简称STL)无疑是这门语言中最强大的工具之一。STL提供了一系列的数据结构和算…...
AI-数学-高中-25-三角函数一图像解决三角函数不等式
原作者视频:【三角函数】【考点精华】1图像解决三角函数不等式问题(基础)_哔哩哔哩_bilibili 1.三角函数图像法; 2.不好画图像时:任意角的三角函数图像,在象限中比较,在4个象限中寻找角度的关系。 示例1…...
在Ubuntu上安装JetBrains Toolbox并解决libfuse.so.2依赖问题
在安装JetBrains Toolbox的过程中,我们遇到了libfuse.so.2依赖缺失的问题。这个问题通常发生在尝试运行AppImage格式的程序时,如果系统缺少必要的FUSE(Filesystem in Userspace)支持。以下是我在解决这个问题并在Ubuntu上成功安装…...
在vscode上传项目到gitee
一、在Gitee上新建一个仓库 Tip:若已经创建过了,直接跳到第二部分看VsCode如何上传代码到Gitee 创建仓库比较简单,下面两张图就是整个过程,这里不在赘述,具体如下: 二、VsCode连接Gitee上创建的仓…...
比较两次从接口获取的数据,并找出变动的字段
问题:有这么一个接口数据,每次会返回这么一个数据: [{Id:1,pending:65,queued:0,completed:0},{Id:2,pending:0,queued:0,completed:0}],请问再次请求这个接口的时候如何将获取的数据和上一次获取到的数据进行比较,找出变动的字段…...
Java并发基础:LinkedBlockingDeque全面解析!
内容概要 LinkedBlockingDeque提供了线程安全的双端队列实现,它支持在队列两端高效地进行插入和移除操作,同时具备阻塞功能,能够很好地协调生产者与消费者之间的速度差异,其内部基于链表结构,使得并发性能优异&#x…...
Zabbix6.x配置中文界面 解决乱码问题
Zabbix6.x配置中文界面 解决乱码问题 Zabbix6.x界面无法选择中文,通过安装语言包解决。后面也解决了zabbix6中文方块(乱码)问题。 配置中文语言包 系统中默认没有携带中文语言包,可以通过以下命令查看 localectl list-locales #…...
next项目页面性能调优
next项目页面性能调优 一般来说性能优化可以分为加载时、运行时两部分的优化。 扩展参考链接: 前端性能优化 24 条建议 Webpack 4进阶–从前的日色变得慢 ,一下午只够打一次包 Webpack 分包优化首屏加载 参考指标 FCP(First Contentful P…...
性能评测|虚拟化和裸金属 K8s 哪个性能更好?
本文重点 整体而言,SKS(虚拟机 Kubernetes)可以达到裸金属 Kubernetes 性能的 82% – 96%,满足绝大部分场景下生产容器应用的性能需求。更多虚拟化与裸金属 Kubernetes 架构、特性、适用场景与性能对比,欢迎阅读文末电…...
【大厂AI课学习笔记】【1.6 人工智能基础知识】(1)人工智能、机器学习、深度学习之间的关系
6.1 人工智能、机器学习与深度学习的关系 必须要掌握的内容: 如上图:人工智能>机器学习>深度学习。 机器学习是人工智能的一个分支,该领域的主要研究对象是人工智能,特别是如何在经验学习中改进具体算法的性能。 深度学习…...
计算机毕业设计基于的农村蔬菜销售系统SSM
项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: vue mybatis Maven mysql5.7或8.0等等组成,B…...
【Chrono Engine学习总结】3-地型terrain
由于Chrono的官方教程在一些细节方面解释的并不清楚,自己做了一些尝试,做学习总结。 1、关于物体材质 在介绍地型之前,要初步了解chrono中关于材质的一些基本概念。 首先,最基本的材质类是ChMaterialSurface,其进一步包括&…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...


