深入理解Redis数据结构

目录

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

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

相关文章

微信小程序之WXML 模板语法之数据绑定、事件绑定、wx:if和列表渲染

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

Java深度解析:类的生命周期与类加载过程

文章目录 加载阶段连接阶段-验证连接阶段-准备连接阶段-解析初始化阶段使用卸载 最近在学习Java 虚拟机,学到了类的声明周期,有些比较难理解的点,特地来总结一下。 类的生命周期从大体上来看的话,有五个阶段,分别是加载…

十八周周报

文章目录 摘要文献阅读3D reconstruction of human bodies from single-view and multi-view images: A systematic review简介研究方法搜索策略选择标准搜索结果 三维重建方法单个视图中使用的技术基于参数化人体模型的回归基于非参数人体模型的回归 多个视图中使用的技术基于…

ARMv8-AArch64 的异常处理模型详解之异常类型 Exception types

异常类型详解 Exception types 一, 什么是异常二,同步异常(synchronous exceptions)2.1 无效的指令和陷阱异常(Invalid instructions and trap exceptions)2.2 内存访问产生的异常2.3 产生异常的指令2.4 调…

使用残差网络识别手写数字及MNIST 数据集介绍

MNIST 数据集已经是一个几乎每个初学者都会接触的数据集, 很多实验、很多模型都会以MNIST 数据集作为训练对象, 不过有些人可能对它还不是很了解, 那么今天我们一起来学习一下MNIST 数据集。 1.MNIST 介绍 MNIST 数据集来自美国国家标准与技术研究所, National Institute of S…

Docker 47 个常见故障的原因和解决方法

【作者】曹如熙,具有超过十年的互联网运维及五年以上团队管理经验,多年容器云的运维,尤其在Docker和kubernetes领域非常精通。 Docker是一种相对使用较简单的容器,我们可以通过以下几种方式获取信息: 1、通过docker r…

HNU-编译原理-实验1-利用FLEX构造C-Minus-f词法分析器

编译原理实验1利用FLEX构造C-Minus-f词法分析器 计科210X 甘晴void 202108010XXX 实验要求 详细的实验项目文档为 https://gitee.com/coderwym/cminus_compiler-2023-fall/tree/master/Documentations/lab1 学习和掌握词法分析程序的逻辑原理与构造方法。通过 FLEX 进行实…

[陇剑杯 2021]webshell

[陇剑杯 2021]webshell 题目做法及思路解析(个人分享) 问一:单位网站被黑客挂马,请您从流量中分析出webshell,进行回答: 黑客登录系统使用的密码是_____________。 题目思路: 分析题目&…

【蓝桥备赛】求阶乘

题目链接 求阶乘 个人想法 之前做过计算阶乘结果后面有几个0的题目,这里看到本题之后,很快就有思路了。想要得到阶乘结果有几个0,首先尾数后面的0,最小肯定是因为因子中存在10。然后,10如何得来呢? 2 * …

【面试突击】硬件级别可见性问题面试实战(中)

🌈🌈🌈🌈🌈🌈🌈🌈 欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复…

有线桥接|Wifi隔了一堵墙就没信号?房间的网线口利用起来,让房间死角也有网!

前言 本篇文章是路由器有线桥接主路由,起到AP(热点)的效果 上次发布的无线桥接,使用的前提是需要把旧路由放置在主路由的信号范围内,这极大限制了桥接路由器的放置位置。 如果隔了一堵墙基本上就无法连接Wifi&#x…

STL——list

1、list介绍 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. list 的底层是带头双向循环链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后…