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

目录

各数据结构具体编码方式

查看 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.mzph.cn/news/240463.shtml

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

相关文章

计算机网络概述(下)——“计算机网络”

各位CSDN的uu们你们好呀,今天继续计算机网络概述的学习,下面,让我们一起进入计算机网络概述的世界吧!!! 计算机网络体系结构 数据传输流程 计算机网络性能指标 计算机网络体系结构 两个计算机系统必须高度…

7.4组合总和(LC39-M)

算法: 组合问题,用回溯。 画树 回溯三部曲: 1.确定函数返回值和参数: 返回值:void 参数: candidates, target(题目中给出的) sum:统计每个组合的和,是否target …

5G NTN:通信新天地,卫星通信的奇妙探索

导言: 嗨,大家好!今天我们要深入了解一项让通信更强大的技术——5G NTN。它和卫星通信结合在一起,为我们带来了通信的新时代。在这篇文章中,我们将用白话文揭示5G NTN和卫星通信的关系,探索这个通信世界的奇…

鞋服用户运营策略如何实现有效闭环?

实现长期价值和业务闭环是企业经营的关键。对于鞋服行业来说,如何基于客户旅程编排(Customer Journey Orchestration,简称 CJO)实现用户运营策略的有效闭环,提升长期价值呢? 本文围绕该主题,从鞋…

Ai 会替代人类工作吗?

目录 一、分析 二、一些案例 三、总结 一、分析 人工智能(AI)的发展和应用正在改变我们的生活和工作方式。在某些领域,AI已经显示出了强大的能力和潜力,可以比人类更快、更准确地完成任务。然而,是否会完全取代人类…

Golang leetcode59 螺旋矩阵

螺旋矩阵 leetcode59 初次尝试&#xff0c;从中心向外 func main() {n : 3fmt.Println(generateMatrix(n)) }// 初版&#xff0c;我们从中心点开始 func generateMatrix(n int) [][]int {//1.nXn矩阵table : make([][]int, n)for i : 0; i < n; i {table[i] make([]int, …

C语言——小细节和小知识6

一、转义字符相关 \ 反斜杠&#xff0c;转义字符中的转义序列符 \? 将?转义&#xff0c;防止他被识别成三字母词(很早的东西)中的问号 //三字母词 //??(是[ //??)是] printf("%s","??(??)"); //打印结果是[] 二、fopen函数fc…

Vue2+Vue3组件间通信方式汇总(2)------$emit

组件间通信方式是前端必不可少的知识点&#xff0c;前端开发经常会遇到组件间通信的情况&#xff0c;而且也是前端开发面试常问的知识点之一。接下来开始组件间通信方式第二弹------$emit,并讲讲分别在Vue2、Vue3中的表现。 Vue2Vue3组件间通信方式汇总&#xff08;1&#xff0…

【C++】STL 容器 - stack 堆栈容器 ① ( stack 堆栈容器特点 | stack 堆栈容器与 deque 双端数组容器对比 | 简单示例 )

文章目录 一、 stack 堆栈容器简介1、stack 堆栈容器引入2、stack 堆栈容器特点3、stack 堆栈容器与 deque 双端数组容器对比 二、 代码示例 - stack 堆栈容器简单示例1、代码示例2、执行结果 一、 stack 堆栈容器简介 1、stack 堆栈容器引入 C 语言中的 STL 标准模板库 中的 s…

ABS210-ASEMI手机适配器整流桥ABS210

编辑&#xff1a;ll ABS210-ASEMI手机适配器整流桥ABS210 型号&#xff1a;ABS210 品牌&#xff1a;ASEMI 封装&#xff1a;ABS-4 特性&#xff1a;贴片、整流桥 最大平均正向电流&#xff1a;2A 最大重复峰值反向电压&#xff1a;1000V 恢复时间&#xff1a;&#xff…

步兵 cocos2dx 加密和混淆

文章目录 摘要引言正文代码加密具体步骤代码加密具体步骤测试和配置阶段IPA 重签名操作步骤 总结参考资料 摘要 本篇博客介绍了针对 iOS 应用中的 Lua 代码进行加密和混淆的相关技术。通过对 Lua 代码进行加密处理&#xff0c;可以确保应用代码的安全性&#xff0c;同时提高性…

paddle 54 从PaddleClas2.5初始化模型用于迁移学习(LeViT、ReXNet、EfficientNet等)

随着PaddleClas版本代码的迭代,博主以前的一些代码在使用上出现了bug,导致无法初始化模型,具体涉及paddle 42 将任意paddleclas模型作为paddledetection中的backbone使用代码的使用,为此重新对最新的PaddleClas代码进行梳理,实现重新初始化PaddleClas中的模型。 在迁移学…

Xcode15 iOS 17 Simulator 离线安装,模拟器安装

Xcode 15 安装包的大小相比之前更小&#xff0c;因为除了 macOS 的 Components&#xff0c;其他都需要动态下载安装&#xff0c;否则提示 iOS 17 Simulator Not Installed。 如果不安装对应的运行模拟库 无法真机和模拟器运行&#xff0c;更无法新建项目。但是由于模拟器安装包…

Jenkins 插件管理指南

目录 常用插件 插件安装 已安装插件 installed plugins 常用插件 Docker Plugin&#xff1a; 这个插件让Jenkins能够与Docker容器平台进行集成。它允许在Jenkins构建过程中创建、管理和销毁Docker容器&#xff0c;为需要Docker化的项目提供了极大的便利性。对于需要在容器中…

C语言—每日选择题—Day54

指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博客 第一题 1. 存在int类型变量x&#xff0c;y&#xff0c;z&#xff0c;其对应值为x0x59&#xff0c;y0x39&#xff0c;z0x6E&#xff0c;则x * y z的值…

反序列化漏洞原理、成因、危害、攻击、防护、修复方法

反序列化漏洞是一种安全漏洞&#xff0c;它允许攻击者将恶意代码注入到应用程序中。这种漏洞通常发生在应用程序从不安全的来源反序列化数据时。当应用程序反序列化数据时&#xff0c;它将数据从一种格式&#xff08;例如JSON或XML&#xff09;转换为另一种格式&#xff08;例如…

Redis原理

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

广州华锐互动:VR元宇宙技术为汽车行业带来革命性变化

随着科技的飞速发展&#xff0c;VR元宇宙技术已经深入影响到我们生活的方方面面&#xff0c;汽车行业更是深受其益。这一新兴技术的出现&#xff0c;为汽车行业带来了前所未有的变化。广州华锐互动将VR技术应用于汽车行业&#xff0c;研发了VR汽修培训、3D汽车展厅、特种车辆3D…

Redis的五种存储类型以及常用的用途

String 存储session、token&#xff0c;地址信息&#xff0c;分布式锁的实现 list 列表 set 共同关注、共同好友 Hsah 购物车信息 zset 排行榜

【NI-RIO入门】理解Windows、Real Time与FPGA之间数据通信的原理

于NI kb摘录 1.概述 对于NI RIO系列设备&#xff08;CompactRIO、sbRIO、myRIO等&#xff09;进行编程时&#xff0c;需要注意有三个不同的组件。 人机界面 (HMI) 。有时称为“主机”&#xff0c;为用户提供图形用户界面&#xff08;GUI&#xff09;&#xff0c;用于监控系统…