2023.12.21 关于 Redis 常用数据结构 和 单线程模型

news2025/1/26 15:32:27

目录

各数据结构具体编码方式

查看 key 对应 value 的编码方式

Reids 单线程模型

经典面试题

IO 多路复用


Redis 常用数据结构

  • Redis 中所有的 key 均为 String 类型,而不同的是 value 的数据类型却有很多种
  • 以下介绍 5 种 value 常见的数据类型

注意:

  • 上述的 有序集合 相当于是除了存储 member 之外,还需要存储一个 score
  • 而此处的 socre(分数) 相当于有序集合的 权重

各数据结构具体编码方式

  • Redis 是一种非关系型的数据库,它的底层实现了一些特定的优化,即 通过选择合适的 数据结构 和 编码方式,以便达到节省时间 和空间的效果

实例理解

  • Redis 在实现 哈希表时 可能会根据特定的场景和需求 选择使用不同的数据结构,而不仅仅是标准的哈希表
  • 但是无论使用哪种数据结构,Redis 都承诺查询、插入、删除操作的时间复杂度为 O(1)

数据结构:

  • redis 承诺给你提供使用的,也可以理解成 数据类型

编码方式:

  • redis 数据结构 内部底层的实现
  • 同一个数据结构 可能背后的编码方式是不同的,会根据特定场景优化


注意:

  • redis 会自动根据当前的实际情况来选择内部编码方式,即自适应
  • 那么是否要记住 什么情况下 使用 什么编码方式 呢?
  • 只记思想,不记数字,记数字没有任何意义

原因:

  • 数字都是可自行配置的
  • 数字是怎么来的,这点需要考证清楚
  • 相比于知道数字,更重要的是知道数字是怎么得到的,就可以根据所处的实际场景,重新得到这样的数字

正确做法:

  • 根据实际的测试结果,测试出一个更合适的数值

查看 key 对应 value 的编码方式

语法:

object encoding key 

实例理解

Reids 单线程模型

  • redis 只使用一个线程,处理所有的命令请求
  • 不是说一个 redis 服务器进程内部真的就只有一个线程
  • 其实也有多个线程,多个线程是在处理 网络 IO

实例理解

  • 假设有多个客户端,同时操作一个 redis 服务器,且这两个客户端 并发 的发起请求

  • 在多线程场景下针对类似于这样的情形
  • 即 两个线程尝试同时对同一个变量进行自增操作,虽然表面上看是自增两次,但实际上可能只自增了一次
  • 但是由图可知 我们的 redis 服务器并不会存在类似的线程安全问题

原因:

  • Redis 服务器实际上是 单线程模型
  • 即保证了 服务器收到多个请求时,并会 并发执行这多个请求,而是 串行/顺序执行

补充:

  • Redis 之所以能够使用 单线程模型 也能很好的工作,其原因主要在于 Redis 的核心业务逻辑都是短平快的
  • 短 指的是 Redis 的每个操作都很简单平 指的是 Redis 的操作都很稳定快 指的是 Redis 的操作都很快
  • 所以 Redis 不太需要消耗 CPU 资源,从而也就不太需要 利用多核来提高效率了

弊端:

  • Redis 必须要特别小心 某个操作占用时间长,其可能会阻塞其他命令的执行

经典面试题

  • redis 虽然是单线程模型,但为啥效率这么高呢? 速度这么快呢?

注意:

  • 此时我们的 参照物 是相对于 数据库 而言

1、redis 访问内存,而数据库访问的是硬盘

  • 内存的访问速度 要远远大于 硬盘的访问速度

2、redis 核心功能 比 数据库的核心功能更简单

  • 数据库 对于数据的插入删除查询 均支持更复杂的功能
  • 这样的功能必然需要花费更多的开销比如针对插入删除,加之数据库中的各种约束,这都会使数据库做更多额外的工作
  • redis 干的活少,因此 redis 所提供的功能相较于 mysql 也是少了很多

3、单线程模型,避免了一些不必要的线程竞争开销

  • redis 的每个操作基本都是短平快的,即简单操作一下内存数据,并不需要消耗大量的 cpu 资源
  • 所以就算搞个多线程,对效率的提升也是不大

4、处理网络 IO 的时候,使用了 epoll 这样的 IO 多路复用机制

  • IO 多路复用本质上为一个线程可以管理多个 socket

实例理解

  • 针对 TCP 来说,每当服务器要服务一个客户端时 均需要给该客户端安排一个 socket
  • 一个服务器 服务多个客户端时,便会有多个 socket

问题:

  • 这些 socket 上都是无时不刻的在传输数据吗?

具体理解:

  • 很多情况下,每个客户端和服务器之间的通信 并不会特别频繁
  • 所以多数 socket 大部分时间都是静默的,即没有数据需要进行传输

实际情况:

  • 综上所述 对于 TCP 服务器来说,大部分 socket 都是静默的,仅只有少数 socket 是活跃的,即会进行数据传输
  • 消耗大量系统资源的同时,大量的线程 占着茅坑不拉屎由此可见效率十分低下

IO 多路复用

  • 基于上述的场景,便有了 IO 多路复用机制,即一个线程来处理多个 socket
  • 这是 操作系统给程序员提供的机制
  • 同时操作系统也提供了一套 API ,其内部的功能均由操作系统内核实现的
  • Linux 上提供的 IO 多路复用,主要是三套 API (select、poll、epoll),其中 epoll 的运行效率最高

实例理解:

  • 此时我晚饭想吃三样美食,均在同一条街道上

方案一:

  • 一个一个买

  • 相当于单线程串行执行,效率最低

方案二:

  • 我喊了两个好友,来帮我一起买

  • 相当于多线程并行执行,效率大大提升,但是系统开销大了

方案三:

  • 我一个人来买,但是我买的时候不再干等着了

  • 此时相当于一个线程同时做三件事
  • 能高效完成这三件事的前提是 这三件事的交互都不频繁,大部分时间都在等待!
  • 此处的  ' 哪样美食好了 哪个老板就喊我一声 '  相当于 epoll,即事件 通知/回调 机制

注意:

  • 如果这三件事情都是交互特别频繁的,还是需多引入几个线程,否则一个线程就容易忙不过来

补充:

  • Java 可以使用 NIO (标准库提供的一组类,底层就是封装了 epoll)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

下一站,上岸@24考研er

时间过的好快, 考研倒计时①天 去年这个时候, 我应该也是充满未知地进入即将来到的考研初试 去年,这个时候,疫情😷刚刚放开 许多人都🐑,发烧,可幸的是我受影响不大 &#x1f3…

itk中的配准整理

文章目录 Perform 2D Translation Registration With Mean Squares效果:源码: 多模态互信息配准 Perform Multi Modality Registration With Viola Wells Mutual Information效果图源码: Register Image to Another Using Landmarks 通过标记点配准图像效果图源码 Perform 2D T…

关键字:import关键字

在 Java 中,import关键字用于导入类或接口,使你可以在代码中使用它们而无需完全限定其名称。以下是使用import关键字的示例代码: 在上述示例中,通过使用import关键字导入了java.util.ArrayList类,这样就可以在代码中直…

代码图形注释自动生成(通过文字图像)

0. 简介 大家在学(CTRL)习(C)别人代码的时候,看到别人的代码程序,在日志中有很多很酷的代码注释,或者是有一些图形化注释方便理解。之前本人以为都是一个个手敲出来的。然后在网上一番搜索&…

80x86汇编—寻址方式

文章目录 术语解释8086寻址方式直数寻址寄存器间接寻址寄存器相对寻址基址变址寻址比例变址寻址方式基址比例变址寻址方式 术语解释 EA:有效地址,通过段地址:偏移地址组合得到的Effect Address 位移量:一般是常量和标号&#xff…

HTTP前端请求

目录 HTTP 请求1.请求组成2.请求方式与数据格式get 请求示例post 请求示例json 请求示例multipart 请求示例数据格式小结 3.表单3.1.作用与语法3.2.常见的表单项 4.session 原理5.jwt 原理 HTTP 请求 1.请求组成 请求由三部分组成 请求行请求头请求体 可以用 telnet 程序测…

解决xcode 运行不老iPhone 15 iOS 17.1 设备的问题

问题 最近要查看一下ios 17.1的设备的性能,但是当前版本的Xcode运行不了 解决方法 1、更新Xcode版本到15.1以上 2、更新完成后,大概率出现这个情况 原因:在app Store中更新到Xcode15后,运行不了模拟器和真机.需要下载iOS 17对应的模拟器.&…

力扣每日一题day38[106. 从中序与后序遍历序列构造二叉树]

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出:[…

Java 面试 多线程遇到的问题,如何处理

问题描述 某服务在运行过程中抛出了 RejectedExecutionException。 配置参数: corepoolsize 50, maxpoolsize 50, workqueue 为 SynchronousQueue 现象: 当新的task被拒绝时,pool size未达到配置值50. Caused by: java.util.conc…

dotnet命令创建C#项目,VSCode打开

在命令行中创建项目并运行 1.首先安装.net 下载地址:.NET | 构建。测试。部署。 2.在 cmd 控制台输入 dotnet --vesion 检查版本号是否正常 3.我用git bash环境输入命令创建项目 // 创建文件夹 mkdir MyVSCode // 进入该文件夹 cd MyVSCode/ // 创建控制台项目 dotnet …

java类和对象的思想概述

0.面向对象Object OOP——名人名言:类是写出来的,对象是new出来的 **> 学习面向对象的三条路线 java类以及类成员:(重点)类成员——属性、方法、构造器、(熟悉)代码块、内部类面向对象特征&…

【音视频】Mesh、Mcu、SFU三种框架的总结

目录 三种网络场景介绍 【Mesh】 【MCU】(MultiPoint Control Unit) 【SFU】(Selective Forwarding Unit) 三种网络架构的优缺点 Mesh架构 MCU架构(MultiPoint Control Unit) SFU架构(Selective Forwarding Unit) 总结 参考文章 三种网络场景介绍 【Mesh】 Mesh架构…

<软考高项备考>《论文专题 - 24 整合管理(2) 》

3 过程2-制订项目管理计划 3.1 问题 4W1H过程1-制定项目章程做什么定义、准备和协调项目计划的所有组成部分,并把它们整合为一份综合项目管理计划的过程;作用:生成一份综合文件,用于确定所有项目工作的基础及其执行方式为什么做…

大创项目推荐 深度学习+python+opencv实现动物识别 - 图像识别

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 inception_v3网络5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 *…

Uniapp 开发 BLE

BLE 低功耗蓝牙(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart),用于医疗保健、运动健身、安防、工业控制、家庭娱乐等领域。在如今的物联网时代下大放异彩,扮演者重要一环&#xff…

互联网账户一证通查询名下账号

核验身份后一键在线查询名下所有关联号码以及注册。 名下电话卡查询:全国移动电话卡“一证通查” 手机号绑定查询:https://tb3.cn/A3lhMk

Wavesurfer.js绘制波形图

HTML使用Wavesurfer.js 要使用wavesurfer.js,首先需要在HTML文件中引入Wavesurfer.js库,然后创建一个音频元素并将其添加到页面中。接下来,初始化Wavesurfer实例并配置相关选项。以下是一个简单的示例: 在HTML文件中引入Wavesurf…

一款外置MOS开关降压型 LED 恒流控制器应用方案

一、基本概述 TX6121 是一款高效率、高精度的降压型大功率 LED 恒流驱动控制器芯片。芯片采用固定关断时间的峰值电流控制方式,关断时间可通过外部电容进行调节,工作频率可根据用户要求而改变。 通过调节外置的电流采样电阻,能控制高亮度 LE…

【Linux笔记】用户和权限管理基本命令介绍

🍎个人博客:个人主页 🏆个人专栏:Linux学习 ⛳️ 功不唐捐,玉汝于成 目录 ​编辑 前言: 命令: whoami: passwd: useradd: userdel: chm…

深度学习数据处理(一)

在PyTorch中,torch.Tensor是存储和变换数据的主要工具。如果你之前用过NumPy,你会发现Tensor和NumPy的多维数组非常类似。然而,Tensor提供GPU计算和自动求梯度等更多功能,这些使Tensor更加适合深度学习。 张量(tensor&…