1、Redis核心数据结构: 魔法般的数据存储之旅

2024-01-13 06:28

本文主要是介绍1、Redis核心数据结构: 魔法般的数据存储之旅,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在当今世界的软件开发中,数据的快速、高效存储和检索是至关重要的。而在这个领域,Redis(Remote Dictionary Server)以其强大的性能和多样化的数据结构而脱颖而出。本文将带您深入探讨Redis的核心数据结构,揭示其背后的魔法。

引言
Redis是一种基于内存的键值存储系统,被广泛应用于缓存、消息队列、实时统计等场景。其独特之处在于,它支持多种灵活且高效的数据结构,使得开发者能够更好地适应各种应用需求。

数据结构:

  • 字符串 string
  • 哈希 hash
  • 列表 list
  • 集合 set
  • 有序集合 zset

在这里插入图片描述

字符串(Strings):数据的基石

在Redis中,字符串不仅仅是一串字符。它是Redis最简单、最基础的数据结构,但也是最为强大的。除了存储文本信息外,字符串可以表示数字、二进制数据,甚至是整个序列化对象。这使得Redis在处理各种数据类型时表现得游刃有余。

string应用场景:

1. 单值缓存
2. 对象缓存(json格式数据)
3. 分布式锁
4. 计数器
5. 集群session共享
6. 分布式系统全局序列号(生成一个id对Redis压力过大,可批量生成序列号提升性能)

哈希表(Hashes):复杂数据的容器

当数据变得更为复杂时,哈希表成为了处理键值对的不二之选。在Redis中,哈希表可以存储各种字段和与之相关的值,提供了一种非常直观的方式来表示对象或映射。这对于存储用户信息、配置参数等复杂数据结构来说尤为重要。

Hash应用场景:

1.  对象缓存
2. 购物车  (用户id-商品id : 数量)
3. 等等….
hash与string对比:优点:同类数据归类整合存储,方便数据管理相比string操作消耗内存更小cpu使用更低存储更节省空间缺点:过期功能不能使用Redis集群架构下不适合大规模使用(会产生大key)

列表(Lists):有序的数据集

Redis的列表数据结构提供了有序元素的集合。这不仅让您能够按顺序存储数据,还可以轻松地进行插入、删除等操作。这使得列表成为构建队列、栈等数据结构的理想选择,同时也为实时应用提供了便利的数据存储方式。

List应用场景:(左进、右进、左拿、右拿)

1. 栈数据结构 Lpush +Lpop = FIFO
2. 队列  lpush + Rpop
3. 阻塞队列 Lpush + Brpop
4. 微博和微信公众号消息流(大v发布的微博时间排序-时间线) LRANGE KEY START STOP(按时间排序拿指定范围内的条数)
push和pull对比:Push 操作(LPUSH、RPUSH):
优点:
支持一次性推送多个元素: 可以一次性将多个元素推送到列表的一端,提高了批量处理的效率。
灵活的数据插入: LPUSH 和 RPUSH 允许在列表的不同端口插入元素,适应不同的数据处理需求。
缺点:
单次操作仅能添加一个元素: 每次 push 操作只能添加一个或一组元素,可能会导致在高并发情况下的性能瓶颈。
Pull 操作(LPOP、RPOP):
优点:
返回并移除元素: 在执行 LPOP 或 RPOP 操作时,元素会被从列表中移除并返回,使得可以轻松地实现队列和栈的行为。
适合实现消息队列: LPOP 操作常用于实现简单的消息队列,其中消费者从队列头部取出消息进行处理。
缺点:
单次只能移除一个元素: 每次 pull 操作只能移除一个元素,对于需要一次性获取多个元素的场景,可能需要多次操作Push 操作适用于需要批量添加元素、灵活插入的场景。
Pull 操作适用于需要从列表中移除并获取元素的场景,特别是实现队列行为的情况。

集合(Sets):独特的无序性

集合是Redis中用于存储唯一元素的数据结构,且其中的元素是无序的。这使得集合成为处理独立元素的理想选择,例如存储用户标签、好友关系等。Redis对集合的支持让开发者在处理无序数据时游刃有余。

Set应用场景:(取多个集合的并集、交集、合集、差集)朋友圈第二个人点赞查看只能看到自己认识的好友点赞该朋友圈

1. 抽奖小程序(抽奖商品为key,参与此商品的用户添加set集合)
2. 微博微信点赞、收藏、标签
3. 集合操作实现微信微博关注模型(共同关注的人、我关注的人也关注了xxx、可能认识的人)

有序集合(Sorted Sets):排序的精华

有序集合是Redis中最具特色的数据结构之一。它是集合的扩展,每个元素都关联了一个分数,通过分数进行排序。这使得有序集合非常适合处理排行榜、时间线等需要有序性的场景。

Zset应用场景:(榜单、排行榜)

1. 点击新闻
2. 前十排名
3. 七日内搜索榜单
4. 七日排行前十

redis的单线程和高性能

Q:Redis是单线程吗
A:Redis的单线程主要是指Redis的网络IO和键值的读写是由一个线程来完成的,这也是Redis对外提供键值存储服务的主要流程,但Redis其他的功能,如持久化、异步删除、集群数据同步等是由额外的线程执行的Q:Redis单线程为什么还能这么快
A:因为它所有的数据都存放在内存中,运算也都是内存级别,而且单线程避免了多线程的切换性能损耗问题。正因为Redis是单线程所以要小心使用Redis指令,对于耗时的指令(如keys)一定要慎用,不小心就会造成Redis卡顿  Q:Redis单线程如何处理那么多的并发客户端连接
A:Redis的IO多路复用,Redis利用epoll来实现IO多路复用,讲连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器

keys遍历库所有的节点key,当数据量大时避免使用,会导致其它的Redis请求卡顿
Scan:渐进式遍历键 解决遍历所有节点卡顿问题

Scan 0 match key99* count 1000
0:开始扫描的索引
key99*:匹配规则
1000:扫描的节点数量

结语
在Redis的世界里,这些核心数据结构如同魔法般地将复杂的问题变得简单。从基础的字符串到强大的有序集合,Redis为开发者提供了一系列强大的工具,使得数据的存储和处理变得轻松而高效。随着对Redis核心数据结构的深入理解,您将能够更好地利用Redis的潜力,让数据的存储和检索变得更加有趣和令人兴奋。

这篇关于1、Redis核心数据结构: 魔法般的数据存储之旅的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600525

相关文章

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

redis+lua实现分布式限流的示例

《redis+lua实现分布式限流的示例》本文主要介绍了redis+lua实现分布式限流的示例,可以实现复杂的限流逻辑,如滑动窗口限流,并且避免了多步操作导致的并发问题,具有一定的参考价值,感兴趣的可... 目录为什么使用Redis+Lua实现分布式限流使用ZSET也可以实现限流,为什么选择lua的方式实现

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、