深入理解Redis数据结构

news2024/11/17 0:39:53

目录

Redis的单线程

Redis单线程快的原因

Redis 单线程处理高并发客户端连接

Redis数据结构

字符串(String)

常用方法

数据结构

哈希表(Hash)

常用方法

数据结构

列表(List)

常用方法

数据结构

集合(Set)

常用方法

数据结构

有序集合(Sorted Set)

常用方法

​编辑

数据结构

总结


Redis的单线程

      Redis的单线程主要是指 Redis的网络IO和键值对读写是由一个线程来完成的,这也是Redis 对外提供键值存储服务的主要流程。但Redis的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。

Redis单线程快的原因

       所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性能损耗问题。因为Redis是单线程,所以要小心使用Redis指令,对于那些耗时的指令(比如keys),一定要谨慎使用,一不小心就可能会导致Redis卡顿。

Redis 单线程处理高并发客户端连接

       Redis的IO多路复用:redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器。

             

      Redis 将连接信息和事件封装成数据结构,并放入连接信息和事件队列中,也就是图中的I/O多路复用程序中,文件事件分派器负责从连接信息和事件队列中取出事件,然后将事件分发给相应的事件处理器。文件事件分派器可以通过轮询或其他方式从队列中获取待处理的事件。事件处理器执行与事件相关的操作。例如,对于一个读取事件,可能是从客户端读取数据;对于写入事件,可能是向客户端写入数据。事件处理器完成操作后,可能会产生新的事件,将这些事件放回队列,继续处理。


Redis数据结构

                          

字符串(String)
常用方法
SET key value                       // 设置键的字符串值
GET key                             // 获取指定键的字符串值
INCR key                            // 将键的值递增1
DECR key                            // 将键的值递减1         
APPEND key value                    // 在键的值后追加字符串
STRLEN key                          // 获取键的值的长度
GETRANGE key start end              // 获取键的值的子字符串
SETRANGE key index value            // 在指定索引开始处设置子字符串
MSET key1 value1 key2 value2 ...    // 批量设置多个键的值
MGET key1 key2 ...                  // 批量获取多个键的值
DEL key                             // 删除指定的键
EXPIRE key seconds                  // 设置键的过期时间(秒)  
SETNX key value                     // 键不存在时设置其值(分布式锁)     
数据结构

                      

 简单动态字符串

1. int 表示方式

当字符串可以表示为整数时,Redis 将选择使用 int 表示。

SET mykey 42

2. embstr(嵌套字符串)表示方式

当字符串较短(小于44字节)时,Redis使用embstr表示。

SET shortstr "This is a short string"

 3. raw 表示方式

 当字符串较大时,Redis使用raw表示。

SET longstr "This is a longer string with spaces and special characters!"

哈希表(Hash)
常用方法
//设置哈希表字段的值,将哈希表key中的字段field的值设置为value。
HSET key field value          

//获取哈希表字段的值,获取哈希表key中字段field的值。
HGET key field               

//同时设置多个哈希表字段的值,一次性设置多个字段的值。
HMSET key field1 value1 field2 value2 ...

//同时获取多个哈希表字段的值,一次性获取多个字段的值。
HMGET key field1 field2 ...

//获取哈希表所有字段和值,返回哈希表 key 中所有字段和值。
HGETALL key

//删除哈希表字段,删除哈希表 key 中的一个或多个字段。
HDEL key field1 field2 ...

//判断哈希表字段是否存在,检查哈希表key中是否存在字段field。
HEXISTS key field

//获取哈希表所有字段,返回哈希表key中所有字段的列表。
HKEYS key

//获取哈希表所有值,返回哈希表key中所有值的列表。
HVALS key

//获取哈希表字段的数量,返回哈希表key中字段的数量。
HLEN key
数据结构

列表(List)
常用方法
// 在列表左侧插入元素,将一个或多个值插入到列表 key 的左侧。
LPUSH key value1 [value2 ...]

// 在列表右侧插入元素,将一个或多个值插入到列表 key 的右侧。
RPUSH key value1 [value2 ...]

// 从列表左侧弹出元素,移除并返回列表 key 的左侧第一个元素。
LPOP key

// 从列表右侧弹出元素,移除并返回列表 key 的右侧第一个元素。
RPOP key

// 获取列表范围内的元素,返回列表 key 中指定范围内的元素,范围由 start 和 stop 指定。
LRANGE key start stop

// 获取列表中指定索引的元素,返回列表 key 中指定索引 index 处的元素。
LINDEX key index

// 获取列表长度,返回列表 key 的长度。
LLEN key

// 在指定元素前或后插入新元素,在列表 key 中的元素 pivot 之前或之后插入新元素 value。
LINSERT key BEFORE|AFTER pivot value

// 移除列表中指定值的元素,从列表 key 中移除 count 个值为 value 的元素。
LREM key count value

// 修剪列表,修剪(裁剪)列表 key,保留指定范围内的元素。
LTRIM key start stop
数据结构

集合(Set)
常用方法
//向集合添加一个或多个元素,将一个或多个元素添加到集合 key 中。
SADD key member1 [member2 ...]

//获取集合的成员数,返回集合 key 中的元素个数。
SCARD key

//获取集合的所有成员,返回集合 key 中的所有成员。
SMEMBERS key

//判断元素是否是集合的成员,判断 member 是否是集合 key 的成员,返回 1 表示是成员,返回 0 表示不是成员。
SISMEMBER key member

//从集合中移除一个或多个元素
SREM key member1 [member2 ...]

//随机弹出集合中的一个元素
SPOP key

//随机获取集合中一个或多个元素
SRANDMEMBER key [count]

//计算多个集合的交集
SINTER key1 key2 [key3 ...]

//计算多个集合的并集
SUNION key1 key2 [key3 ...]

//计算多个集合的差集
SDIFF key1 key2 [key3 ...]
数据结构

Set集合是一个无序且不允许重复的集合

数据结构是哈希表。

有序集合(Sorted Set)
常用方法
//向有序集合添加一个或多个成员,或更新已存在成员的分数
//NX: 仅在成员不存在时添加。
//XX: 仅在成员已经存在时添加。
//CH: 修改对已经存在成员的分数。
//INCR: 对成员的分数进行自增操作。
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]

//获取有序集合的成员数
ZCARD key

//获取成员在有序集合中的排名(从小到大)
ZRANK key member

//获取成员在有序集合中的排名(从大到小)
ZREVRANK key member

//按照排名范围获取有序集合的成员
ZRANGE key start stop [WITHSCORES]

//按照排名范围获取有序集合的成员(逆序)
ZREVRANGE key start stop [WITHSCORES]

//从有序集合中移除一个或多个成员
ZREM key member [member ...]

//对有序集合中的成员的分数进行增加操作
ZINCRBY key increment member

//获取有序集合中成员的分数
ZSCORE key member

//计算多个有序集合的交集,并将结果存储在新的有序集合中
//计算给定的 numkeys 个有序集合的交集,并将结果存储在新的有序集合 destination 中。可选参数 WEIGHTS 可以为每个集合指定权重,AGGREGATE 参数指定聚合方式。
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

//计算多个有序集合的并集,并将结果存储在新的有序集合中
//计算给定的 numkeys 个有序集合的并集,并将结果存储在新的有序集合 destination 中。可选参数 WEIGHTS 可以为每个集合指定权重,AGGREGATE 参数指定聚合方式。
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
数据结构

  数据可以使用压缩列表或者跳表来存储,一般用跳表比较多,如下图:

跳表:(根据分数排好序的有序链表)

       原始的跳表就是一个链表,链表查找元素慢,插入元素快。在链表上做了优化改进。将有序链表改造为支持折半查找的算法结构。改造后支持查找、插入、删除操作。(空间换时间,使用较多)

压缩列表:

        压缩列表最原始的底层就是链表,只不过这个链表去掉了指针,像是数组一样。根据偏移量可以快速定位元素。(使用不是很多)

总结

       redis的压缩列表跟跳表那个快用那个,默认zset中有128个元素就切换成跳表插入。(什么时候用跳表跟压缩列表也可以自行设置)

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

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

相关文章

[bat]0基础实现自动化办公-基于start实现一键打开常用软件/文档

一、应用背景 每次开机时,都要一个个打开常用软件,比如微信、QQ或是word文档、excel表格等程序,比较费时。 二、方案 使用bat脚本中的start方法,通过将需要打开的程序或文件写入到bat脚本中,运行bat脚本从而实现一键…

X-Bogus加密参数分析与jsvmp算法(仅供学习)

文章目录 1. 抓包分析2. X-Bogus参数分析 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫…

【根据loss曲线看模型微调效果】如何使用loss曲线诊断机器学习模型性能

一、Loss曲线 在模型的预训练或者微调过程中,我们一般通过观察loss曲线来得出模型对于数据集的学习效果等信息。那么我们如何根据loss曲线得到一些信息呢? 通常数据集会被划分成三部分,训练集(training dataset)、验证…

VR风景园林虚拟仿真系统编辑工具支持可视化预览成本低

为了帮助更多人快速、高效地构建虚拟现实应用系统,提高开发效率,降低成本投入,VR虚拟现实交互系统编辑器作为一种用于创建和编辑虚拟现实应用程序的工具,采用可视化界面提示和简单操作就能快速制作VR虚拟现实交互系统。 VR虚拟现实…

centos7安装nginx,按图文步骤操作

下载nginx: 官方网站:http://nginx.org/ 我这使用的版本是1.8.0版本。 1.nginx要求的安装环境 1.1、需要安装gcc的环境。 yum install gcc-c 1.2、第三方的开发包。 pcre PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括…

行云部署前端架构解析-前言 | 京东云技术团队

一个简单的自我介绍 项目规模 截止目前上万次代码提交,总代码行数1超过21万行,其中人工维护的代码超过 13万行,近千个文件。 前端线上服务直接对接的后端服务,达十多个。 跟很多应用一样, 它有行云的入口, 也有独立的服务, 还…

C++ 之LeetCode刷题记录(十三)

😄😊😆😃😄😊😆😃 开始cpp刷题之旅。 依旧是追求耗时0s的一天。 70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可…

TortoiseSVN客户端如何安装配置并实现公网访问服务端提交文件到本地服务器

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统,它与Apache Subversion(SVN)集成在一起,提供了一个用户友好的界面,方便用…

HarmonyOS—创建和运行Hello World

DevEco Studio配置开发环境完成后,可以通过运行Hello World工程来验证环境设置是否正确。接下来以创建一个Phone设备的工程为例进行介绍。 创建一个新工程 打开DevEco Studio,在欢迎页单击Create Project,创建一个新工程。根据工程创建向导&…

【Linux】配置dns主从服务器,能够实现正常的正反向解析

​​​​​​1、首先,在主服务器上配置DNS解析器。打开配置文件/etc/named.conf,添加以下内容: zone"example.com" IN {type master;file "example.com.zone";allow-transfer { slave_ip_address: }; };zone"xx.16…

kotlin Kmp多平台模板生成

地址: Kotlin Multiplatform Wizard | JetBrains 可生成kotlin多个平台模板 https://terrakok.github.io/Compose-Multiplatform-Wizard/

SpringBoot连接远程服务器redis

SpringBoot连接远程服务器redis 1、指定redis配置启动 进入redis安装地址,我这里安装的是 /usr/local/src/redis-6.2.6 先copy一份配置文件 cp redis.conf redis.conf.bck然后修改配置文件信息 vim redis.conf bind 0.0.0.0 # 守护进程,修改为yes后即可…

StructuredStreaming输出模式和结果输出文件中

输出模式 #format指定输出位置 console:控制台 #append 不支持排序,不支持聚合, 每次输出数据都是最新的数据内容 #complete 必须聚合,支持聚合后排序 每次输出数据都会将原来的数据一起输出 #update 支持聚合,支持sel…

小程序宿主环境-组件swiper

巧识小程序的开发过程学习. 在我们的list.wxml中创建组件 <swiper class"swiper-container" indicator-dots indicator-color"white" indicator-active-color"grey" autoplay interval"2000" circular><!--第一个轮播图--&…

gitlab 部署项目新分支

公司代码管理平台新切换到gitlab下&#xff0c;上线发版流程随之变更 1新建分支&#xff0c;开发完成&#xff0c;提交新分支 2.去gitlab平台上找到Merge requests 3 点击右上角的New merge request select source branch 选择新建的分支 点击 compare branches and contin…

Vue中使用echart引入图表

下载echart安装包. 找到安装包里的dist文件夹中的echarts.js文件&#xff0c;复制到工作文件夹目录下 复制到工作文件夹目录下 官网查询使用方法快速上手 - 使用手册 - Apache ECharts eg:

图灵日记之java奇妙历险记--String类

目录 String常用方法字符串构造String对象的比较字符串查找char charAt(int index)int indexOf(int ch)int indexOf(int ch, int fromIndex)int indexOf(String str)int indexOf(String str, int fromIndex)int lastIndexOf(String str)int lastIndexOf(String str, int fromIn…

数据在内存中的存储(整型与浮点数类型)

目录 数据类型详细介绍 数据类型介绍 数据类型的基本归类 整型在内存中的存储 原码、反码、补码 ​编辑 大小端介绍 例题 浮点型在内存中的存储 常见的浮点数 浮点数存储的例子&#xff08;具体解析浮点数存储&#xff09; 解析最初的例题 数据类型详细介绍 数据类…

问题:Feem无法发送信息OR无法连接(手机端无法发给电脑端)

目录 前言 问题分析 资源、链接 其他问题 前言 需要在小米手机、华为平板、Dell电脑之间传输文件&#xff0c;试过安装破解的华为电脑管家、小米的MIUI文件传输等&#xff0c;均无果。&#xff08;小米“远程管理”ftp传输倒是可以&#xff0c;但速度太慢了&#xff0c;且…

小程序商城开通指南:揭秘电商新零售的崛起之路!

随着移动设备的普及和微信小程序的迅速流行&#xff0c;电商行业正在经历前所未有的变革。小程序商城作为新兴的电商模式&#xff0c;因其无需下载安装、方便易用等特点&#xff0c;为企业和个人创造了崭新的商业机会。本文将为您详细介绍如何开通小程序商城&#xff0c;涵盖准…