Redis学习笔记:核心数据类型全解析(第十一章)
mhr18 2025-07-27 22:03 9 浏览 0 评论
Redis之所以成为高性能的数据结构服务器,核心在于其支持多种丰富的数据类型。这些类型并非简单的键值对,而是为特定场景设计的高效结构。本章将系统梳理Redis的八大数据类型(字符串、列表、集合、有序集合、哈希、位图、超日志、流),详解其特性、命令及典型应用场景,帮助你精准选择合适的结构解决实际问题。
一、Redis键(Keys):通用规则与最佳实践
在深入数据类型前,需先明确Redis键的通用特性,这是所有操作的基础:
- 二进制安全:键可以是任意二进制数据(如字符串、图片内容),空字符串也有效。
- 命名规范:
- 避免过长键(如1024字节),会增加内存占用和查找成本;
- 避免过短键(如"u1000flw"),可读性差,建议使用"user:1000:followers"等结构化命名;
- 统一格式(如"object-type:id:field"),便于管理和批量操作。
- 最大长度:键的最大允许长度为512MB(实际使用中应远小于此值)。
二、字符串(Strings):最基础的键值类型
字符串是Redis最基本的数据类型,所有键都与字符串值相关联(即使值是其他结构,键本身仍是字符串)。
核心特性
- 二进制安全:可存储文本、数字、图片等任意二进制数据,值最大为512MB。
- 原子操作:支持自增、自减等原子命令,适合计数器场景。
常用命令
命令 | 描述 | 示例 |
SET key val | 设置键值,覆盖已有值 | SET name "Alice" → OK |
GET key | 获取键值 | GET name → "Alice" |
INCR key | 原子自增(值需为整数) | INCR counter → 1(初始值为0时) |
DECRBY key n | 原子减n(值需为整数) | DECRBY score 5 → 15(原 score=20) |
MSET | 批量设置键值 | MSET a 1 b 2 → OK |
MGET | 批量获取键值 | MGET a b → ["1", "2"] |
典型场景
- 缓存用户信息、HTML片段等文本数据;
- 计数器(如文章阅读量、点赞数);
- 分布式锁的基础(结合SET NX PX命令)。
三、列表(Lists):有序可重复的元素集合
Redis列表基于双向链表实现,适合存储有序序列,支持两端高效操作。
核心特性
- 有序性:元素按插入顺序排列,可从头部或尾部操作。
- 高效操作:头部/尾部插入/删除元素为O(1),按索引访问为O(n)(不适合随机访问)。
- 自动管理:键随列表为空而自动删除,无需手动清理。
常用命令
命令 | 描述 | 示例 |
LPUSH key val | 向列表头部添加元素 | LPUSH fruits "apple" → 1 |
RPUSH key val | 向列表尾部添加元素 | RPUSH fruits "banana" → 2 |
LRANGE key s e | 获取索引s到e的元素(-1表示最后一个) | LRANGE fruits 0 -1 → ["apple", "banana"] |
LPOP key | 移除并返回头部元素 | LPOP fruits → "apple" |
RPOP key | 移除并返回尾部元素 | RPOP fruits → "banana" |
LLEN key | 获取列表长度 | LLEN fruits → 0 |
典型场景
- 消息队列(如使用LPUSH生产、RPOP消费);
- 最新列表(如用户最新动态,结合LTRIM只保留前N条);
- 阻塞队列(使用BRPOP/BLPOP实现消费者阻塞等待新元素)。
四、集合(Sets):无序唯一的元素集合
集合是无序且元素唯一的集合,支持交集、并集等集合运算。
核心特性
- 唯一性:自动去重,添加重复元素会被忽略。
- 无序性:元素无固定顺序,遍历结果随机。
- 高效运算:交集、并集、差集操作效率高,适合关系计算。
常用命令
命令 | 描述 | 示例 |
SADD key val | 向集合添加元素 | SADD tags "redis" → 1 |
SMEMBERS key | 返回所有元素(无序) | SMEMBERS tags → ["redis", "db"] |
SISMEMBER key val | 判断元素是否在集合中 | SISMEMBER tags "redis" → 1 |
SINTER key1 key2 | 求两个集合的交集 | SINTER set1 set2 → ["common"] |
SUNION key1 key2 | 求两个集合的并集 | SUNION set1 set2 → ["a", "b", "c"] |
SCARD key | 获取集合元素个数 | SCARD tags → 2 |
典型场景
- 标签系统(如文章标签,支持多标签交集查询);
- 好友关系(如共同好友查询,使用SINTER);
- 随机抽奖(使用SRANDMEMBER随机返回元素)。
五、有序集合(Sorted Sets):带分数的有序集合
有序集合是Redis最强大的数据类型之一,结合了集合的唯一性和列表的有序性,每个元素关联一个分数(score)用于排序。
核心特性
- 有序性:元素按分数排序,支持范围查询。
- 唯一性:元素不可重复,但分数可相同(此时按元素字符串字典序排序)。
- 高效操作:添加、删除、查询为O(log n),适合排行榜等场景。
常用命令
命令 | 描述 | 示例 |
ZADD key score val | 添加元素及分数 | ZADD rank 90 "Alice" → 1 |
ZRANGE key s e | 按分数升序返回索引s到e的元素 | ZRANGE rank 0 -1 → ["Bob", "Alice"] |
ZREVRANGE key s e | 按分数降序返回索引s到e的元素 | ZREVRANGE rank 0 -1 → ["Alice", "Bob"] |
ZSCORE key val | 获取元素的分数 | ZSCORE rank "Alice" → "90" |
ZINCRBY key n val | 增加元素的分数 | ZINCRBY rank 5 "Alice" → "95" |
ZRANK key val | 返回元素的升序排名(从0开始) | ZRANK rank "Bob" → 0 |
典型场景
- 排行榜(如游戏积分排名、商品销量排名);
- 带权重的任务队列(按分数排序,优先执行高分任务);
- 范围查询(如查询分数在80-100之间的用户)。
六、哈希(Hashes):字段-值映射的对象存储
哈希适合存储结构化数据(如用户信息、商品属性),每个哈希可包含多个字段-值对。
核心特性
- 对象存储:字段和值均为字符串,类似JSON对象但更轻量。
- 高效编码:小哈希(元素少且值小)采用压缩编码,内存占用低。
常用命令
命令 | 描述 | 示例 |
HSET key field val | 设置哈希字段值 | HSET user:1 name "Alice" → 1 |
HGET key field | 获取哈希字段值 | HGET user:1 name → "Alice" |
HGETALL key | 返回所有字段和值 | HGETALL user:1 → ["name", "Alice", "age", "30"] |
HKEYS key | 返回所有字段 | HKEYS user:1 → ["name", "age"] |
HINCRBY key field n | 字段值原子自增n | HINCRBY user:1 age 1 → 31 |
典型场景
- 存储用户信息(如ID、姓名、年龄);
- 商品属性(如价格、库存、描述);
- 计数器集合(如多维度统计,每个字段对应一个计数器)。
七、位图(Bitmaps):位级操作的空间高效存储
位图并非独立数据类型,而是对字符串的位级操作,适合存储大量布尔值。
核心特性
- 空间高效:1字节可存储8个布尔值,1MB可存储约800万个值。
- 位级操作:支持设置、获取、统计位值,适合批量处理。
常用命令
命令 | 描述 | 示例 |
SETBIT key pos val | 设置指定位置的位(0或1) | SETBIT active:users 100 1 → 0 |
GETBIT key pos | 获取指定位置的位值 | GETBIT active:users 100 → 1 |
BITCOUNT key | 统计值为1的位数量 | BITCOUNT active:users → 500 |
BITOP op dest key1 key2 | 对多个位图执行位运算(AND/OR等) | BITOP AND res a b → 结果存于res |
典型场景
- 用户签到(如用位位置表示日期,1表示签到);
- 活跃用户统计(如统计7天内活跃的用户数);
- 权限控制(如用位表示不同权限,组合位运算判断权限)。
八、超日志(HyperLogLogs):概率性基数统计
超日志是用于估算集合基数( unique 元素数量)的概率数据结构,以少量内存换取近似结果。
核心特性
- 空间高效:无论基数多大,内存占用约12KB。
- 近似结果:标准误差小于1%,适合非精确统计场景。
常用命令
命令 | 描述 | 示例 |
PFADD key val... | 向超日志添加元素 | PFADD uv "user1" "user2" → 1 |
PFCOUNT key | 估算基数 | PFCOUNT uv → 2 |
PFMERGE dest key1 key2 | 合并多个超日志 | PFMERGE total_uv uv1 uv2 → OK |
典型场景
- 网站独立访客(UV)统计;
- 搜索关键词去重计数;
- 大型数据集的基数估算(如商品浏览用户数)。
九、流(Streams):日志型数据的有序存储
流是Redis 5.0新增的类型,专为日志、事件流设计,支持持久化和消费者组。
核心特性
- ** append-only :仅支持追加操作,保证数据顺序。
- 消费者组 :支持多消费者协同处理,避免重复消费。
- 持久化 **:数据可持久化到RDB/AOF,适合关键日志。
典型场景
- 系统日志收集(如用户操作日志、服务器监控数据);
- 事件驱动架构(如订单状态变更、支付通知);
- 消息队列(支持ack机制,确保消息可靠消费)。
十、数据类型选择指南:场景匹配原则
场景需求 | 推荐类型 | 核心命令示例 |
缓存文本/数字 | 字符串 | SET/GET |
有序列表/消息队列 | 列表 | LPUSH/RPOP/BRPOP |
去重/关系计算(交集等) | 集合 | SADD/SINTER/SUNION |
排行榜/带权重排序 | 有序集合 | ZADD/ZREVRANGE/ZINCRBY |
存储对象/结构化数据 | 哈希 | HSET/HGETALL/HINCRBY |
大量布尔值/空间敏感 | 位图 | SETBIT/BITCOUNT |
基数统计/非精确计数 | 超日志 | PFADD/PFCOUNT |
日志/事件流/可靠队列 | 流 | XADD/XREADGROUP/XACK |
十一、总结:数据类型是Redis的灵魂
Redis的强大之处在于其为不同场景设计的数据类型,选择合适的类型能显著提升性能和内存效率。核心原则是:** 理解每种类型的底层实现和特性,根据业务需求的访问模式(有序/无序、读写频率、是否去重等)选择最优解**。
后续章节将深入探讨这些数据类型的高级用法和性能优化,帮助你在实际开发中发挥Redis的最大潜力。
相关推荐
- 订单超时自动取消业务的 N 种实现方案,从原理到落地全解析
-
在分布式系统架构中,订单超时自动取消机制是保障业务一致性的关键组件。某电商平台曾因超时处理机制缺陷导致日均3000+订单库存锁定异常,直接损失超50万元/天。本文将从技术原理、实现细节、...
- 使用Spring Boot 3开发时,如何选择合适的分布式技术?
-
作为互联网大厂的后端开发人员,当你满怀期待地用上SpringBoot3,准备在项目中大显身手时,却发现一个棘手的问题摆在面前:面对众多分布式技术,究竟该如何选择,才能让SpringBoot...
- 数据库内存爆满怎么办?99%的程序员都踩过这个坑!
-
你的数据库是不是又双叒叕内存爆满了?!服务器监控一片红色警告,老板在群里@所有人,运维同事的电话打爆了手机...这种场景是不是特别熟悉?别慌!作为一个在数据库优化这条路上摸爬滚打了10年的老司机,今天...
- springboot利用Redisson 实现缓存与数据库双写不一致问题
-
使用了Redisson来操作Redis分布式锁,主要功能是从缓存和数据库中获取商品信息,以下是针对并发时更新缓存和数据库带来不一致问题的解决方案1.基于读写锁和删除缓存策略在并发更新场景下,...
- 外贸独立站数据库炸了?对象缓存让你起死回生
-
上周黑五,一个客户眼睁睁看着服务器CPU飙到100%——每次页面加载要查87次数据库。这让我想起2024年Pantheon的测试:Redis缓存能把WooCommerce查询速度提升20倍。跨境电商最...
- 手把手教你在 Spring Boot3 里纯编码实现自定义分布式锁
-
为什么要自己实现分布式锁?你是不是早就受够了引入各种第三方依赖时的繁琐?尤其是分布式锁这块,每次集成Redisson或者Zookeeper,都得额外维护一堆配置,有时候还会因为版本兼容问题头疼半...
- 如何设计一个支持百万级实时数据推送的WebSocket集群架构?
-
面试解答:要设计一个支持百万级实时数据推送的WebSocket集群架构,需从**连接管理、负载均衡、水平扩展、容灾恢复**四个维度切入:连接层设计-**长连接优化**:采用Netty或Und...
- Redis数据结构总结——面试最常问到的知识点
-
Redis作为主流的nosql存储,面试时经常会问到。其主要场景是用作缓存,分布式锁,分布式session,消息队列,发布订阅等等。其存储结构主要有String,List,Set,Hash,Sort...
- skynet服务的缺陷 lua死循环
-
服务端高级架构—云风的skynet这边有一个关于云风skynet的视频推荐给大家观看点击就可以观看了!skynet是一套多人在线游戏的轻量级服务端框架,使用C+Lua开发。skynet的显著优点是,...
- 七年Java开发的一路辛酸史:分享面试京东、阿里、美团后的心得
-
前言我觉得有一个能够找一份大厂的offer的想法,这是很正常的,这并不是我们的饭后谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司...
- mysql mogodb es redis数据库之间的区别
-
1.MySQL应用场景概念:关系型数据库,基于关系模型,使用表和行存储数据。优点:支持ACID事务,数据具有很高的一致性和完整性。缺点:垂直扩展能力有限,需要分库分表等方式扩展。对于复杂的查询和大量的...
- redis,memcached,nginx网络组件
-
1.理解阻塞io,非阻塞io,同步io,异步io的区别2.理解BIO和AIO的区别io多路复用只负责io检测,不负责io操作阻塞io中的write,能写多少是多少,只要写成功就返回,譬如准备写500字...
- SpringBoot+Vue+Redis实现验证码功能
-
一个小时只允许发三次验证码。一次验证码有效期二分钟。SpringBoot整合Redis...
- AWS MemoryDB 可观测最佳实践
-
AWSMemoryDB介绍AmazonMemoryDB是一种完全托管的、内存中数据存储服务,专为需要极低延迟和高吞吐量的应用程序而设计。它与Redis和Memcached相似,但具有更...
- 从0构建大型AI推荐系统:实时化引擎从工具到生态的演进
-
在AI浪潮席卷各行各业的今天,推荐系统正从幕后走向前台,成为用户体验的核心驱动力。本文将带你深入探索一个大型AI推荐系统从零起步的全过程,揭示实时化引擎如何从单一工具演进为复杂生态的关键路径。无论你是...
你 发表评论:
欢迎- 一周热门
-
-
Redis客户端 Jedis 与 Lettuce
-
高并发架构系列:Redis并发竞争key的解决方案详解
-
redis如何防止并发(redis如何防止高并发)
-
Java SE Development Kit 8u441下载地址【windows版本】
-
开源推荐:如何实现的一个高性能 Redis 服务器
-
redis安装与调优部署文档(WinServer)
-
Redis 入门 - 安装最全讲解(Windows、Linux、Docker)
-
一文带你了解 Redis 的发布与订阅的底层原理
-
Redis如何应对并发访问(redis控制并发量)
-
Oracle如何创建用户,表空间(oracle19c创建表空间用户)
-
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle主从同步 (56)
- oracle 乐观锁 (53)
- redis 命令 (83)
- php redis (97)
- redis 存储 (67)
- redis 锁 (74)
- 启动 redis (73)
- redis 时间 (60)
- redis 删除 (69)
- redis内存 (64)
- redis并发 (53)
- redis 主从 (71)
- redis同步 (53)
- redis结构 (53)
- redis 订阅 (54)
- redis 登录 (62)
- redis 面试 (58)
- redis问题 (54)
- 阿里 redis (67)
- redis的缓存 (57)
- lua redis (59)
- redis 连接池 (64)