Redis五种常用数据类型详解及使用场景
Redis 5 种基本数据类型
Redis 共有 5 种基本数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。
这 5 种数据类型是直接提供给用户使用的,是数据的保存形式,其底层实现主要依赖这 8 种数据结构:简单动态字符串(SDS)、LinkedList(双向链表)、Dict(哈希表/字典)、SkipList(跳跃表)、Intset(整数集合)、ZipList(压缩列表)、QuickList(快速列表)。
Redis 5 种基本数据类型对应的底层数据结构实现如下表所示:
String(字符串)
String 是 Redis 中最简单同时也是最常用的一个数据类型。
String 是一种二进制安全的数据类型,可以用来存储任何类型的数据比如字符串、整数、浮点数、图片(图片的 base64 编码或者解码或者图片的路径)、序列化后的对象。
虽然 Redis 是用 C 语言写的,但是 Redis 并没有使用 C 的字符串表示,而是自己构建了一种 简单动态字符串(Simple Dynamic String,SDS)。相比于 C 的原生字符串,Redis 的 SDS 不光可以保存文本数据还可以保存二进制数据,并且获取字符串长度复杂度为 O(1)(C 字符串为 O(N)),除此之外,Redis 的 SDS API 是安全的,不会造成缓冲区溢出。
适用场景
字符串(String)类型在Redis中是最常用的数据类型之一,适用于以下场景:
-
缓存:字符串类型可以用于缓存数据,例如缓存数据库查询结果、计算结果等。由于Redis的高性能和快速读写能力,使用字符串类型作为缓存可以大大提高系统的响应速度。
-
计数器:字符串类型可以用于实现计数器功能,例如统计网站的访问次数、用户的点赞数等。通过使用字符串类型的自增命令,可以方便地对计数器进行增加或减少操作。
-
分布式锁:字符串类型可以用于实现分布式锁,保证在分布式环境下的数据一致性和并发控制。通过设置一个唯一的字符串作为锁的值,并利用Redis的原子性操作,可以实现简单而高效的分布式锁机制。
-
会话管理:字符串类型可以用于存储用户的会话信息,例如用户登录状态、购物车内容等。通过将会话信息存储在字符串类型中,可以方便地进行读写操作,并且可以设置过期时间来自动清理过期的会话数据。
-
消息队列:字符串类型可以用于实现简单的消息队列,例如将消息内容作为字符串存储在Redis中,然后使用列表类型的命令进行消息的发布和订阅。
-
分布式缓存:字符串类型可以用于实现分布式缓存,例如将经过序列化的对象存储在字符串类型中,然后通过缓存命中来提高系统的性能和扩展性。
List(列表)
Redis 中的 List 其实就是链表数据结构的实现。我在 线性数据结构 :数组、链表、栈、队列[3] 这篇文章中详细介绍了链表这种数据结构,我这里就不多做介绍了。
许多高级编程语言都内置了链表的实现比如 Java 中的 LinkedList
,但是 C 语言并没有实现链表,所以 Redis 实现了自己的链表数据结构。Redis 的 List 的实现为一个 双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。
适用场景
列表(List)类型在Redis中是一种非常常用的数据类型,适用于以下场景:
-
消息队列:列表类型可以用于实现简单的消息队列。生产者可以使用
LPUSH
命令将消息添加到列表的头部,消费者可以使用RPOP
命令从列表的尾部获取消息。这种方式可以实现先进先出(FIFO)的消息处理。 -
实时排行榜:列表类型可以用于实现实时排行榜。例如,可以使用
LPUSH
命令将用户的得分添加到列表中,然后使用LPOP
命令获取排行榜的前几名。 -
任务队列:列表类型可以用于实现任务队列。生产者可以使用
LPUSH
命令将任务添加到列表的尾部,消费者可以使用RPOP
命令从列表的头部获取任务。这种方式可以实现任务的分发和处理。 -
消息发布与订阅:列表类型可以用于实现简单的消息发布与订阅。生产者可以使用
LPUSH
命令将消息添加到列表的头部,订阅者可以使用BLPOP
命令阻塞地从列表中获取消息。 -
历史记录:列表类型可以用于存储历史记录。例如,可以使用
LPUSH
命令将用户的浏览记录添加到列表中,然后使用LRANGE
命令获取最近的浏览记录。
Hash(哈希)
Redis 中的 Hash 是一个 String 类型的 field-value(键值对) 的映射表,特别适合用于存储对象,后续操作的时候,你可以直接修改这个对象中的某些字段的值。
Hash 类似于 JDK1.8 前的 HashMap
,内部实现也差不多(数组 + 链表)。不过,Redis 的 Hash 做了更多优化。
适用场景
Redis的哈希表(Hash)是一种存储键值对的数据结构,其中的键是唯一的,而值则可以是字符串、整数、浮点数等。哈希表适用于许多场景,特别是需要存储和查询多个字段的情况。以下是一些适用场景:
1. 存储对象信息: 如果你需要存储一个对象的多个字段信息,例如用户信息(用户名、年龄、邮箱等),可以使用哈希表来存储每个用户的字段信息。
2. 缓存数据: 哈希表适用于缓存大量的键值对数据,例如缓存数据库查询结果,以减少数据库的访问频率。
3. 存储配置信息: 将配置信息存储在哈希表中,可以方便地获取和修改配置项,而无需在内存中存储多个单独的键。
4. 计数器: 可以使用哈希表来实现计数器功能,每个字段存储一个计数,比如网站的点赞数、阅读数等。
5. 存储多种属性: 如果你需要为一组对象存储多种属性,例如商品的名称、价格、库存等,可以使用哈希表来存储每个商品的多个属性。
6. 联合索引: 在关系型数据库中,联合索引常用于加速多字段的查询。在Redis中,可以使用哈希表来存储多个字段,并通过一个字段作为主键,实现类似的联合索引效果。
7. 实时统计: 哈希表可以用于实时统计信息,例如统计用户每天的登录次数、订单数等。
8. 用户会话: 可以使用哈希表来存储用户会话信息,每个字段存储一个会话属性,如用户ID、登录时间、过期时间等。
9. 图数据结构: 如果需要实现图数据结构,例如社交网络关系图,可以使用哈希表来表示节点和边。
10. 多字段查询: 哈希表适用于存储多个字段,可以更快速地查询和更新多个字段的值。
总之,哈希表适用于需要存储多个字段信息的情况,可以在一次查询中获取和更新多个字段,从而提高了数据的访问效率。它在多种应用场景中都能发挥作用,特别是需要存储和操作多个属性的数据。
Set(集合)
Redis 中的 Set 类型是一种无序集合,集合中的元素没有先后顺序但都唯一,有点类似于 Java 中的 HashSet
。当你需要存储一个列表数据,又不希望出现重复数据时,Set 是一个很好的选择,并且 Set 提供了判断某个元素是否在一个 Set 集合内的重要接口,这个也是 List 所不能提供的。
你可以基于 Set 轻易实现交集、并集、差集的操作,比如你可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。这样的话,Set 可以非常方便的实现如共同关注、共同粉丝、共同喜好等功能。这个过程也就是求交集的过程。
适用场景
Redis的Set数据类型是一个无序的字符串集合,它可以存储多个不重复的元素。Set在Redis中有许多实际的使用场景,以下是一些常见的使用场景:
-
唯一性数据存储:
最基本的使用场景就是用来存储不重复的数据。你可以使用Set来存储用户ID、IP地址、邮箱地址等,确保数据的唯一性。
-
标签和标记系统:
Set可以用于创建标签或标记系统。例如,你可以为文章、商品或其他实体创建一个包含相关标签的Set,以便后续快速检索。
-
关注和粉丝系统:
在社交媒体或用户关系管理中,Set可以用来实现关注和粉丝系统。每个用户可以有一个Set,其中包含他们关注的其他用户或粉丝。
-
在线用户:
Set可以用于跟踪在线用户。将用户ID添加到一个Set中,表示用户当前在线。通过检查Set中的成员,可以快速查找在线用户。
-
投票系统:
Set可以用于实现投票系统。每个投票项目可以表示为一个Set,用户投票时将其ID添加到相应的Set中,确保每个用户只能投一次。
-
集合运算:
Redis提供了多种Set运算,如交集、并集和差集。这些运算可以用于计算多个集合之间的共同元素、合并元素等。
-
排行榜和排名:
Set可以用于创建排行榜系统。例如,每个元素代表一个玩家,分数作为元素的权重。可以通过有序集合操作获取排名和排行。
-
地理位置标记:
Set可以用于存储地理位置数据,例如存储用户的经纬度坐标,然后利用Set运算来查找附近的位置。
-
过滤重复事件:
如果你需要记录一系列事件,并且要确保事件不重复记录,可以使用Set来存储已经发生的事件,防止重复记录。
总的来说,Redis的Set数据类型非常适合需要存储不重复数据、进行集合运算以及需要高效查找元素的场景。无论是在社交网络、实时分析、排行榜、地理位置服务等领域,Set都有着广泛的应用。
Sorted Set(有序集合)
Sorted Set 类似于 Set,但和 Set 相比,Sorted Set 增加了一个权重参数 score
,使得集合中的元素能够按 score
进行有序排列,还可以通过 score
的范围来获取元素的列表。有点像是 Java 中 HashMap
和 TreeSet
的结合体。
适用场景
有序集合(Sorted Set)是Redis中的一种特殊数据类型,它在有序性和唯一性的基础上,为存储一组成员(元素)分配了一个分数(score)。这种数据结构使得有序集合在许多应用场景中非常有用。以下是一些适用场景:
1. 排行榜和计分系统: 有序集合非常适合实现排行榜和计分系统。成员的分数可以表示玩家的得分、评分、积分等。你可以通过分数对成员进行排序,快速地获取前几名的排名。
2. 时间序列数据: 如果你需要存储带有时间戳的数据,有序集合可以根据时间戳(作为分数)进行排序,然后按时间范围快速查询数据。
3. 最新消息: 有序集合可以用来存储最新的消息,每个消息的分数可以是消息的时间戳,这样可以方便地获取最新的消息。
4. 带权重的标签/标签云: 在社交网络或标签系统中,你可以使用有序集合来存储标签,成员是标签,分数可以表示标签的热度、权重等。这可以用来实现标签云、热门标签等功能。
5. 范围查询: 有序集合允许根据分数范围进行查询,从而可以快速地获取在某个分数范围内的成员。
6. 唯一性: 有序集合保持了成员的唯一性,这意味着你可以方便地存储和查询不重复的元素。
7. 高级集合运算: Redis提供了对有序集合的集合运算(交集、并集、差集)操作,这可以用来实现多个数据集的交叉分析、数据筛选等。
8. 范围分页: 使用ZRANGE
等命令,可以对有序集合进行分页查询,获取指定范围内的成员。
总之,有序集合适用于需要保持元素有序性、需要快速进行范围查询、具有权重或分数的情况。它在多个场景中都提供了高效的数据存储和操作,使得Redis成为了解决这些问题的有力工具。
相关文章:
Redis五种常用数据类型详解及使用场景
Redis 5 种基本数据类型 Redis 共有 5 种基本数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。 这 5 种数据类型…...
Postman API测试覆盖率:全面评估指南
📊 Postman API测试覆盖率:全面评估指南 在API测试中,测试覆盖率是一个关键指标,它衡量了测试用例对代码的覆盖程度。Postman提供了多种工具和方法来评估API测试覆盖率,帮助开发者和测试人员确保API的质量和稳定性。本…...
C++--find
find 在[first,last)区间找第一个等于val的元素。 template<class InputIterator, class T> InputIterator find(InputIterator first,//起始迭代器 InputIterator last, //结束迭代器 const T& val); //需要查找的值 源码剖析 template<class InputI…...
JavaWeb入门程序解析(Spring官方骨架、配置起步依赖、SpringBoot父工程、内嵌Tomcat)
3.3 入门程序解析 关于web开发的基础知识,我们可以告一段落了。下面呢,我们在基于今天的核心技术点SpringBoot快速入门案例进行分析。 3.3.1 Spring官方骨架 之前我们创建的SpringBoot入门案例,是基于Spring官方提供的骨架实现的。 Sprin…...
mysql命令练习
创建数据表grade: CREATE TABLE grade( id INT NOT NULL, sex CHAR(1), firstname VARCHAR(20) NOT NULL, lastname VARCHAR(20) NOT NULL, english FLOAT, math FLOAT, chinese FLOAT ); 向数据表grade中插…...
AI绘画Stable Diffusion 零基础入门 —AI 绘画原理与工具介绍,万字解析AI绘画的使用教程
大家好,我是设计师阿威 想要入门 AI 绘画,首先需要了解它的原理是什么样的。 其实很早就已经有人基于深度学习模型展开了对图像生成的研究了,但在那时,生成的图像分辨率和内容都非常抽象。 直到近两年,AI 产出的图像…...
jenkins添加ssh证书
1、生成ssh密匙:windows生成ssh密匙-CSDN博客 2、添加添加ssh凭证:jenkins路由地址为:/manage/credentials/store/system/domain/_/ 点击添加凭证 选择第二个,将生成的私匙 id_rsa 里边的内容赋值到密钥,id留空自动…...
C++--accumulate介绍
在C中,accumulate是一个用于对容器中的元素进行累加操作的函数模板,位于 头文件中。它允许你对容器(如vector或array)中的元素进行累加运算,并返回累加的结果。 源代码展示 template<class InputIterator, class …...
C++写一个线程池
C写一个线程池 文章目录 C写一个线程池设计思路测试数据的实现任务类的实现线程池类的实现线程池构造函数线程池入口函数队列中取任务添加任务函数线程池终止函数 源码 之前用C语言写了一个线程池,详情请见: C语言写一个线程池 这次换成C了!…...
【SASS/SCSS(一)】选择器
Sass 是一门高于 CSS 的元语言,它能用来清晰地、结构化地描述文件样式。 而SCSS是SASS引入的语法,是CSS的超集,所以所有CSS有效的使用在SCSS中都生效 一、回顾CSS选择器 通用选择器 *元素选择器类选择器,.classNameID选择器&am…...
详细解析Kafaka Streams中各个DSL操作符的用法
什么是DSL? 在Kafka Streams中,DSL(Domain Specific Language)指的是一组专门用于处理Kafka中数据流的高级抽象和操作符。这些操作符以声明性的方式定义了数据流的转换、聚合、连接等处理逻辑,使得开发者可以更加专注…...
C++中链表的底层迭代器实现
大家都知道在C的学习中迭代器是必不可少的,今天我们学习的是C中的链表的底层迭代器的实现,首先我们应该先知道链表的底层迭代器和顺序表的底层迭代器在实现上有什么区别,为什么顺序表的底层迭代器更加容易实现,而链表的底层迭代器…...
3.5、matlab打开显示保存点云文件(.ply/.pcd)以及经典点云模型数据
1、点云数据简介 点云数据是三维空间中由大量二维点坐标组成的数据集合。每个点代表空间中的一个坐标点,可以包含有关该点的颜色、法向量、强度值等额外信息。点云数据可以通过激光扫描、结构光扫描、摄像机捕捉等方式获取,广泛应用于计算机视觉、机器人…...
Qt-事件与信号
事件和信号的区别在于,事件通常是由窗口系统或应用程序产生的,信号则是Qt定义或用户自定义的。Qt为界面组件定义的信号往往通常是对事件的封装,如QPushButton的clicked()信号可以看做对QEvent::MouseButtonRelease类事件的封装。 在使用界面组…...
数据结构 day3
目录 思维导图: 学习内容: 1. 顺序表 1.1 概念 1.2 有关顺序表的操作 1.2.1 创建顺序表 1.2.2 顺序表判空和判断满 1.2.3 向顺序表中添加元素 1.2.4 遍历顺序表 1.2.5 顺序表按位置进行插入元素 1.2.6 顺序表任意位置删除元素 1.2.7 按值进…...
Kubernetes面试整理-如何进行滚动更新和回滚?
在 Kubernetes 中,滚动更新和回滚是管理应用程序版本的常用操作。滚动更新允许您逐步替换现有的 Pod 实例,以便在不中断服务的情况下部署新版本。回滚则是在新版本出现问题时恢复到之前的版本。 滚动更新 通过 Deployment 进行滚动更新 1. 创建一个 Deployment: 下面是一个…...
flutter ios打包 xcode报错module ‘xxx‘ not found
flutter ios打包 xcode报错module ‘xxx’ not found 如果已经在androidstudio中成功运行了flutter build ios --release。 那么可能是你使用xcode打开的是ios/Runner.xcodeproj文件。 你关掉xcode,重新打开ios/Runner.xcworkspace/文件。然后重新archiveÿ…...
LLM 构建Data Multi-Agents 赋能数据分析平台的实践之④:数据分析之三(数据展示)
概述 在先前探讨的文章中,我们构建了一个全面的数据测试体系,该体系遵循“数据获取—数据治理—数据分析”的流程。如何高效地构建数据可视化看板,以直观展现分析结果,正逐渐成为利用新兴技术提升效能的关键领域。伴随业务拓展、数…...
Elasticsearch 批量更新
Elasticsearch 批量更新 准备条件查询数据批量更新 准备条件 以下查询操作都基于索引crm_flow_info来操作,索引已经建过了,本文主要讲Elasticsearch批量更新指定字段语句,下面开始写更新语句执行更新啦! 查询数据 查询指定shif…...
【Pytorch笔记】张量
torch.Tensor() 是 PyTorch 库中用于创建张量的一个函数。在 PyTorch 中,张量是多维数组,它们可以存储在 CPU 或 GPU 上,并且支持自动求导,这使得它们非常适合进行深度学习和科学计算。 张量可以在Python list形式下通过 torch.T…...
查找json中指定节点的值,替换为指定的值
有时我们封装好的实体转化成的json字段的值和第三方要求的不一样,比如我们字段的值是字符串,我们需要使用int类型的值,就需要将这个键的值转化成int类型。 比如将以下 convulsionNumber字段中字符串的值“一次”替换为0 {"convulsionT…...
Android 14 开机时间优化措施
Android开机优化系列文档-CSDN博客 Android 14 开机时间优化措施汇总-CSDN博客Android 14 开机时间优化措施-CSDN博客根据systrace报告优化系统时需要关注的指标和优化策略-CSDN博客Android系统上常见的性能优化工具-CSDN博客Android上如何使用perfetto分析systrace-CSDN博客A…...
【QGroundControl二次开发】二.使用QT编译QGC(Windows)
【QGroundControl二次开发】一.开发环境准备(Windows) 二. 使用QT编译QGC(Windows) 2.1 打开QT Creator,选择打开项目,打开之前下载的QGC项目源码。 编译器选择Desktop Qt 6.6.3 MSVC2019 64bit。 点击运…...
[C/C++入门][变量和运算]4、带余除法
给定被除数和除数,求整数商及余数 看到这个题,我们都知道C的除法运算符 /,默认是不带余数的。那现在要求带余数,需要能够想到% %,是C获取余数的方法:比如5/22; 5%21;%得到的是除后的余数。 #inc…...
常用优秀内网穿透工具(实测详细版)
文章目录 1、前言2、安装Nginx3、配置Nginx4、启动Nginx服务4.1、配置登录页面 5、内网穿透5.1、cpolar5.1.1、cpolar软件安装5.1.2、cpolar穿透 5.2、Ngrok5.2.1、Ngrok安装5.2.2、随机域名5.2.3、固定域名5.2.4、前后端服务端口 5.3、NatApp5.4、Frp5.4.1、下载Frp5.4.2、暴露…...
防火墙NAT地址转换和智能选举综合实验
一、实验拓扑 目录 一、实验拓扑 二、实验要求(接上一个实验要求后) 三、实验步骤 3.1办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 3.2分公司设备可以通过总公司的移动链路和电信链路访…...
Android获取当前屏幕显示的是哪个activity
在 Android 中,要获取当前屏幕显示的 Activity,可以使用以下几种方法: 方法一:使用 ActivityManager 获取当前运行的任务信息 这是一个常见的方法,尽管从 Android 5.0 (API 21) 开始,有些方法变得不太可靠…...
JVM:自动垃圾回收
文章目录 一、C/C的内存管理二、Java的内存管理1、方法去的回收2、堆回收(1)引用计数法和可达性分析法(2)五种对象引用(3)垃圾回收算法 一、C/C的内存管理 在C和C没有自动垃圾回收机制,一个对象…...
【填坑指南】PHP8报:Unable to load dynamic library ‘zip.so’ 错误
1.原因分析 这种情况多数发生在PHP安装时因为各种原因失败后,残余的库与最后安装的PHP版本不兼容导致的。 2.我的路径 一开始我按照以前摸索出来的安装PHP7.3的成功经验来编译方法安装PHP8.3,发现以前的套路已经失效了。反复重装PHP8.3失败后…...
鸿蒙语言基础类库:【@system.notification (通知消息)】
通知消息 说明: 从API Version 7 开始,该接口不再维护,推荐使用新接口[ohos.notification]。本模块首批接口从API version 3开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import notification fro…...
wordpress文章和博客的区别/宁波seo网络推广公司排名
选对正确的学习方法途径,是高效学习Python的前提。想选一个最好的学习方法,肯定是要先相互比较一下的。 先看看最传统的买一本Python的基础书学习。通常来说,我们能买到的Python基础学习书都是有基本的质量保证的,最起码不会出现错…...
小密圈wordpress/seo网络营销是什么意思
从输入URL到页面加载的过程?如何由一道题完善自己的前端知识体系! http://www.dailichun.com/2018/03/12/whenyouenteraurl.html转载于:https://www.cnblogs.com/zard2008/p/9110586.html...
wordpress以前版本/网站推广优化平台
1、java日志记录错误的文件、方法、行号、报错信息StackTraceElement s e.getStackTrace()[0];1.1、记录保存的文件s.getFileName()1.2、记录保存的方法s.getMethodName()1.3、记录报错的行号 s.getLineNumber()1.4、记录报错的信息(不全面) e.getMessage()1.5、互利报错的类名…...
动图从哪个网站做/编程培训机构排名前十
在写一个WinCE注册表操作的时候,调用RegDeleteKey函数却不能删除注册表项,始终返回5的错误(ACCESS DENY)。查了一下,有的说是什么权限的问题,操作的时候都是先打开注册表,如果打开成功,即调用RegDeleteKey删…...
网站备案快速备案/针对大学生推广引流
客户服务管理技巧 上文为您介绍了需要客户服务管理的重要性,以下是为你提供一些可以直接借鉴客户服务管理技巧,这些技巧肯定会提高客户满意度: 1:雇用具有符合您业务需求的技能和素质的人员 流程和系统很重要,但您提…...
平台网站可以做第三方检测报告/淘宝seo 优化软件
首先我们这里提到的锁,是把所需要的代码块,资源,或数据锁上,在操作他们的时候只允许一个线程去做操作。最终结果是为了保证cpu计算结果的正确性。 对不可重入锁的理解: public class Test{Lock lock new Lock();pub…...