基础面试题整理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,其进一步包括&…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...