【Redis——数据类型和内部编码和Redis使用单线程模型的分析】

文章目录

  • Redis的数据类型和内部编码
  • 单线程模型的工作过程
  • Redis在处理命令时虽然是一个单线程模型,为啥效率那么高,速度快呢?


在这里插入图片描述
在这里插入图片描述
总而言之,Redis提供的哈希表容器并不一定真的是真的哈希表,而是在特点的场景下,用别的容器去实现,为了保证时间复杂度符合承诺(就是为了高效)

Redis的数据类型和内部编码

在这里插入图片描述

string
(由于只学过C++,这里只站在C++的角度理解Redis中的数据结构

  • raw:最基本的字符串,底层就是持有一个char数组(C++)。
  • int:当value是一个整数时,此时redis可能用int来保存。
  • embstr:针对短字符串进行的特殊优化。

以上内部编码方式Redis会自动适应,在使用时感知不到。

hash:

  • hashtable:虽然有可能实现方式不太一样,但是整体的思想跟C++的哈希表是一样的。
  • ziplist:压缩列表,在哈希表元素较少的时候,可能优化成ziplist压缩列表,就能够节省空间。因为元素较少,所以遍历的时候仍然能视为O(1)的时间复杂度。

为啥要压缩,为啥要节省时间呢?
因为在key特别多的情况下,如果key对应的value都是哈希表,则对应的hash也特别多,但是每个hash又不大的情况下,就可以将这些hash压缩,让整体占用内存更少。

list:

  • linkedlist:链表,就是数据结构中熟悉的那个链表,包括单链表,双链表。
  • ziplist:如果元素个数少,就用压缩列表实现,因为节省空间,如果元素个数多,那就会用链表。
    从redis3.2版本开始,引入了新的实现方式:quicklist,这个就同时兼顾了linkedlist和ziplist的优点。
    可以认为quicklist就是一个链表,链表的每个元素是ziplist。这样的折中方案把空间和效率都兼顾了。
    所以quicklist就比较像C++的deque。

set:

  • hashtable:这个跟前面那个讲解一样,看上面那个即可。
  • intset:针对特定场景的优化:比如集合中都是一个整数,就优化成intset

zset:

  • skiplist:跳表。在链表的笔试题中,有一道题叫做:“复杂链表的复制”,除了有一个next指向下一个节点外,还有一个Random节点指向其他随机节点。这里的跳表同理,每个节点上有多个指针域的指向,巧妙的搭配这些指针域的指向,就能做到查找时的时间复杂度O(logN)

  • ziplist:看上面的解释

通过object encoding key来查看key对应的value的编码方式。
比如:

set key1 1
object encoding key1,可以得到key1对应的value的编码方式是int

单线程模型的工作过程

在这里插入图片描述

Redis在处理命令时虽然是一个单线程模型,为啥效率那么高,速度快呢?

(这里不是说Redis是单线程,虽然在早期版本确实是单线程,但是在后面的版本中,Redis引入了多线程来保证网络IO,持久化等,但是处理命令时,仍然是单独开一个线程专门处理的)
(面试题)(说Redis快的参照物是关系型数据库:MySQL等)

  • 1.redis访问内存,MySQL访问硬盘。
  • 2.redis的核心功能比数据库的核心功能简单。比如针对插入删除,数据库的各种约束(主键约束,外键约束),在插入时,会先判断在不在,判断完成后,还得找个位置插入。这样同样又会有消耗。
  • 3.单线程模型避免了不必要的线程竞争开销。Redis的每个基本操作都是短平快的,就是简单地操作内存,没多大消耗CPU,就算搞个多线程提升不大(具体得看业务场景)。
  • 4.处理网络IO时,使用了epoll的I/O多路复用。一个线程可以管理多个socket,对TCP来说,当客户端到来时,都要给该客户端设置一个socket,并且在很多情况下,大部分客户端的通信并没有那么频繁,而是仅仅有少量客户端是活跃的。但是在传统的IO时,是为一个客户端创建一个线程专门服务的。而大部分客户端只发了几次数据就不活跃了。此时线程也会被阻塞住,而线程创建,销毁,调度都是消耗性能的操作。所以使用I/O多路服用,让一个线程同时监听处理多个socket,大大提高了效率。(但是,一个线程监听多个socket是只有当这些socket只有少量是活跃的时候才能这样做。否则这些socket如果同时非常活跃,就可能导致线程忙不过来。打游戏+和女朋友打电话的例子)

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

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

相关文章

鸿蒙NEXT开发动画(风格的旋转加载动画组件)

1.创建空白项目 2.Page文件夹下面新建Spin.ets文件,代码如下: /*** SpinKit 风格的旋转加载动画组件。** component* param spinSize - 动画容器大小(必须为正数)* param spinColor - 动画颜色(支持资源引用&#xf…

后端接口请求http改为https

1、使用 OpenSSL 生成自签名证书 在Linxu服务器上执行如下命令: openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes 运行此命令后,会提示输入一些信息(如国家、省份、城市、组织名称等)&…

工作记录 2017-12-12 + 在IIS下发布wordpress

工作记录 2017-12-12 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 在IIS下发布wordpress。 郝 服务器更新 RD服务器更新了,更新的文件放在190的D:\Temp\CHTeam\fnehr_update_20171212\下了。 数据库更新: 数据库没有更新 更新的文件&#xf…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】1.2 安装与配置PostgreSQL(Windows/Linux/macOS)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 1.2 安装与配置 PostgreSQL(Windows/Linux/macOS)1.2.1 操作系统兼容性与硬件要求1.2.2 Windows 安装与配置1.2.2.1 安装步骤1.2.2.2 服务管理1.2.2.3 配置文件路径1.2.3 Linux 安装与配置(以 Ubuntu…

epub格式转txt格式工具,txt批量转PDF

epub格式转txt格式工具,功能如图: txt格式批量转PDF 参考原文:epub格式转txt格式工具,txt批量转PDF 轻轻一点就关注, 好运连连挡不住,点个关注吧。

56.[前端开发-前端工程化]Day03-webpack构建工具

邂逅Webpack和打包过程 1 认识webpack工具 前端开发的流程 内置模块path path常见的API 在webpack中的使用 认识webpack 脚手架依赖webpack Webpack到底是什么呢 Webpack官方的图片 Vue项目加载的文件有哪些呢? Webpack的使用前提 Webpack的安装 2 webpack基本打包…

Rockchip Android平台打开GKI无法开机问题

Rockchip Android平台打开GKI无法开机问题 问题描述 Rockchip Android平台由于编译环境对pahole版本有要求,如果版本不对会导致ko无法加载从而导致系统无法开机。pahole的版本具体要求如下: Android版本pahole版本Android12/13版本pahole v1.21Androi…

SQL命令二:SQL 高级查询与特殊算法

引言 在掌握了 SQL 的基础操作和建表约束后,我们可以进一步探索 SQL 的高级查询功能和一些特殊算法。这些高级技巧能够帮助我们更高效地处理和分析数据,满足复杂的业务需求。 一、查询进阶 (一)简单查询 简单查询通过 select 语…

HTML04:图像标签

图像标签 常见的图像标签 JPGGIFPNGBMP <img src"路径" alt"名称" title"悬停名称" width"高" height"宽"/><!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&quo…

Docker —— 技术架构的演进

Docker —— 技术架构的演进 技术架构演进总结单机架构优点缺点总结 应用数据分离架构优点缺点总结 应用服务集群架构1. Nginx2. HAProxy3. LVS&#xff08;Linux Virtual Server&#xff09;4. F5 BIG-IP对比总结选型建议 读写分离/主从分离架构1. MyCat简介 2. TDDL&#xff…

[machine learning] Transformer - Attention (一)

Attention是Transformer的核心&#xff0c;本系列先通过介绍Attention来学习Transformer。本文先介绍简单版的Attention。 在Attention出现之前&#xff0c;通常使用recurrent neural networds (RNNs)来处理长序列数据。模型架构上&#xff0c;又通常使用encoder-decoder的结构…

Android 输入控件事件使用示例

一 前端 <EditTextandroid:id="@+id/editTextText2"android:layout_width="match_parent"android:layout_height="wrap_content"android:ems="10"android:inputType="text"android:text="Name" />二 后台代…

【向量数据库】用披萨点餐解释向量数据库:一个美味的技术类比

文章目录 前言场景设定&#xff1a;披萨特征向量化顾客到来&#xff1a;生成查询向量相似度计算实战1. 欧氏距离计算&#xff08;值越小越相似&#xff09;2. 余弦相似度计算&#xff08;值越大越相似&#xff09; 关键发现&#xff1a;度量选择影响结果现实启示结语 前言 想象…

人工智能和机器学习在包装仿真中的应用与价值

引言 随着包装成为消费品关键的差异化因素&#xff0c;对智能设计、可持续性和高性能的要求比以往任何时候都更高 。为了满足这些复杂的期望&#xff0c;公司越来越多地采用先进的仿真方法&#xff0c;而现在人工智能 (AI) 和机器学习 (ML) 又极大地增强了这些方法 。本文探讨…

【人工智能】深入探索Python中的自然语言理解:实现实体识别系统

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 自然语言理解(NLU)是人工智能(AI)领域中的重要研究方向之一,其目标是让计算机理解和处理人类语言。在NLU的众多应用中,实体识别(Nam…

个人健康中枢的多元化AI硬件革新与精准健康路径探析

在医疗信息化领域,个人健康中枢正经历着一场由硬件技术革新驱动的深刻变革。随着可穿戴设备、传感器技术和人工智能算法的快速发展,新一代健康监测硬件能够采集前所未有的多维度生物数据,并通过智能分析提供精准的健康建议。本文将深入探讨构成个人健康中枢的最新硬件技术,…

深入了解Linux系统—— 进程切换和调度

前言&#xff1a; 了解了进程的状态和进程的优先级&#xff0c;我们现在来看进程是如何被CPU调度执行的。 在单CPU的系统在&#xff0c;程序是并发执行的&#xff1b;也就是说在一段时间呢&#xff0c;进程是轮番执行的&#xff1b; 这也是说一个进程在运行时不会一直占用CPU直…

阿里云服务迁移实战: 06-切换DNS

概述 按前面的步骤&#xff0c;所有服务迁移完毕之后&#xff0c;最后就剩下 DNS 解析修改了。 修改解析 在域名解析处&#xff0c;修改域名的解析地址即可。 如果 IP 已经过户到了新账号&#xff0c;则不需要修改解析。 何确保业务稳定 域名解析更换时&#xff0c;由于 D…

uni-app 中封装全局音频播放器

在开发移动应用时&#xff0c;音频播放功能是一个常见的需求。无论是背景音乐、音效还是语音消息&#xff0c;音频播放都需要一个稳定且易于管理的解决方案。在 uni-app 中&#xff0c;虽然原生提供了 uni.createInnerAudioContext 方法用于音频播放&#xff0c;但直接使用它可…

golang常用库之-标准库text/template

文章目录 golang常用库之-标准库text/template背景什么是text/templatetext/template库的使用 golang常用库之-标准库text/template 背景 在许多编程场景中&#xff0c;我们经常需要把数据按照某种格式进行输出&#xff0c;比如生成HTML页面&#xff0c;或者生成配置文件。这…