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.hqwc.cn/news/294111.html

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

相关文章

深入了解 Android 中的应用程序签名

深入了解 Android 中的应用程序签名 一、应用程序签名介绍1.1 应用程序签名1.2 应用程序签名的意义1.3 应用程序签名的流程1.4 应用程序签名的方案1.5 签名的重要性和应用场景 二、AOSP 的应用签名2.1 AOSP的应用签名文件路径2.2 应用程序指定签名文件 三、Android Studio 的应…

GIT具体配置步骤详解

GIT配置具体步骤如下 SDK 使用 Repo 工具管理,拉取 SDK 需要配置安装 Repo 工具。 Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workf…

php学习01-Hello World

开发环境搭建 参考 如果没有搭建的请参考上面的文章进行搭建 新建index.php <?php echo Hello World; ?>访问 修改index.php代码 <?php phpinfo() //主要是用来打印php的一些配置信息方便后期排查配置是否正确以及插件是否开启 ?>

IP应用场景的规划

IP地址作为互联网通信的基石&#xff0c;在现代社会中扮演着至关重要的角色。本文将深入探讨IP地址在不同应用场景中的规划与拓展&#xff0c;探讨其在网络通信、安全、商业、医疗和智能城市等领域的关键作用与未来发展趋势。 IP地址的基本原理 IP地址是分配给网络上设备的数…

输电线路定位:应对复杂环境,确保电力传输畅通无阻

在现代社会&#xff0c;电力作为我们生活和工业生产的重要能源&#xff0c;其安全、稳定、高效的传输显得尤为重要。而输电线路的定位与监测&#xff0c;正是保障电力传输畅通无阻的关键环节。恒峰智慧科技将详细介绍输电线路分布式故障定位及隐患监测装置HFP-GZS2000的技术原理…

万界星空开源MES/注塑MES/开源注塑MES/免费MES/MES源码

一、系统概述&#xff1a; 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、适合二开的开源MES、好看的数据大屏、功能齐全开源mes. 1.万界星空开源MES制造执行系统的Java开源版本。 开源mes系统包括系统管理&#xff0c;车间基础数据管理&…

nodejs+vue+ElementUi家政服务系统c90g5

项目中登录模块用到token家政服务平台有管理员&#xff0c;雇主&#xff0c;雇员三个角色。管理员功能有个人中心&#xff0c;雇主管理&#xff0c;雇员管理&#xff0c;资料认证管理&#xff0c;项目类型管理&#xff0c;服务项目管理&#xff0c;需求信息管理&#xff0c;服务…

BUUCTF-Linux Labs

Linux Labs 根据题目给出的内容&#xff0c;在kali中连接靶机&#xff0c;输入密码进入命令行模式 ls发现什么都没有&#xff0c;有可能进入到了一个空文件夹 cd .. 切换到上一层目录&#xff0c;ls查看此目录下的内容&#xff0c;发现flag.txt文件&#xff0c;查看文件是flag …

消除蛋蛋派

欢迎来到程序小院 消除蛋蛋派 玩法&#xff1a;消除游戏&#xff0c;三个相同形状的蛋蛋连成一条直线即可消除&#xff0c;点击鼠标左键移动球球进行消除&#xff0c; 可以使用道具&#xff0c;共有50关卡&#xff0c;快去闯关吧^^。开始游戏https://www.ormcc.com/play/gameS…

iOS 开发设计 App 上架符合要求的截图

1. 真机运行截屏 2. 可以在 Apple developer 官网 Design 下找到 iPhone 边框 https://developer.apple.com/design/resources/ 不用这个边框也行&#xff0c;可以参考已上架 App 的图片框 3. 使用 Procreate&#xff08;PhotoShop&#xff09;创建符合要求的画布大小 4. 导入…

2024年ICON设计趋势

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 目录 极简主义 三维形式和现实主义 抽象主义与几何 微交互和动画 艺术装饰 有机和可持续 颗粒感美学 图标设计最佳实践 图标在品牌塑造中的作用 图标是用…

spring aop实际开发中怎么用,Spring Boot整合AOP,spring boot加spring mvc一起使用aop,项目中使用aop

前言&#xff1a;本文不介绍 AOP 的基本概念、动态代理方式实现 AOP&#xff0c;以及 Spring 框架去实现 AOP。本文重点介绍 Spring Boot 项目中如何使用 AOP&#xff0c;也就是实际项目开发中如何使用 AOP 去实现相关功能。 如果有需要了解 AOP 的概念、动态代理实现 AOP 的&…