Redis/Redis Stack Time series时序等模块

参考

redis.io/docs/latest...

redis.io/docs/latest...

redis.io/docs/latest...

Redis/Redis Stack/Redis Enterprise

Redis应该是除了MySQL最为熟知的数据库了,其高性能、丰富的数据结构和灵活的扩展性而被广泛使用。随着其应用场景的复杂化和企业需求的多样化,Redis 的生态也在不断扩展。

Redis

基本概念与核心特性

Redis(Remote Dictionary Server)是一个开源的内存键值存储系统,支持多种数据结构(字符串、哈希、列表、集合、有序集合等),并通过内存存储实现毫秒级甚至亚毫秒级的读写速度。其核心优势包括:

  • 高性能:基于内存存储,单线程模型配合事件驱动和非阻塞 I/O,支持每秒数十万次读写操作。
  • 丰富的数据结构:提供灵活的数据模型,满足计数器、排行榜、队列、会话缓存等多样化需求。
  • 持久化支持:通过 RDB 快照和 AOF 日志实现数据持久化,防止数据丢失。
  • 分布式能力:支持集群模式(Redis Cluster)和主从复制,实现横向扩展和高可用性。

2. 常见应用场景

  • 缓存:作为数据库的缓存层,降低后端压力(如 MySQL、MongoDB)。
  • 实时分析:利用内存计算快速处理实时数据(如用户行为统计、排行榜)。
  • 消息队列:通过列表(List)实现高效的消息发布与订阅。
  • 分布式锁:在分布式系统中实现互斥操作(如秒杀、分布式任务调度)。

这是大家都熟知的内容,但是提到Redis Stack不知道是否都有所了解

Redis Stack

Redis Stack 是 Redis 的官方扩展套件,通过添加现代数据模型和处理引擎,进一步扩展了 Redis 的功能,使其能够应对更复杂的实时应用需求。

核心组件与功能

Redis Stack 包含以下核心模块:

  • RedisSearch:支持全文搜索、多字段查询和复杂索引,可直接在 JSON 或哈希数据中执行 SQL 类查询。
  • RedisJSON:提供对 JSON 数据的原生支持,支持嵌套对象和数组操作。
  • RedisGraph:基于图数据库技术,支持复杂关系查询(如社交网络、推荐系统)。
  • RedisTimeSeries:高效存储和查询时间序列数据(如 IoT 设备数据、监控指标)。
  • RedisBloom:用于概率数据结构(如布隆过滤器、TopK 算法),优化空间和计算效率。

技术优势与适用场景

  • 实时分析与搜索:适用于需要复杂查询的场景,如电商商品搜索、日志分析、实时推荐系统。
  • 多模型支持:结合键值、JSON、图等多种数据模型,满足混合数据存储需求。
  • 开发效率提升:通过 RedisInsight 管理工具实现可视化监控和调试。

示例场景:电商商品搜索

假设一个电商平台需要支持商品的多条件搜索(如价格、品牌、评分),传统 Redis 可能需要复杂的索引管理,而 Redis Stack 的 RedisSearch 模块可直接通过 SQL-like 语句实现:

sql 复制代码
FT.SEARCH myIndex "@price:[100 500] @category:electronics" 

Redis Enterprise

Redis Enterprise 是 Redis 的商业版本,由 Redis Labs 提供支持,专注于大规模生产环境中的高可用性、扩展性和成本优化。

核心功能与技术亮点

  • 自动分层(Auto-Sharding)
    自动将数据分片分布到多个节点,支持无缝水平扩展,适用于 TB 级数据集。
  • 持久化与容灾
    支持跨数据中心的多主复制(Multi-Master Replication),确保数据零丢失和高可用性。
  • 自动分层存储(Redis Enterprise Automatic Tiering)
    结合 DRAM(内存)和 SSD(固态硬盘),将热数据保留在内存中,冷数据自动迁移到 SSD,降低存储成本。例如:
    • 吞吐量提升 100%,延迟降低 50%(与纯内存部署相比)。
    • 成本节省高达 70%(通过减少 DRAM 使用)。
  • 缓存预取(Cache Prefetching)
    利用 CDC(Change Data Capture)技术,将数据库的更新自动复制到 Redis 缓存,减少缓存穿透和延迟。

企业级应用场景

  • 大规模缓存:支持高并发场景(如电商秒杀、社交媒体动态流)。
  • 混合负载优化:同时处理读密集型和写密集型工作负载。
  • 多云与混合云部署:支持跨云或本地部署,确保数据一致性。

示例场景:用户配置文件缓存

某社交平台的用户配置文件频繁读取但很少更新,传统缓存可能因频繁读取导致数据库压力。Redis Enterprise 的缓存预取功能可自动将数据从数据库同步到 Redis,减少 90% 的数据库查询,同时利用自动分层技术将冷数据存储在 SSD,降低成本。

这些模版文档都能在官网找到,下面介绍一下TimeSeries模块。

TimeSeries

介绍

官网TimeSeries模块文档:redis.io/docs/latest...

官网Timeseries模块api文档:redis.io/docs/latest...

官网支持TimeSeries模块的客户端:redis.io/docs/latest...

官网jedisredis.io/docs/latest...

DockerHub redis-stackhub.docker.com/r/redis/red...

yaml 复制代码
services:
  redis-stack:
    image: redis/redis-stack:latest
    container_name: redis-stack
    volumes:
      - redisdata:/data
    ports:
      - "6379:6379"
      - "8001:8001"
    environment:
      REDIS_ARGS: "--requirepass ${redis_password}"
      TZ: Asia/Shanghai
    networks:
      - custom_network

volumes:
  redisdata:
    driver: local

networks:
  custom_network:
    driver: bridge

首先一般的社区版是没有TimeSeries模块的,可以自己在社区版的基础上增加,当然简单的方式是安装redis-stack,这样的redis是带上了redissearchredistimeseriesredisjson等等模块的,而且还会带上redis insight,也就是docker-compose里配置的除63798001端口对应的进程。

先学习几个api

plain 复制代码
创建时间序列
TS.CREATE key 
  [RETENTION retentionPeriod] 
  [ENCODING <COMPRESSED|UNCOMPRESSED>] 
  [CHUNK_SIZE size] 
  [DUPLICATE_POLICY policy] 
  [IGNORE ignoreMaxTimediff ignoreMaxValDiff] 
  [LABELS [label value ...]]

时间序列新增
TS.ADD key timestamp value 
  [RETENTION retentionPeriod] 
  [ENCODING <COMPRESSED|UNCOMPRESSED>] 
  [CHUNK_SIZE size] 
  [DUPLICATE_POLICY policy] 
  [ON_DUPLICATE policy_ovr] 
  [IGNORE ignoreMaxTimediff ignoreMaxValDiff] 
  [LABELS [label value ...]]

统计计算方法

plain 复制代码
时间序列范围统计
TS.RANGE key fromTimestamp toTimestamp
  [LATEST]
  [FILTER_BY_TS ts...]
  [FILTER_BY_VALUE min max]
  [COUNT count] 
  [[ALIGN align] AGGREGATION aggregator bucketDuration [BUCKETTIMESTAMP bt] [EMPTY]]

聚合计算支持如下maxminavgcount等等

创建规则主要用于设置时间序列之间的聚合规则。通过此命令,可以将源时间序列(source key)中的数据按照指定的时间间隔(bucket size)进行聚合,并将结果存储到目标时间序列(dest key)中

plain 复制代码
创建规则
TS.CREATERULE sourceKey destKey 
  AGGREGATION aggregator bucketDuration 
  [alignTimestamp]

条件查询
TS.QUERYINDEX filterExpr...

例子

以下是一个物联网(IoT)设备温度监控与自动告警的详细示例

场景描述

某工厂部署了100个温度传感器(ID: sensor-001 到 sensor-100),每 5秒 采集一次设备温度。需实现:

  1. 实时存储所有传感器的温度数据(保留30天)。
  2. 每5分钟统计每个传感器的平均温度、最高温度。
  3. 当某个传感器温度 连续3次采集超过50℃ 时,触发告警并关闭设备。
  4. 支持按 时间段传感器ID 查询历史温度趋势。

步骤实现

1、创建时间序列

为每个传感器创建两个时间序列:

  • 原始数据序列(保留30天,启用压缩节省空间)
  • 降采样后的聚合序列(每5分钟计算一次平均值和最大值)
bash 复制代码
# 创建传感器001的原始数据序列(标签标明设备ID和类型)
TS.CREATE sensor:001:raw LABELS device_id 001 type temperature RETENTION 2592000000 COMPRESSED

# 创建传感器001的5分钟聚合序列(自动计算平均值)
TS.CREATE sensor:001:avg LABELS device_id 001 type aggregated 
TS.CREATERULE sensor:001:raw sensor:001:avg AGGREGATION avg 300000  # 300000ms=5分钟

# 创建传感器001的5分钟最大值序列
TS.CREATE sensor:001:max LABELS device_id 001 type aggregated
TS.CREATERULE sensor:001:raw sensor:001:max AGGREGATION max 300000
  • RETENTION:30天后自动删除旧数据,避免存储膨胀。
  • COMPRESSED:压缩存储高频原始数据,减少内存占用。
  • CREATERULE + AGGREGATION:自动降采样计算,避免后期全量扫描。

2、插入实时数据

模拟传感器001每5秒上报一次温度(假设时间戳为手动递增):

bash 复制代码
# 时间戳 1620000000000(假设为2021-05-03 00:00:00)
TS.ADD sensor:001:raw 1620000000000 45.3
TS.ADD sensor:001:raw 1620000005000 48.1  # +5秒
TS.ADD sensor:001:raw 1620000010000 51.2  # 触发告警的第三次数据
  • 直接按时间戳插入,支持高频写入(每秒百万级数据点)。

3、触发告警规则

当传感器001连续3次温度超过50℃时,触发告警:

bash 复制代码
# 创建告警规则(基于原始数据序列)
TS.CREATERULE sensor:001:raw ALERT WHEN max > 50 FOR 3 EXEC "关闭设备001; 发送邮件告警"
  • WHEN + FOR:连续满足条件时触发动作,避免瞬时波动误报。
  • EXEC:可调用外部脚本或Redis Pub/Sub通知运维系统。

4、 查询与分析数据

查询1 :获取传感器001在2023-05-03 00:00至00:15的 原始温度数据

bash 复制代码
TS.RANGE sensor:001:raw 1620000000000 1620000090000 
# 返回:[ [1620000000000,45.3], [1620000005000,48.1], [1620000010000,51.2] ]

查询2 :统计传感器001在当天 每小时的平均温度

bash 复制代码
TS.RANGE sensor:001:avg - + AGGREGATION avg 3600000
# 返回每小时的均值,如:[ [1620000000000, 47.5], [1620036000000, 49.1] ]

查询3 :找出所有设备在当天 最高温度超过50℃的传感器

bash 复制代码
TS.QUERYINDEX type=temperature 
              FILTER "max(value) > 50" 
              RANGE 1620000000000 1620086400000
# 返回满足条件的传感器ID列表(如sensor:001:max)
  • TS.RANGE:毫秒级响应时间,支持灵活时间窗口。
  • TS.QUERYINDEX:通过标签快速定位异常设备,无需全表扫描。

核心优势总结

  • 高性能:每秒百万级数据写入,毫秒级查询响应。
  • 高效存储:压缩 + 保留策略,节省90%内存(对比普通Redis Sorted Sets)。
  • 实时计算 :内置聚合规则,直接支持sumcountmaxavg等聚合操作,避免后期批处理(如对比Hadoop/Spark方案)。
  • 数据生命周期 :通过 RETENTION 自动清理旧数据,节省存储空间。
  • 多维分析 :结合 LABELS 实现多维筛选(如按服务器ID或指标类型过滤)。

小结

如今面对同样的问题总是有多种多样的解决方案,虽然那句话听起来有点虚"适合的就是最好的",但是确实是真理。

相关推荐
Aska_Lv5 分钟前
RocketMQ---core原理
后端
AronTing10 分钟前
10-Spring Cloud Alibaba 之 Dubbo 深度剖析与实战
后端·面试·架构
没逻辑13 分钟前
⏰ Redis 在支付系统中作为延迟任务队列的实践
redis·后端
雷渊15 分钟前
如何保证数据库和Es的数据一致性?
java·后端·面试
fjkxyl17 分钟前
Spring的启动流程
java·后端·spring
掘金酱17 分钟前
😊 酱酱宝的推荐:做任务赢积分“拿”华为MatePad Air、雷蛇机械键盘、 热门APP会员卡...
前端·后端·trae
总之就是非常可爱39 分钟前
🚀 使用 ReadableStream 优雅地处理 SSE(Server-Sent Events)
前端·javascript·后端
夜寒花碎43 分钟前
GO入门——Hello, World
后端·go
爱的叹息1 小时前
关于 Spring Boot 微服务解决方案的对比,并以 Spring Cloud Alibaba 为例,详细说明其核心组件的使用方式、配置及代码示例
spring boot·后端·微服务
自珍JAVA1 小时前
SpringCloud Gateway 网关组件
后端