Redis 数据类型详解

ops/2024/9/18 12:05:56/ 标签: redis, 数据库, 缓存

Redis 是一个开源的内存数据结构存储系统,广泛应用于缓存、消息队列、实时数据分析等场景。Redis 提供了多种数据类型,本文将详细介绍 Redis 的五种主要数据类型及其应用场景,并从概述、基本操作、应用场景和数据结构等方面进行深入探讨。

1. 字符串 (String)

概述

字符串是 Redis 中最基本的数据类型。一个键对应一个值,这个值可以是字符串、整数、浮点数等。字符串的值可以是二进制安全的,即可以存储任意类型的数据,如文本、图片、视频等。Redis 的字符串类型实际上是动态字符串(Simple Dynamic String,SDS),它不仅用于存储键值对,还用于内部缓冲区等场景。

基本操作
  • SET key value:设置指定 key 的值。如果 key 已经存在,覆盖旧值。
  • GET key:获取指定 key 的值。
  • INCR key:将指定 key 的值加 1。如果 key 不存在,初始化为 0 后再加 1。
  • DECR key:将指定 key 的值减 1。如果 key 不存在,初始化为 0 后再减 1。
  • APPEND key value:将 value 追加到指定 key 的值之后。如果 key 不存在,则创建一个新的 key。
  • STRLEN key:获取指定 key 的值的长度。
  • MSET key value [key value ...]:同时设置多个 key-value 对。
  • MGET key [key ...]:同时获取多个 key 的值。
  • GETSET key value:设置新的值并返回旧的值。
应用场景
  • 缓存数据:字符串类型常用于缓存数据,如缓存 API 响应结果,以减少数据库查询次数,提高系统性能。
  • 存储配置信息:适用于存储简单的配置信息,如应用程序的设置、参数等。
  • 分布式锁:通过 SETNX 命令可以实现分布式锁,用于控制多个客户端对同一资源的访问。
  • 计数器:例如记录网站访问量,通过 INCRDECR 命令实现。
数据结构

字符串在 Redis 内部是用 SDS 实现的。SDS 是一种动态字符串,其结构包括以下几个部分:

  • len:表示已使用的字符长度。
  • alloc:表示分配的内存大小。
  • buf:实际存储字符的数组。

这种设计使得 SDS 具有以下优点:

  • 获取字符串长度的时间复杂度为 O(1):因为长度是保存在结构中的,不需要遍历整个字符串。
  • 惰性空间释放:在缩短字符串时,并不会立即缩小内存,而是保留以备后用,减少了频繁的内存分配和释放。
  • 预分配:在扩展字符串时,按一定策略多分配一些内存,减少了内存分配的次数。

2. 列表 (List)

概述

列表是一种有序的数据结构,允许在头部和尾部进行插入和删除操作。列表中的每个元素都是一个字符串,并且可以通过索引下标进行访问。Redis 的列表底层实现是一个双向链表,当元素较少时,会用压缩列表来实现。

基本操作
  • LPUSH key value:将 value 插入到列表的左端。
  • RPUSH key value:将 value 插入到列表的右端。
  • LPOP key:移除并返回列表的左端元素。
  • RPOP key:移除并返回列表的右端元素。
  • LRANGE key start stop:获取列表中指定范围内的元素。范围从 start 到 stop,包括 start 和 stop。
  • LINDEX key index:通过索引获取列表中的元素,索引从 0 开始。
  • LSET key index value:通过索引设置列表中元素的值。
  • LLEN key:获取列表的长度。
  • LINSERT key BEFORE|AFTER pivot value:在列表中指定的值前或后插入新值。
应用场景
  • 消息队列:通过 LPUSHRPOP 命令实现,生产者将消息放入队列左端,消费者从右端取出消息。
  • 任务队列:存储待处理的任务,通过 BRPOP 实现阻塞队列,等待任务的到来。
  • 最近访问记录:例如浏览历史,最新访问的内容总是插入到列表头部。
数据结构

Redis 的列表有两种实现方式:

  1. 压缩列表(ziplist):当列表中的元素较少且每个元素长度较短时,Redis 使用压缩列表实现。这是一种连续内存块,内存占用较少,但在执行插入和删除操作时需要移动大量数据。
  2. 双向链表(linkedlist):当列表中的元素较多或元素较大时,Redis 使用双向链表实现。双向链表的优点是插入和删除操作的时间复杂度为 O(1),但每个节点都需要额外的内存来存储前驱和后继指针。

3. 集合 (Set)

概述

集合是一种无序且不重复的字符串集合。集合提供了丰富的操作命令,如交集、并集、差集等。Redis 集合的内部实现基于哈希表,当元素较少时会使用整数数组。

基本操作
  • SADD key member:向集合添加一个元素。如果元素已存在,则忽略该操作。
  • SREM key member:移除集合中的一个元素。如果元素不存在,则忽略该操作。
  • SMEMBERS key:返回集合中的所有元素。
  • SISMEMBER key member:判断 member 是否是集合中的元素。
  • SUNION key [key ...]:返回给定所有集合的并集。
  • SINTER key [key ...]:返回给定所有集合的交集。
  • SDIFF key [key ...]:返回第一个集合与其他集合的差集。
  • SCARD key:获取集合的元素数量。
应用场景
  • 标签管理:例如给文章添加标签,一个标签集合对应一个文章。
  • 好友关系:存储用户的好友列表,通过集合的交集操作可以找到共同好友。
  • 去重操作:例如存储唯一的访问 IP,通过集合的无重复特性实现去重。
数据结构

Redis 的集合有两种实现方式:

  1. 整数集合(intset):当集合中的元素都是整数且数量较少时,使用整数集合实现。整数集合是一种紧凑的数据结构,内存占用少,但只支持整数类型。
  2. 哈希表(hashtable):当集合中的元素较多或包含非整数类型时,使用哈希表实现。哈希表的查找、插入和删除操作时间复杂度为 O(1),但每个元素需要额外的内存来存储哈希值和指针。

4. 有序集合 (Sorted Set)

概述

有序集合类似于集合,但每个元素都会关联一个分数(score),Redis 会按分数值进行排序。分数可以是任意双精度浮点数。与集合不同,有序集合中的元素是有序的。

基本操作
  • ZADD key score member:向有序集合添加元素,并设置其分数。如果元素已存在,则更新其分数。
  • ZREM key member:移除有序集合中的一个元素。
  • ZRANGE key start stop [WITHSCORES]:返回指定范围内的元素(按分数从低到高排序)。
  • ZREVRANGE key start stop [WITHSCORES]:返回指定范围内的元素(按分数从高到低排序)。
  • ZRANK key member:返回元素的排名(按分数从低到高)。
  • ZREVRANK key member:返回元素的排名(按分数从高到低)。
  • ZSCORE key member:返回元素的分数。
  • ZINTERSTORE destination numkeys key [key ...]:计算给定有序集合的交集,并存储在新的有序集合中。
  • ZUNIONSTORE destination numkeys key [key ...]:计算给定有序集合的并集,并存储在新的有序集合中。
应用场景
  • 排行榜:例如游戏中的得分排行榜,通过分数进行排序,实时更新排名。
  • 优先级队列:通过分数表示优先级,分数越低优先级越高。
  • 延迟队列:通过分数表示延迟时间,分数越低延迟越短。
数据结构

有序集合的底层实现是跳跃表(skiplist)和

哈希表(hashtable)的结合:

  1. 跳跃表(skiplist):跳跃表是一种以层级结构实现的有序数据结构,支持高效的范围查询和按分数排序。跳跃表由多个层级构成,每一层是一个有序链表,底层链表包含所有元素,每高一层的链表是低层链表的一个子集。跳跃表的查找、插入和删除操作的平均时间复杂度为 O(log N)。
  2. 哈希表(hashtable):哈希表用于快速查找元素和分数,支持 O(1) 时间复杂度的插入、删除和查找操作。

这种组合设计使得有序集合既具备高效的范围查询和排序能力,又能快速进行元素查找和更新操作。

5. 哈希 (Hash)

概述

哈希是一种键值对集合,每个键对应一个哈希表,哈希表内部包含多个字段和对应的值,适用于存储对象数据。哈希类型的数据结构类似于传统的字典或映射表,特别适合表示对象(例如用户信息、商品信息等)。

基本操作
  • HSET key field value:设置哈希表中指定字段的值。如果字段不存在,则创建。
  • HGET key field:获取哈希表中指定字段的值。
  • HDEL key field [field ...]:删除哈希表中指定字段。
  • HGETALL key:获取哈希表中所有字段和值。
  • HKEYS key:获取哈希表中的所有字段。
  • HVALS key:获取哈希表中的所有值。
  • HLEN key:获取哈希表中的字段数量。
  • HEXISTS key field:判断哈希表中是否存在指定字段。
  • HMSET key field value [field value ...]:同时设置哈希表中多个字段的值。
  • HMGET key field [field ...]:同时获取哈希表中多个字段的值。
应用场景
  • 存储用户信息:例如用户 ID、用户名、密码等信息,通过哈希表存储每个用户的属性。
  • 产品信息:存储商品的属性,如价格、库存、描述等。
  • 会话信息:存储用户的会话状态和数据。
数据结构

Redis 的哈希表有两种实现方式:

  1. 压缩列表(ziplist):当哈希表中的字段较少且字段和值长度较短时,使用压缩列表实现。压缩列表是一种连续内存块,内存占用较少,但在执行插入和删除操作时需要移动大量数据。
  2. 哈希表(hashtable):当哈希表中的字段较多或字段和值较长时,使用哈希表实现。哈希表的查找、插入和删除操作时间复杂度为 O(1),但每个字段和值需要额外的内存来存储哈希值和指针。

其他数据类型

6. 位图 (Bitmap)
概述

位图是一种紧凑的方式来存储二进制数据,可以将其视为一个位数组。每个位可以存储 0 或 1,用于表示布尔值。位图通常用于记录状态信息,如用户签到、活动参与情况等。

基本操作
  • SETBIT key offset value:将位图中指定偏移量的位设置为 0 或 1。
  • GETBIT key offset:获取位图中指定偏移量的位的值。
  • BITCOUNT key [start end]:统计位图中值为 1 的位的数量。
  • BITOP operation destkey key [key ...]:对一个或多个位图进行按位操作,并将结果存储在新的位图中。操作包括 AND、OR、NOT、XOR。
应用场景
  • 用户签到:记录用户每天的签到情况,一个位代表一天。
  • 活动参与:记录用户是否参与活动。
  • 权限管理:记录权限位,一个位代表一种权限。
数据结构

位图是基于字符串实现的,字符串的每个字节由 8 个比特位构成,可以表示 8 个布尔值。位图操作实际上是对字符串进行位操作。

7. HyperLogLog
概述

HyperLogLog 是一种用于基数统计的概率算法,适用于需要统计大量数据的场景,如独立 IP 访问量、用户数等。它的优势在于占用内存非常小,但能够在一定误差范围内提供准确的基数估计。

基本操作
  • PFADD key element [element ...]:将元素添加到 HyperLogLog 中。
  • PFCOUNT key [key ...]:返回 HyperLogLog 中独立元素的估计数量。
  • PFMERGE destkey sourcekey [sourcekey ...]:合并多个 HyperLogLog 并将结果存储在新的 HyperLogLog 中。
应用场景
  • 独立访客统计:统计网站独立访客数量。
  • 用户行为分析:统计不同用户的行为次数,如点击、点赞等。
数据结构

HyperLogLog 的数据结构基于概率算法,通过哈希函数将数据映射到不同的桶,并记录桶中的最大值。它使用少量内存(通常 12KB)来存储基数估计信息。

8. 地理空间 (Geo)

概述

Redis 提供了地理空间(Geo)数据类型,可以存储地理位置数据,并提供基于位置的操作命令,如附近位置查询、距离计算等。

基本操作
  • GEOADD key longitude latitude member:将地理位置添加到地理空间集合中。
  • GEOPOS key member [member ...]:获取地理空间集合中成员的位置(经度和纬度)。
  • GEODIST key member1 member2 [unit]:计算两个成员之间的距离,单位可以是 m(米)、km(千米)、mi(英里)、ft(英尺)。
  • GEORADIUS key longitude latitude radius m|km|mi|ft:以给定的经纬度为中心,查询指定半径范围内的所有成员。
  • GEORADIUSBYMEMBER key member radius m|km|mi|ft:以给定的成员为中心,查询指定半径范围内的所有其他成员。
应用场景
  • 附近地点查询:例如餐厅、商店、加油站等。
  • 用户位置服务:提供基于位置的服务,如打车、外卖等。
数据结构

地理空间数据类型基于有序集合(Sorted Set)实现。每个成员的分数是通过 Geohash 算法计算得到的,使得地理位置可以通过有序集合进行存储和排序。

结论

Redis 提供的丰富数据类型使得它能够灵活应对各种数据处理需求。理解并合理使用这些数据类型,可以有效提升应用的性能和可扩展性。在实际应用中,选择合适的数据类型将对系统的性能和维护带来显著的影响。

希望本文能帮助你更好地理解 Redis 数据类型,并在实际项目中灵活运用这些知识。如果你有任何问题或需要进一步的讨论,欢迎在评论区留言,我们一起探讨。


http://www.ppmy.cn/ops/108333.html

相关文章

iftop:实时流量监控利器(使用方法)

一、功能概览 实时流量监控&#xff1a;使用iftop -i <interface>监控指定网络接口的实时流量。流量排序&#xff1a;iftop -i <interface> -o <interval> -s 2&#xff0c;按流量大小排序&#xff0c;刷新间隔可调。过滤连接&#xff1a;iftop -i <inte…

有限体积法:基于一维稳态扩散问题及其程序实现

文章目录 有限体积法&#xff1a;基于一维稳态扩散问题及其程序实现1. 问题描述2. 有限体积法的应用步骤2.1 步骤一&#xff1a;生成离散网格2.2 步骤二&#xff1a;构造离散方程2.3 步骤三&#xff1a;解方程组 3. 编程实现4. 总结 有限体积法&#xff1a;基于一维稳态扩散问题…

“CSS 定位”如何工作?(补充)——WEB开发系列34

CSS定位是一个非常重要的布局工具&#xff0c;它允许我们精确地控制元素的位置&#xff0c;从而创建复杂的布局效果。定位允许你从正常的文档流布局中取出元素&#xff0c;并使它们具有不同的行为&#xff0c;例如放在另一个元素的上面&#xff0c;或者始终保持在浏览器视窗内的…

前端基础面试题·第三篇——JavaScript(其三)

1.字符串 (1) 常用方法 1.charAt(index) 返回指定位置的字符,若没找到&#xff0c;则返回空2.charCodeAt(index) 返回指定位置的unicode字符编码,若没找到&#xff0c;则返回空 3.String.concat(str1,str2) 连接多个字符串&#xff0c;并返回新字符串4.String.fromCharCode(co…

学习记录之C语言学习笔记1

1. 数据类型 基本数据类型&#xff1a;整型&#xff08;int&#xff09;、浮点型&#xff08;float&#xff09;、字符型&#xff08;char&#xff09;和双精度浮点型&#xff08;double&#xff09;。 派生数据类型&#xff1a;数组、结构体、联合体和枚举。 void类型…

Python Web开发-一文了解(详细教程)

本文深入探讨了Python在Web开发领域的应用&#xff0c;全面覆盖了从Python Web框架&#xff08;包括Django和Flask&#xff09;的使用&#xff0c;到数据库管理、前端设计技巧&#xff0c;以及API的开发。文章还详细阐述了Web开发的准备工作和步骤&#xff0c;包括如何安装Pyth…

谷歌seo网址如何快速被收录?

想让你的网站快速被搜索引擎收录&#xff0c;可以采取几种不同的策略。首先&#xff0c;确保你的网站内容丰富、有价值&#xff0c;搜索引擎更喜欢收录内容质量高的网站。同时&#xff0c;增强网站的外链建设&#xff0c;做好这些站内优化&#xff0c;接下来就是通过谷歌搜索控…

Tomcat配置及Servlet相关知识

这里以Eclipse为例&#xff0c;IDEA配置参考&#xff1a;IDEA 配置 Tomcat 一、Eclipse配置Tomcat 1.配置服务器运行环境 在窗口-首选项找到服务器-运行时环境&#xff0c;点击添加 在Apache中找到安装的Tomcat版本&#xff0c;下一步 选择安装目录以及所需的jdk版本&#x…

kali安装开启ssh服务以便于物理机远程连接kali

kali自带ssh&#xff0c;所以不用安装 切换root用户 kali开启ssh服务 systemctl start ssh kali自带vim&#xff0c;打开/etc/ssh/sshd_config vim /etc/ssh/sshd_config 将以下几行的注释解除&#xff0c;某些修改为yes PermitRootLogin yes PubkeyAuthentication yes…

2024年企业级电脑监控软件推荐,精选的电脑监控软件

随着企业信息化程度的不断提高&#xff0c;如何有效监控和管理企业电脑成为许多企业主和IT管理员的重要任务。企业级电脑监控软件不仅可以帮助企业提高工作效率&#xff0c;保障数据安全&#xff0c;还能够防止内部数据泄露和违规操作。在2024年&#xff0c;有多款优秀的电脑监…

免费的文章生成器有哪些?盘点5款为你自动生成文章

文章生成器的普及&#xff0c;为创作者提供了全新的创作视角和效率提升途径。那么&#xff0c;市面上有哪些免费的文章生成器可供我们使用呢&#xff1f;接下来&#xff0c;本文将为大家详细介绍5款功能强大、操作简便的免费文章生成器&#xff0c;它们将有助大家在内容创作的道…

llvm后端之函数栈帧的创建与销毁

llvm后端之函数栈帧的创建与销毁 引言1 目标扩展实现1.1 emitPrologue和emitEpilogue1.2 storeRegToStackSlot和loadRegFromStackSlot 2 寄存器存栈与恢复 引言 llvm后端在物理寄存器分配后、指令发射前会调用PEI这个pass来生成函数栈帧的创建与销毁。 1 目标扩展实现 在tar…

8Manage采购申请管理:轻松实现手动采购流程自动化

您是否感受到通过手动采购申请流程管理成本的压力&#xff1f; 信息的不充分常常导致现金流的不透明&#xff0c;这已成为财务高管们的常见痛点。本文将展示采购申请管理软件如何帮助您减轻负担&#xff0c;使您能够简化流程。 没有采购申请软件会面临哪些挑战&#xff1f; …

深入理解FastAPI的response_model:自动化数据验证与文档生成

使用 FastAPI 的 response_model 参数 在构建 RESTful API 时&#xff0c;确保数据的一致性和正确性是非常重要的。FastAPI 提供了强大的工具来帮助开发者实现这一目标。其中一个关键特性是 response_model 参数&#xff0c;它允许开发者定义期望的响应格式&#xff0c;并自动…

iphone13 不升级IOS使用广电卡

iPhone13的信号&#x1f4f6;&#xff0c;15系统刷高版本iPCC&#xff0c;本帖以后不再更新&#xff01;&#xff01;&#xff01; 自从知道可以通过刷iPCC的方式改善信号(不更新iOS大版本的情况下)&#xff0c;尝试了各种版本。 我自己用下来总结 - 移动联通48、49、50 &…

EasyCVR无法启动并报错“error while loading shared libraries”,如何解决?

安防监控/视频汇聚平台EasyCVR视频管理系统以其强大的拓展性、灵活的部署方式、高性能的视频能力和智能化的分析能力&#xff0c;为各行各业的视频监控需求提供了优秀的解决方案。通过简单的配置和操作&#xff0c;用户可以轻松地进行远程视频监控、存储和查看&#xff0c;满足…

【计算机网络】描述TCP建立连接与断开的过程

一、TCP连接的建立与断开 1、建立连接——三次握手 1、A的TCP向B发出连接请求报文段 其首部中的同步位SYN 1&#xff0c;并选择序号seq x&#xff0c;表明传送数据时的第一个数据字节的序号是 x 2、B的TCP收到连接请求报文段后&#xff0c;如同意&#xff0c;则发回确认。 B …

mfc140u.dll文件错误的相关修复方法,4种方法修复mfc140u.dll

当面对基于Microsoft Visual C开发的应用程序出现启动或运行失败时&#xff0c;mfc140u.dll文件错误往往是罪魁祸首之一。这个动态链接库&#xff08;DLL&#xff09;文件对于许多Windows软件来说是必不可少的&#xff0c;因为它包含了重要的编程代码和数据。如果发现此文件损坏…

应用基本期末

选 以下哪些属于Java的三大特性&#xff1a; a. 抽象 b. 封装 c. 面向对象 d. 分布式 e. 安全性 f. 平台独立 以下哪些是Object的公用方法&#xff1f; a. equals() b. getContext() c. notify() d. toString() e. clone() int和integer两个谁更占用内存&#xff1f; a. Int …

【Hot100】LeetCode—45. 跳跃游戏 II

目录 1- 思路覆盖范围 2- 实现⭐45. 跳跃游戏 II——题解思路 3- ACM 实现 原题链接&#xff1a;45. 跳跃游戏 II 1- 思路 覆盖范围 int cur 0 &#xff1a;记录当前的覆盖范围int next 0&#xff1a;记录当前结点最远的跳跃距离int res 0&#xff1a;记录具体跳几步 覆盖…