百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

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推荐系统从零起步的全过程,揭示实时化引擎如何从单一工具演进为复杂生态的关键路径。无论你是...

取消回复欢迎 发表评论: