一文彻底搞透Redis的数据类型及具体的应用场景
Redis 提供了丰富的数据类型,每种数据类型都有其独特的存储结构和操作方法,可以满足不同的业务场景需求。下面详细介绍 Redis 支持的主要数据类型及其底层实现,并结合具体的应用场景说明其使用。
1. 字符串(String)
介绍:
- Redis 中最基本的键值对类型,键和值都可以是字符串,值的最大限制为 512MB。
String类型是 Redis 最常用的数据类型,它支持简单的GET、SET操作,以及自增、自减、字符串拼接等操作。
典型应用场景:
- 缓存数据:存储用户登录状态、Token、配置信息等。
- 计数器:通过
INCR、DECR实现简单的计数器,比如网站访问量、点赞数等。 - 分布式锁:结合
SETNX命令,可以用字符串来实现简单的分布式锁。
底层原理:
- Redis 底层对字符串使用的是简单动态字符串(SDS),它不仅是 C 字符串的封装,还加入了长度属性和空间预留等优化策略。SDS 支持二进制安全,可以存储文本和二进制数据。
2. 哈希(Hash)
介绍:
- 哈希是一个键值对集合,适合存储对象。每个键可以有多个字段,每个字段都有一个值。
- 操作包括
HSET、HGET、HDEL等。
典型应用场景:
- 存储用户信息:如用户 ID 作为键,用户的属性(姓名、年龄、性别等)作为字段,避免将整个用户对象序列化成字符串。
- 配置项管理:存储配置项,方便根据字段名快速访问和更新某个配置。
底层原理:
- 哈希使用了两种底层数据结构:小数据量时使用压缩列表(ziplist),大数据量时使用哈希表(hashtable)。压缩列表可以节省内存,但随着哈希表的增长会自动转换为哈希表,保证查询效率。
3. 列表(List)
介绍:
- 列表是一个双向链表,可以从头部或尾部插入、删除元素,常用命令包括
LPUSH、RPUSH、LPOP、RPOP等。 - Redis 支持阻塞操作,如
BLPOP、BRPOP,在没有元素时可以阻塞等待。
典型应用场景:
- 消息队列:列表可以作为简单的消息队列,用
LPUSH将消息放入队列,用RPOP或BRPOP弹出消息。 - 任务调度:异步任务分发系统中,可以将任务放入队列中,由多个消费者去消费。
底层原理:
- 列表采用双向链表(quicklist)实现。对于较短的列表,Redis 会使用压缩列表(ziplist)来节省内存;对于较长的列表,则会采用真正的双向链表来平衡操作的时间复杂度。
4. 集合(Set)
介绍:
- 集合是无序的、唯一的元素集合,提供类似于数学集合的操作,支持交集、并集、差集等。
- 常用操作包括
SADD、SREM、SISMEMBER、SMEMBERS、SINTER等。
典型应用场景:
- 标签系统:如将用户标签存储为集合,每个集合代表一个用户群体,方便进行集合运算,如找出同时拥有某两个标签的用户。
- 去重功能:在某些场景下(如热门搜索词、访问日志的去重),可以通过集合的唯一性特性来避免重复数据。
底层原理:
- 小集合时使用整数集合(intset),大集合时使用哈希表(hashtable)实现。通过哈希表的快速查找特性,可以实现 O(1) 的时间复杂度来判断元素是否存在。
5. 有序集合(Sorted Set)
介绍:
- 有序集合类似于集合,但每个元素关联一个分数,集合中的元素会按分数排序。支持的操作包括
ZADD、ZRANGE、ZREM、ZREVRANGE、ZCOUNT等。
典型应用场景:
- 排行榜:比如游戏中的积分榜,按用户分数进行排名。可以通过
ZADD添加玩家及其分数,通过ZRANGE获取排名。 - 延迟任务:通过分数设置任务执行的时间,按时间从集合中取出需要执行的任务。
底层原理:
- 有序集合底层使用的是跳表(Skiplist)和哈希表相结合的数据结构,跳表使得有序集合支持快速的范围查询和插入操作(时间复杂度 O(logN)),而哈希表保证元素的快速定位。
6. 位图(Bitmaps)
介绍:
- 位图实际上是字符串类型的扩展,可以把字符串看作一系列连续的二进制位,可以对这些二进制位进行位操作。支持的命令有
SETBIT、GETBIT、BITCOUNT、BITOP等。
典型应用场景:
- 用户签到系统:用位图存储用户的签到记录,每天对应一个 bit,0 表示未签到,1 表示已签到。
- 活跃用户统计:通过位图存储某一时间段内用户是否活跃,快速统计某天有多少活跃用户。
底层原理:
- 位图的底层存储是 Redis 的字符串结构,但位操作是直接针对每个二进制位,因此能够在非常紧凑的存储空间内实现高效的操作,适合海量数据场景。
7. HyperLogLog
介绍:
- HyperLogLog 是一种用于基数统计的算法,可以用于估算一个集合中不重复元素的个数,且占用的内存空间非常小。
- 常用命令有
PFADD、PFCOUNT。
典型应用场景:
- 独立访客统计:在网站分析中统计独立访客(UV),只需为每个访客 ID 添加到 HyperLogLog 中,快速得到不重复用户数。
- 大规模数据去重计数:用于估算大规模数据中的去重个数,如点击、请求、访问量等。
底层原理:
- HyperLogLog 是一种基数估计算法,通过哈希分布将数据映射到位向量中,通过统计不同前缀的最大长度来估算基数,其优点是占用内存极小,缺点是只能进行估算,存在一定误差。
8. 地理空间(Geospatial)
介绍:
- Redis 支持存储地理位置数据,并基于这些数据进行范围查询和距离计算。常用命令包括
GEOADD、GEODIST、GEORADIUS、GEOHASH等。
典型应用场景:
- LBS 应用:比如打车应用中,存储司机和乘客的地理位置,根据位置计算距离,匹配最近的车辆。
- 附近商家搜索:用户输入位置后,查询附近的商家,并根据距离排序返回。
底层原理:
- Redis 的地理空间数据是基于有序集合实现的,使用
GEOHASH算法将地理坐标编码为 64 位的整数,存入有序集合中。通过对这些编码的范围查询,可以实现快速的空间检索。
9. 流(Streams)
介绍:
Stream是 Redis 5.0 引入的一种新的数据类型,支持消息队列的功能,类似于 Kafka 或者 RabbitMQ,支持消费组、消息持久化和自动应答等特性。常用命令包括XADD、XREAD、XGROUP、XACK等。
典型应用场景:
- 消息系统:通过流数据类型,多个消费者可以从同一个队列中消费数据,实现消息分发和处理。
- 日志系统:可以将日志信息存储在 Redis 的流中,实现持久化和实时消费。
底层原理:
- Stream 是基于压缩列表和链表的结合体,数据结构复杂度较高,可以高效存储大量的流式数据。通过内部维护的 ID 进行排序和管理,使得它适合处理有序的、持续生成的数据流。
总结
Redis 提供的多种数据类型,不仅丰富了其在不同业务场景下的适用性,还能通过内存友好的数据结构和高效的算法来保证性能。在选择 Redis 数据类型时,通常需要根据业务需求来匹配合适的数据结构,从而最大限度地提升系统性能和资源利用率。
一文彻底搞透Redis的数据类型及具体的应用场景的更多相关文章
- 一文搞定Redis五大数据类型及应用场景
本文学习知识点 redis五大数据类型数据类型:string.hash.list.set.sorted_set 五大类型各自的应用场景 @TOC 1. string类型 1-1 string类型数据的 ...
- 一文轻松搞懂redis集群原理及搭建与使用
今天早上由于zookeeper和redis集群不在同一虚拟机导致出了点很小错误(人为),所以这里总结一下redis集群的搭建以便日后所需同时也希望能对你有所帮助. 笔主这里使用的是Centos7.如果 ...
- Redis | 一文轻松搞懂redis集群原理及搭建与使用
转载:https://juejin.im/post/5ad54d76f265da23970759d3 作者:SnailClimb 这里总结一下redis集群的搭建以便日后所需同时也希望能对你有所帮助. ...
- redis字符串数据类型基本概念和应用场景
基本概念:1.string类型是redis能与键关联的最简单的数据类型,它是memcached当中仅有的数据类型.2.redis的key名称也是一个字符串,当我们使用字符串类型作为其对应的值时,我们可 ...
- Redis set数据类型命令使用及应用场景使用总结
转载请注明出处: 目录 1.sadd 集合添加元素 2.srem移除元素 3.smembers 获取key的所有元素 4.scard 获取key的个数 5.sismember 判断member元素是否 ...
- Redis系列(二):Redis的数据类型及命令操作
原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...
- 面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)
Redis 面试题 1.什么是 Redis?. 2.Redis 的数据类型? 3.使用 Redis 有哪些好处? 4.Redis 相比 Memcached 有哪些优势? 5.Memcache 与 Re ...
- 【转】面试还搞不懂redis,快看看这40道Redis面试题(含答案和思维导图)
———————————————— 版权声明:本文为CSDN博主「程序员追风」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog. ...
- 3.redis 都有哪些数据类型?分别在哪些场景下使用比较合适?
作者:中华石杉 面试题 redis 都有哪些数据类型?分别在哪些场景下使用比较合适? 面试官心理分析 除非是面试官感觉看你简历,是工作 3 年以内的比较初级的同学,可能对技术没有很深入的研究,面试官才 ...
- Redis之数据类型
一.概念: Redis:一个开源.支持网络.基于内存.键值对存储数据库. 特点:它可以支持多种数据类型. 二.数据类型 1)Redis String 具体说明: 一般的普通的k到v一个映射是Strin ...
随机推荐
- NVIDIA显卡原生管理查询功能nvidia-smi的部分使用功能
本文是使用NVIDIA原生管理工具查询NVIDIA显卡使用情况的一些记录(使用远程管理工具的效率没有使用原生管理接口nvml的效率高,有效率需求者建议使用python版本捆绑的nvml库,具体:htt ...
- NOI2024 集合 题解
给个链接:集合. 很神秘的题目.基本上看到之后就可以想到哈希. 首先想到一个比较神秘的暴力.就是对于每个询问,扫一遍所有 \(a\) 中的数出现的位置,把它弄成一个哈希值(具体怎么弄随意)存到 set ...
- 我们与高效工作流的距离:使用AI阅读工具ChatDOC+笔记软件Obsidian Slide,直接从 PDF 文献直接输出 PPT 报告
我们与高效工作流的距离 在当今信息化的时代,为了实现高效工作和学习,如何实现快速地输入和输出成为每个人的必修课题. 然而,对于输入而言,每一天大量的信息,往往会使我们陷入信息过载和知识爆炸的困境,难以 ...
- SMU Summer 2023 Contest Round 12
SMU Summer 2023 Contest Round 12 A. K-divisible Sum 分类讨论: \(n > k\)时: \(n\)能整除\(k\)就全是\(1\) 不能整除, ...
- rk3568 | 瑞芯微平台GPIO引脚驱动编写
最近在玩瑞芯微平台的产品,移植了几个设备的驱动,遇到了一些问题,总结后发现大部分问题都出在了GPIO配置的问题上,写下本篇文章,用来分享一下调试的心得. 有喜欢瑞芯微的朋友,可以加我好友,拉你进群,一 ...
- 从0写一个电话号码管理的C入门项目【适合初学者】
0.前言 上次发了一个嵌入式的学习路线,很多粉丝问我各个阶段的入门项目,其中第二阶段的<基于socket聊天室>写了4篇循序渐进的文章,而第一阶段的<电话号码本管理>也非常想要 ...
- 【CMake系列】05-静态库与动态库编译
在各种项目类型中,可能我们的项目就是一个 库 项目,向其他人提供 我们开发好的 库 (windows下的 dll /lib : linux下的 .a / .so):有时候在一个项目中,我们对部分功能 ...
- NumPy 使用
NumPy 相当于 Python 中的 MATLAB import numpy as np # 被除数数组 dividends = np.array([10, 20, 30, 40, 50]) # 除 ...
- 小tips:vue2中broadcast和dispatch的实现
/* * broadcast 事件广播 * @param {componentName} 组件名称 * @param {eventName} 事件名 * @param {params} 参数 * 遍历 ...
- HDLC报文简单分析
最近在学习HDLC协议,从刚开始的一窍不通到现在的懵懵懂懂,下面分享一段报文解析,给初学者一点点经验的分析. 报文:7E A0 57 03 02 B8 4B 5B E6 E7 00 C4 01 C1 ...