Redis——常见数据结构与单线程模型

Redis中的数据结构

Redis中所有的数据都是基于key,value实现的,这里的数据结构指的是value有不同的类型。

当前版本Redis支持10种数据类型,下面介绍常用的五种数据类型
在这里插入图片描述

底层编码

Redis在实现上述数据结构时,会在源码有特定的优化,保证用户进行增删查改的操作时的时间复杂度为O(1)

数据类型内部编码
stringraw, int, embstr
hashhashtable, ziplist
listlinkedlist, ziplist
sethashtable, intset
zsetskiplist, ziplist

string

raw:底层是字节数组或者字符数组
int:用来计数,当value是整数时,可以直接用int保存
embstr:针对于短字符串的特殊优化,可以占据更小的空间,一般来说,如果字符串小于39字节,使用embstr,超过则用raw

hash

hashtable:基本的哈希表
ziplist:压缩列表,当哈希表中的数据比较少时,优化为ziplist节省空间

list

linkedlist:链表
ziplist:压缩列表

事实上,从3.2版本后,Redis引入了quicklist,代替了linkedllist和ziplist,quicklist整体上是一个链表,链表中的每个节点是ziplist

set

hashtable:基本的哈希表
intset:如果集合中存放的都是整数就会优化为intset

zset

skiplist:本质上还是一个链表,但每个节点中有多个指针域,通过不同的指针域可以实现快速的检索元素,时间复杂度为O(logN)
ziplist:压缩列表

object encoding key

通过上面这个命令,可以查看key对应的实际编码方式
在这里插入图片描述

单线程模型

Redis只使用一个线程处理所有的命令,而其他的线程处理网络io
在这里插入图片描述
当redis服务器同时收到两个客户端对同一个变量的自增请求,但是由于Redis是单线程模型,因此多个请求要先在队列中排队,最终Redis还是串行的执行多个命令。

Redis之所以能够使用单线程工作,是因为Redis中的业务都是短小精悍的,每条指令都效率很高,并不会消耗过多的cpu资源。我们使用Redis时也需要保证没有请求占用时间特别长的操作,这样就会阻塞其他的命令

Redis中指令效率高的原因

  1. redis是访问内存,而数据库访问的是硬盘
  2. redis核心功能比数据库中的核心功能更加简单(例如数据库中的各种约束都会导致额外的开销)
  3. 单线程模型中避免了线程竞争的开销,减少了cpu的开销
  4. 处理网络io使用了epoll多路复用机制(一个线程管理多个socket)

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

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

相关文章

Docker数据卷容器

1.数据卷容器介绍 即使数据卷容器c3挂掉也不会影响c1和c2通信。 2.配置数据卷容器 创建启动c3数据卷容器,使用-v参数设置数据卷。volume为目录,这种方式数据卷目录就不用写了,直接写宿主机目录。 创建c1、c2容器,使用–volum…

三星霸主地位“无可撼动“,DRAM内存市场份额创近 9 年新低仍第一

三星电子在DRAM市场的竞争地位一直备受关注。据报告显示,除了市场份额下降外,三星电子在上半年的销售额也出现了下滑。这主要是由于全球消费电子产品需求下滑,导致三星电子的芯片需求减少。 存储芯片业务所在的设备解决方案部门的营收和利润也…

24届近3年上海电力大学自动化考研院校分析

今天给大家带来的是上海电力大学控制考研分析 满满干货~还不快快点赞收藏 一、上海电力大学 学校简介 上海电力大学(Shanghai University of Electric Power),位于上海市,是中央与上海市共建、以上海市管理为主的全日…

经典人体模型SMPL介绍(一)

SMPL是马普所提出的经典人体模型,目前已成为姿态估计、人体重建等领域必不可少的基础先验。SMPL基于蒙皮和BlendShape实现,从数千个三维人体扫描结果得来,后通过PCA统计学习得来。 论文:SMPL: A Skinned Multi-Person Linear Mode…

基于Python的HTTP代理爬虫开发初探

前言 随着互联网的发展,爬虫技术已经成为了信息采集、数据分析的重要手段。然而在进行爬虫开发的过程中,由于个人或机构的目的不同,也会面临一些访问限制或者防护措施。这时候,使用HTTP代理爬虫可以有效地解决这些问题&#xff0…

普华永道踩坑MOVEit漏洞,泄露银行8万名储户的信息

8月14日,波多黎各自治区最大的银行——人民银行向缅因州司法部长提交了一份客户信息泄露报告。该报告指出,由于供应商普华永道使用的MOVEit软件存在安全漏洞,导致银行82217名储户的个人信息被泄露。 目前,波多黎各人民银行已经陆续…

javaScript:数组方法(增删/提取类/截取/操作方法等)

目录 一.数组的增删方法 1.push()数组末尾添加元素 解释 代码 运行截图 2.unshift()向数组的头部添加数组 解释 代码 运行截图 3.pop()数组的尾部删除一个元素 解释 代码 运行截图 4.shift()数组的头部删除一个元素 解释 代码 运行截图 5. splice()任意位…

使用 Visual Studio Code 调试 CMake 脚本

之前被引入到 Visual Studio 中的 CMake 调试器,现已在 Visual Studio Code 中可用。 也就是说,现在你可以通过在 VS Code 中安装 CMake 工具扩展,来调试你的 CMakeLists.txt 脚本了。是不是很棒? 背景知识 Visual C 开发团队和 CMake 的维…

最全的【DDD领域建模】小白学习手册(文末附资料)

1、前言: 在当时的环境下,单体应用仍然是市场的主体,但是大型复杂软件系统已经出现,给团队的设计和开发工作带来了比较大的挑战。 DDD提供了一种新的设计思路,通过对于业务子域和限界上下文的划分,建立跨…

【Oracle 数据库 SQL 语句 】积累1

Oracle 数据库 SQL 语句 1、分组之后再合计2、显示不为空的值 1、分组之后再合计 关键字: grouping sets ((分组字段1,分组字段2),()) select sylbdm ,count(sylbmc) a…

【数据结构OJ题】链表中倒数第k个结点

原题链接:https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId13&&tqId11167&rp2&ru/activity/oj&qru/ta/coding-interviews/question-ranking 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 …

进程间通信——信号

信号的概念 信号是 Linux进程间通信的最古老的方式之一,是事件发生时对进程的通知机制,有时也称之为软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式。信号可以导致一个正在运行的进程被另一个正在运行的异…

手机商城网站的分析与设计(论文+源码)_kaic

目录 摘 要 1 1 绪论 2 1.1选题背景意义 2 1.2国内外研究现状 2 1.2.1国内研究现状 2 1.2.2国外研究现状 3 1.3研究内容 3 2 网上手机商城网站相关技术 4 2.1.NET框架 4 2.2Access数据库 4 2.3 JavaScript技术 4 3网上手机商城网站分析与设…

复古游戏库管理器RomM

什么是 RomM ? RomM(代表 Rom Manager)是一个专注于复古游戏的游戏库管理器。通过 Web 浏览器管理和组织您的所有游戏。受 Jellyfin 的启发,允许您从现代界面管理所有游戏,同时使用 IGDB 元数据丰富它们。 RomM 支持的…

线上通过Nginx部署前端工程,并且配置SSL

介绍、为了更好的帮助大家学习,减少歧义,IP地址我就不隐藏了,公司也是我自己的公司。你们就别来攻击了。 下面给出步骤: 一、前期准备工作 通过在目标服务器上安装宝塔面板、安装redis、mysql、nginx、jdk环境等 1、 2、前端工程通过npm run build 打…

完美解决Github提交PR后报错:File is not gofumpt-ed (gofumpt)

问题阐述 最近在Github上提交PR后,遇到了这么一个问题:golangci-lint运行失败,具体原因是File is not gofumpt-ed (gofumpt)。 名词解释 golangci-lint: golangci-lint 是Go语言社区中常用的代码质量检查工具,它可以…

Redis的AOF持久化

除了RDB持久化功能之外,Redis还提供了AOF持久化功能。与RDB 持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的,如下图所示。 举个例子,如果我们对空白的数据…

【JVM】垃圾回收算法

目录 一、判断对象已“死” 1.1、引用计数算法 1.2、可达性分析算法 1.3、引用的概念 二、垃圾收集算法理论 2.1、分代收集理论 三、垃圾收集算法 3.1、标记--清除算法 3.2、标记--复制算法 3.3、标记--整理算法 一、判断对象已“死” 在堆里面存放着Java世界中几乎所…

大数据课程I4——Kafka的零拷贝技术

文章作者邮箱:yugongshiyesina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Kafka的零拷贝技术; ⚪ 了解常规的文件传输过程; 一、常规的网络传输原理 表面上一个很简单的网络文件输出的过程,在OS底层&…