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的潜力,让数据的存储和检索变得更加有趣和令人兴奋。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1.12寒假集训

A: 解题思路: 输出整体可以分成两部分: 第一部分循环3*n次,第一部分又可以分成三个部分,分别是*,.,*,分别循环n,2 * n,n次 第二部分循环n次,又可以分成五个部分,.,*,.,*,.,循环i,n(n - i) * 2,n,i次 下…

(1)(1.13) SiK无线电高级配置(六)

文章目录 前言 15 使用FTDI转USB调试线配置SiK无线电设备 16 强制启动加载程序模式 17 名词解释 前言 本文提供 SiK 遥测无线电(SiK Telemetry Radio)的高级配置信息。它面向"高级用户"和希望更好地了解无线电如何运行的用户。 15 使用FTDI转USB调试线配置SiK无线…

国际化翻译系统V2正式上线了

1、前言 之前上线了移动端国际化翻译系统V1版本,其中有一些弊端,例如: 1、项目仅能适用于Android和iOS项目,针对前端项目,Flutter项目,和后端项目无法支持2、之前的桌面程序需要搭建本地java环境才能运行…

【2023年度总结与2024展望】---23年故事不长,且听我来讲

文章目录 前言一、学习方面1.1 攥写博客1.2 学习内容1.3 参加比赛获得证书 二、生活方面2.1写周报记录生活 三、运动方面四、CSDN的鼓励五、24年展望总结 前言 时光飞逝,又是新的一年,遥想去年2023年我也同样在这个时间段参加了CSDN举办的年度总结活动&a…

别再纠结,这8款设计工具助你轻松绘制原型图!

原型图设计工具有很多优点。除了帮助设计师快速与客户达成协议,避免项目前景的冲突外,原型图设计工具还可以让客户看到正在创建的内容。如果需要更改,原型图设计工具也可以轻松完成。本文快速总结了8种原型图设计工具。无论你是专业设计师还是…

如何更改路由器Wi-Fi密码,这里提供通用步骤

这篇文章解释了如何通过路由器的设置更改Wi-Fi密码,即使你不知道当前的密码。 如何更改你的Wi-Fi密码 该过程按照以下一般步骤展开。 ​重要:这些是更改Wi-Fi密码的通用说明。更改路由器设置所需的步骤因不同制造商的路由器而异,甚至可能在…

Python入门0基础学习笔记

1.编程之前 在编写代码之前,还有两件事需要做: 安装 Python 解释器:计算机是没法直接读懂 Python 代码的,需要一个解释器作为中间的翻译,把代码转换成字节码之后再执行。 Python 是翻译一行执行一行。一般说的安装 …

【解决】Unity Project 面板资源显示丢失的异常问题处理

开发平台:Unity 2021.3.7f1c1   一、问题描述 在开发过程中,遭遇 Project 面板资源显示丢失、不全的问题。但 Unity Console 并未发出错误提示。   二、解决方案:删除 Library 目录 前往 “工程目录/Library” 删除内部所有文件并重打开该…

IntelliJ IDEA 如何编译 Maven 工程项目

在当今的Java开发领域,Maven已经成为项目构建和依赖管理的标准工具。IntelliJ IDEA作为一款集成度高的Java开发环境,提供了许多强大的功能来简化和优化Maven项目的构建流程。本文将深入介绍如何使用IntelliJ IDEA编译Maven工程的详细步骤以及一些高级技巧…

用java搞定时任务,将hashmap里面的值存到文件里面去

要实现这个功能,你可以使用Java的Timer和TimerTask类来创建一个定时任务。 首先,你需要创建一个继承自TimerTask的类,重写run方法,将HashMap中的内容写入文本文件。 然后,使用Timer类的schedule方法来设置定时任务的执…

记忆泊车PNC模块架构设计说明书

目 录 0 修订历史......... 2 1. 概要 ............... 5 1.1. 目的 ............... 5 1.2. 参考文档 ......... 5 2. 名词解释 ...... 5 3. 需求概述 ............. 6 3.1. 业务视图 .............. 6 3.2. 功能描述 ............... 6 3.3. 性能指标 ............ 6 3.4. 资…

【软件安全:软件安全技术课后习题及答案】

第一章 1-1 零日漏洞、零日攻击 零日漏洞是指未被公开披露的软件漏洞,没有给软件的作者或厂商以时间去为漏洞打补丁或是给出建议解决方案,从而攻击者能够利用这种漏洞破坏计算机程序、数据及设备。 利用零日漏洞开发攻击工具进行的攻击称为零日攻击。 1-…

Ubuntu server搭建dhcp服务器

安装 直接使用一下命令进行安装 apt-get install isc-dhcp-server 以下就是安装好的图片 然后进入dhcp目录 cd /etc/dhcp 进入后用ls查看当前目录存在哪些文件 使用如下进入dhcp.conf vim dhcpd.conf 红:设置ip域和子网掩码 绿:设置ip池范围 黄…

爬虫利器一览

前言 爬虫(英文:spider),可以理解为简单的机器人,如此一个“不为名利而活,只为数据而生,目标单纯,能量充沛,不怕日晒雨淋,不惧寒冬酷暑”的家伙,…

【深度学习】Anaconda3 + PyCharm 的环境配置 1:手把手带你安装 PyTorch 并创建 PyCharm 项目

前言 文章性质:实操记录 💻 主要内容:这篇文章记录了 PyTorch 的安装过程,包括: 1. 创建并激活新的虚拟环境; 2. 查看电脑是否支持 CUDA 以及 CUDA 的版本; 3. 根据 CUDA 的版本安装 PyTorch&am…

归并排序例题——逆序对的数量

做道简单一点的题巩固一下 归并排序实现步骤 将整个区间 [l, r] 划分为 [l, mid] 和 [mid1, r]。 递归排序 [l, mid] 和 [mid1, r]。 将左右两个有序序列合并为一个有序序列。 题目描述 给定一个长度为 n 的整数数列,请计算数列中的逆序对的数量。 逆序对的定义…

简单的推箱子游戏实战

目录 项目分析 地图初始化 背景图片 游戏场景图片: 热键控制 按键设置 确定人物位置 实现人物移动(非箱子,目的地) 推箱子控制 游戏结束 最终代码 合法性判断: 项目分析 墙:0,地板:1,箱子目的地:2,小人:3,箱子:4,箱子命中目标:5 地图初始化 背景图片 #include <…

煤炭行业电力能源消耗监测管理系统的作用有哪些?

如果说&#xff0c;通风是煤炭的呼吸系统&#xff0c;那么供电就是煤矿的神经系统。安全供电对安全生产有着重要的意义。一旦供电系统出现故障或停电&#xff0c;煤矿的生产活动将无法正常进行&#xff0c;这将产生严重的经济损失甚至危及工人的生命安全。 为了提高煤矿供电系统…

机器视觉检测设备在连接器外观缺陷检测中的应用

作为传输电流或信号连接两个有源器件的器件&#xff0c;连接器被广泛应用于各个行业&#xff0c;从手机、平板、电脑&#xff0c;到冰箱、空调、洗衣机&#xff0c;再到汽车、国防、航空&#xff0c;处处是它的所在。每个电子产品少了连接器将无法运作&#xff0c;因此&#xf…

在Docker上配置TensorFlow

在Docker上配置TensorFlow 配置WSL 参考教程&#xff1a;https://blog.csdn.net/m0_63969219/article/details/124632640 在上述教程配置的过程中&#xff0c;可能很难在微软商店下到ubuntu&#xff0c;下面给出另外一种解决方案&#xff1a; 接着上面教程 wsl --set-defaul…