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 …

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

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

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

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

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

组件间通信方式是前端必不可少的知识点,前端开发经常会遇到组件间通信的情况,而且也是前端开发面试常问的知识点之一。接下来开始组件间通信方式第二弹------$emit,并讲讲分别在Vue2、Vue3中的表现。 Vue2Vue3组件间通信方式汇总(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

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

步兵 cocos2dx 加密和混淆

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

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

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

Jenkins 插件管理指南

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

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

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

Redis原理

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

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

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

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

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

若依vue如何展示一个HTML页面(或者展示Markdown文档)

一. 前言 ⚠ 本文是展示Markdown的方法,不能直接前端编辑Markdown文档. 二. 准备部分 用Typora编辑器打开需要导出html页面,我这里使用Typora来导出 1. 先将md文件导出成html 2. 将导出好的文件放在若依vue的pubilc下(文件可以是中文) 三. 代码部分 1.使用v-html来展示HT…

【ubuntu 22.04】安装中文版系统、中文语言包和中文输入法

在系统安装中的键盘布局选择时,选择Chinese - Chinese,此时会自动安装所有的中文语言包和ibus中文输入法系统安装成功重启后,点击设置 - 区域和语言 - 管理已安装的语言 * 根据提示安装更新后,将汉语(中国)…

HarmonyOS构建第一个ArkTS应用(Stage模型)

构建第一个ArkTS应用(Stage模型) 创建ArkTS工程 若首次打开DevEco Studio,请点击Create Project创建工程。如果已经打开了一个工程,请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发…

数据库编程大赛:一条SQL计算扑克牌24点

你是否在寻找一个平台,能让你展示你的SQL技能,与同行们一较高下?你是否渴望在实战中提升你的SQL水平,开阔你的技术视野?如果你对这些都感兴趣,那么本次由NineData主办的《数据库编程大赛》,将是…

14 款最佳文件恢复软件 [2024 年最佳精选工具]

顶级文件恢复软件的综合列表和比较。阅读此详细评论以选择最佳文件恢复工具并轻松恢复您的文件: 您在选择文件恢复工具时遇到困难吗?在阅读了对十大文件恢复软件的评论后,您可以做出正确的决定。 数据丢失是一个严重的问题,会损…

Leetcode—1491.去掉最低工资和最高工资后的工资平均值【简单】

2023每日刷题&#xff08;六十八&#xff09; Leetcode—1491.去掉最低工资和最高工资后的工资平均值 实现代码 class Solution { public:double average(vector<int>& salary) {double sum 0;int n salary.size();sort(salary.begin(), salary.end());for(int i…