【Redis】数据类型前置知识

news2024/10/7 0:27:01

文章目录

  • 前置知识
    • redis的单线程架构

前置知识

type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)、list(列表)、hash(哈希)、set(集合)、zset(有序集合),但这些只是Redis对外的数据结构

image-20231020212904847

实际上Redis针对每种数据结构都有⾃⼰的底层内部编码实现,⽽且是多种实现,这样Redis会在合适的场景选择合适的内部编码


string内部编码

image-20231020213648418

raw:最基本的字符串,底层就是char类型的数组

int:redis通常可以实现计数的功能,当value是一个整数的时候,此时可能redis会直接使用int来进行保存,此时占用空间更少,可以支持算术运算

embstr:针对短字符串进行特殊优化

hash内部编码

image-20231020213701257

hashtable:最基本的哈希表

ziplist:在哈希表里面元素比较少的时候,可能就优化成ziplist(压缩列表),能够节省空间,占用的内存更小

list内部编码

image-20231020213715184

linkedlist:链表 ziplist:压缩列表

但是从redis3.2开始,引入了新的实现方式:quicklist,同时兼顾了上述两个的优点。

  • quicklist是一个链表,每个元素又是一个ziplist,将空间和效率都兼顾到,类似C++当中的queue

set内部编码

image-20231020213726763

  • intset:集合当中存的都是整数

zset内部编码

image-20231020213740376

  • skiplist:跳表也是链表,但是每个节点上有多个指针域,巧妙的搭配这些指针域的指向,可以做到从跳表上查询元素的时间复杂度是 O ( l o g N ) O(logN) O(logN)

可以看到每种数据结构都有⾄少两种以上的内部编码实现,比如list数据结构,包含了linkedlist和ziplist两种内部编码,可以通过:object encoding命令查询内部编码,redis会根据当前的实际情况选择内部的编码方式,自动进行适应

image-20231020214643870

redis这样设计的好处:

  • 1)可以改进内部编码,⽽对外的数据结构和命令没有任何影响,这样⼀旦开发出更优秀的内部编码,⽆需改动外部数据结构和命令,例如Redis3.2提供了quicklist,结合了ziplist和linkedlist两者的优势,为列表类型提供了⼀种更为优秀的内部编码实现,⽽对⽤⼾来说基本⽆感知
  • 2)多种内部编码实现可以在不同场景下发挥各⾃的优势,例如ziplist⽐较节省内存,但是在列表元素⽐较多的情况下,性能会下降,这时候Redis会根据配置选项将列表类型的内部实现转换为linkedlist,整个过程⽤⼾同样⽆感知

redis的单线程架构

Redis使⽤了单线程架构来实现⾼性能的内存数据库服务,例如:宏观上,三个客户端同时请求redis服务,微观上:客⼾端是有前后次序的,虽然顺序不确定

image-20231020214918205

正是因为redis服务器是单线程模型,所以保证了收到的多个请求是串行执行的,多个请求到达redis服务器,需要先在队列当中排队,在等待redis服务器一个一个的取出里面的命令再执行(串行+顺序的执行)

为什么单线程也能这么快

1)纯内存访问。Redis将所有数据放在内存中,内存的响应时⻓⼤约为100纳秒,这是Redis达到每秒万级别访问的重要基础

2)⾮阻塞IO。Redis使⽤epoll作为I/O多路复⽤技术的实现,再加上Redis⾃⾝的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在⽹络I/O上浪费过多的时间,网络IO由eoll负责

image-20231020215053054

3)单线程避免了线程切换和竞态产⽣的消耗。单线程可以简化数据结构和算法的实现,让程序模型更简单;其次多线程避免了在线程竞争同⼀份共享数据时带来的切换和等待消耗


缺陷

对于单个命令的执⾏时间都是有要求的。如果某个命令执⾏过⻓,会导致其他命令全部处于等待队列中,迟迟等不到响应,造成客⼾端的阻塞,对于Redis这种⾼性能的服务来说是⾮常严重的,所以Redis的核心业务逻辑是⾯向快速执⾏场景的

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

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

相关文章

各位社区工作者!打工而已,不要太上头!!

社工家人们,打工而已,不要太上头!咱能偷懒的就偷懒啊! 合情合理的偷懒不仅让你更轻松,工作效率还会提高,何乐而不为呢!!就比如说各种报告啊,活动方案这些啊,…

Latex编辑记录

1 第一段默认是不首行缩进的 在最前面合适的地方,也即是有usepackage类似定义的地方粘贴下列语句 \usepackage{indentfirst} 然后在要首行缩进的地方,放下面这个语句即可 \setlength{\parindent}{2em} 2 公式编辑 3 对文本高亮标记 \usepackage{soul}…

【前端设计】HTML+CSS+JavaScript基本特性

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

阿里云上传

/*** 上传图片** param file 文件* return* throws Exception*/ PostMapping(value "/aliUpload") ResponseBody public AjaxResult aliUpload(MultipartFile file){//获取文件后缀String extension FileUploadUtils.getExtension(file);String imgFormat "{…

虹科分享 | AR眼镜开启工业创新之旅!

文章来源:虹科数字化与AR 阅读原文:https://mp.weixin.qq.com/s/3qBr44ZYWpNaU8xPBBlEYA AR眼镜,开启无限创新之旅! 智能AR眼镜被视为在工业应用中带来最大益处的智能设备之一。它不仅能够解放双手,提高工作效率&…

解决Visual Studio Code 控制台中文乱码问题

C和CPP运行编码指定 "code-runner.executorMap": {"c": "cd $dir && gcc -fexec-charsetGBK $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt","cpp": "cd $dir && g -fexec-charsetGBK $…

【Mysql系列】从零开始学MySQL:Docker部署快速上手

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【代码学习】voxel 或者 pillar,稀疏张量 转 稠密张量 的代码理解,理解了很久

需要 feature 和 对应 的坐标 coords debug:转置,不然维度不匹配! 对应的代码,向量化 应该 比 for循环快 def voxel_indexing(self, sparse_features, coords): # sparse_features: [N, C], coords:[N, 4]dim sparse_features.…

前端学习之webpack的使用

概述 webpack是一个流行的前端项目构建工具(打包工具),可以解决当前web开发中所面临的问题。 webpack提供了友好的模块化支持,以及代码压缩混淆、处理js兼容问题、性能优化等强大的功能,从而让程序员把工作重心放到具…

华为是怎么做全面预算管理的?

大家好,我是老原。 在之前的文章分享中,都穿插着一个很重要但是不被你们重视的的部分,就是预算管理这块。 有很多新手项目经理在做计划的时候,发现自己设备和步骤都不熟悉,根本无从下手,不知道怎么做。 …

大模型 其他方案的进度

Llama2 1、中文提问,英文的回答,对于中文不友好 2、网上还没有看到很详细的微调教程 3、虽然Llama2的预训练数据相对于第一代LLaMA扩大了一倍,但是中文预训练数据的比例依然非常少,仅占0.13%,这也导致了原始Llama2的中…

启用 EGO 的 LSF

启用 EGO 的 LSF 具有 LSF 的企业网格协调器(enterprise grid orchestrator EGO)能够提供系统基础结构,来控制和管理集群资源。 资源是应用程序使用的物理和逻辑实体。 LSF 资源按照 EGO资源分配计划中的定义进行共享。 一、EGO 组件概览 …

antd Cascader级联菜单无法赋值回显问题

说起来太丢人了,自己还拿官网例子在这里调试半天,最后发现是一个特别小儿科的问题哈哈 Cascader级联数据是服务端返回然后自己处理过的,使用了cascader的fileNames属性重置字段名,最后发现服务端回传的数据无法赋值回显在组件上&…

python如何使用gspread读取google在线excel数据?

一、背景 公司使用google在线excel管理测试用例,为了方便把手工测试用到的测试数据用来做自动化用例测试数据,所以就想使用python读取在线excel数据,通过数据驱动方式,完成自动化回归测试,提升手动复制,粘…

Swing自定义标题栏

文章目录 Swing自定义标题栏需求最终效果如图步骤额外需求 Swing自定义标题栏 需求 想要实现IDEA类似的标题栏效果&#xff0c;菜单栏放在标题栏同一行&#xff0c;标题居中&#xff0c;右侧为按钮。如图&#xff1a; 最终效果如图 步骤 使用依赖FlatLaf <!-- https://mvn…

虚拟串口软件使用介绍

对于上位机开发来说(特别是串口通信应用),上机位软件的调试尤为重要,但是上机位软件的调试并不关心硬件,只需要关注验证发送的数据帧的接收情况,为了便于调试,可以将上机位软件与串口软件互通,实现数据的交互,但由于互通需要串口,可以借助串口虚拟软件(VSPD),虚拟出…

lazada商品评论API接口(评论内容|日期|买家昵称|追评内容|评论图片|评论视频..)

Lazada商品评论API接口是Lazada开放平台提供的一种API接口&#xff0c;可以帮助开发者获取Lazada平台上的商品评论数据。 通过该接口&#xff0c;开发者可以获取到用户对商品的评论信息&#xff0c;包括评论内容、评价等级、评论时间等&#xff0c;从而了解用户对商品的反馈和…

用android studio调试react native中的原生代码(windows+android)

要用Android Studio调试React Native原生代码&#xff0c; 1. 需要先在终端中运行react-native start命令启动React Native服务器。 2. 然后&#xff0c;在Android Studio中打开你的React Native项目&#xff08;\android\build.gradle&#xff09;&#xff0c;连接你的设备或…

修改YOLOv5的模型结构

YOLOv5 模型结构 C3模块结构图 修改目标 修改目标是移除C3模块concat后的卷积操作 YOLOv5的模型存储在项目目录下的models目录中。 一些以yaml为后缀的文件保存了一些模型的超参数&#xff0c;通过不同的参数&#xff0c;形成了yolov5s,yolov5n,yolov5l等不同参数等级&#…

【java零基础入门到就业】第四天:Notepad++软件的下载和安装

文章目录 Notepad软件简介下载安装 Notepad软件 简介 Notepad&#xff08;又称Notepad Plus Plus&#xff09;是一款免费的文本编辑器&#xff0c;是Windows操作系统下非常受欢迎的开源软件。它提供了许多强大的功能&#xff0c;适合用于编写各种编程语言的源代码、编辑文本文…