用例

快速数据提取

什么是快速数据提取

收集和处理大量高速变化的高速数据带来了一些复杂的设计挑战,尤其是在物联网,物联网,电子商务,安全通信,娱乐金融和零售等领域。数据收集和分析至关重要

进行实时数据分析的重要第一步是确保有足够的资源来有效捕获快速数据流,而包括高速网络计算存储和内存在内的物理基础架构在其中起着重要作用,软件堆栈必须与物理性能相匹配。层或组织可能最终会积压大量数据,缺少数据或不完整的误导性数据

快速获取数据的挑战和最佳实践

高速数据摄取通常涉及不同类型的复杂性

  1. 大量数据爆发突发数据需要一种能够以最小的延迟处理大量数据的解决方案理想情况下,它应该能够使用最少的资源以每秒毫秒的延迟执行数百万次写入
  2. 来自多种来源格式的数据数据提取解决方案还必须足够灵活,以处理多种不同格式的数据(如果需要),并保留源身份,并实时进行转换或规范化
  3. 需要过滤的数据进行分析或转发大多数数据摄取解决方案都有一个或多个使用数据的订户。这些应用通常是不同的应用程序,它们以不同的假设在相同或不同的位置运行。在这种情况下,数据库不仅必须转换数据,还必须过滤或汇总数据,具体取决于根据消费应用程序的要求
  4. 管理生产者和各种类型的消费者之间的稳定数据通道如果数据到达模式不是连续的,则生产者和使用者需要一个通道,使他们能够异步传输数据。该通道还必须具有抵御连接丢失和硬件故障的能力。在许多情况下,生产者和使用者不能以相同的速率运行。导致数据积压,进一步延迟了消费者对数据采取行动
  5. 来自地理分布来源的数据在这种情况下,底层体系结构通常会在靠近源的位置分发数据收集节点,这很方便,这样,节点本身便成为快速数据摄取解决方案的一部分,以收集进程转发或重新路由摄取数据

Redis Enterprise如何轻松实现快速数据提取

以最少的服务器数量实现高性能
在性能方面,Redis Enterprise一直致力于标杆仅在AWS上的一个节点群集,即可在亚毫秒级的延迟下每秒处理超过百万次的读写操作,这使Redis Enterprise成为市场上资源效率最高的NoSQL数据库

用于实时分析的灵活数据结构和模块Redis Streams Pub子列表排序集RedisTimeSeries
Redis提供了多种数据结构,例如流列表集,排序集和哈希,它们提供了简单而通用的数据处理,以便有效地结合高速数据摄取和实时分析

Redis Pub Sub功能使其可以充当地理分布的数据接收节点之间的高效消息代理,数据生成应用程序将流数据以所需的格式发布到通道,而消费应用程序订阅与它们相关的那些通道,以异步方式接收消息已发表

列表和排序集可用作连接生产者和使用者的数据通道。您还可以使用这些数据结构异步传输数据,这与发布子列表和排序集的持久性不同

Streams可以做更多的事情,在生产者和消费者之间提供持久的数据获取通道。使用Streams,您可以使用消费者组来扩展消费者的数量。当消费者在使用和处理数据时失败时,消费者组还可以实现事务处理,例如数据安全性。

最后是RedisTimeSeries提供增强的快速数据摄取功能集,包括对最后摄取的值的特殊计数器操作进行下采样和双增量压缩,并结合实时分析功能,例如使用内置搜索聚合范围查询和用于领先监控和分析工具的内置连接器进行数据标记例如Grafana和Prometheus

主动式主动地理分布部署
Redis企业版基于CRDT的Active Active技术支持跨地理位置的复杂数据提取和消息传递操作,并允许以完全分布式的方式部署应用程序,从而显着提高可用性和应用程序响应时间

使用SSD和持久性内存扩展Redis DRAM
Redis企业版Flash上​​的Redis这项技术可以扩展具有SSD的DRAM,并且持久性内存允许使用基于磁盘的数据库的相同基础架构成本来存储非常大的兆字节数据集,并且即使在Redis Enterprise的每个节点上每秒读取M个项目时,也可以将数据库延迟保持在毫秒级以下。簇

如何使用Redis实现快速数据提取

这是一些用Java编写的代码片段,它们都使用Jedis库。首先按照Jedis上的说明进行操作。入门页面下载最新版本的Jedis

  1. 使用Redis Streams快速提取数据
    1. 将消息发布到流数据结构此程序使用XADD向流中添加新项目文件名StreamPublish java导入java util HashMap
      导入java有用的地图
      导入redis客户jedis Jedis
      导入redis客户端jedis StreamEntryID公共类StreamPublish
      静态Jedis jedis新的Jedis本地主机

      公共静态void主字符串args引发异常
      尝试
      地图kv new HashMap
      kv把一个键值
      jedis xadd MyStream StreamEntryID新条目kv
      最后
      jedis关闭


    2. 异步使用流中的数据如果流为空,请等待消息此程序使用XREAD命令文件名StreamConsumeAsync java导入java util AbstractMap SimpleEntry
      导入java util HashMap
      导入java有用列表
      导入java有用的地图
      导入java util映射条目
      导入redis客户jedis Jedis
      导入redis客户jedis StreamEntry
      导入redis客户端jedis StreamEntryID公共类StreamConsumeAsync

      静态Jedis jedis新的Jedis本地主机

      公共静态void主字符串args引发异常

      从开始对于后续查询,请从最后一个ID中读取
      字符串lastStreamDataId
      整数计数
      漫长的等待时间

      尝试
      循环异步读取新数据
      虽然真实
      列出下一个getNext MyStream lastStreamDataId
      计算waitTimeInMillis
      如果下一个null
      清单styList getStreamEntries下一个
      如果stList为null
      在这里处理数据
      对于int j j
      StreamEntry streamData StreamEntry stList获得j

      读取数据流的字段键值对
      地图字段streamData getFields

      从最后一个ID读取后续数据
      lastStreamDataId streamData getID getTime

      streamData getID getSequence

      系统输出println stList get j
      系统输出println lastStreamDataId

      其他
      系统输出println流中没有新数据


      最后
      jedis关闭

      从流中读取下一组数据
      私有静态列表getNext String streamId String lastId int count long waitTimeInMillis引发异常
      哈希图映射新的HashMap
      字符串readFrom lastId
      映射放streamId新的StreamEntryID readFrom
      列表列表Jedis Xread计数waitTimeInMillis
      条目
      映射入口设置为数组
      退货清单

      读取流条目
      假设streamList只有一个流
      私人静态清单getStreamEntries列表streamList抛出异常
      如果streamList的大小
      SimpleEntry stEntry SimpleEntry streamList get
      返回清单stEntry getValue

      返回null

    3. 使用XRANGE命令查询流文件名StreamQuery java导入java有用列表
      导入java有用的地图
      导入redis客户jedis Jedis
      导入redis客户jedis StreamEntry
      导入redis客户端jedis StreamEntryID公共类StreamQuery

      静态Jedis jedis新的Jedis本地主机

      公共静态void主字符串args引发异常

      字符串streamID MyStream
      StreamEntryID开始新的StreamEntryID
      StreamEntryID end null null,直到流中的最后一项
      整数计数

      尝试
      清单styList redis xrange streamID起始结束计数
      如果stList为null
      在这里处理数据
      对于int j j
      StreamEntry streamData StreamEntry stList获得j

      系统输出println streamData

      读取数据流的字段键值对
      地图字段streamData getFields

      从最后一个ID读取后续数据
      StreamEntryID nextStart
      新的StreamEntryID streamData getID getTime
      streamData getID getSequence

      其他
      系统输出println流中没有新数据

      最后
      jedis关闭


  2. 使用Pub Sub快速提取数据
    1. 发布到频道文件名PubSubPublish java导入redis客户jedis Jedis公共类PubSubPublish
      静态Jedis jedis新的Jedis本地主机
      公共静态无效主字符串参数引发异常尝试
      字符串通道MyChannel
      字符串消息你好
      jedis发布频道讯息
      最后
      jedis关闭


    2. 订阅频道文件名PubSubPublish java导入redis客户jedis Jedis
      导入redis客户jedis JedisPubSub
      公共类PubSubSubscribe扩展JedisPubSub
      静态Jedis jedis新Jedis本地主机public static void main String args throws Exception

      尝试
      PubSub订阅我的订阅者新的PubSub订阅
      字符串通道MyChannel
      jedis订阅mySubscriber频道
      最后
      jedis关闭

      接收讯息
      覆写
      公共无效的onMessage字符串通道字符串消息
      系统输出println消息

  3. 使用列表快速提取数据
    1. 将数据推送到列表文件名列表推送Java导入redis客户jedis Jedis公共类ListPush
      静态Jedis jedis新的Jedis本地主机
      公共静态无效主字符串参数引发异常尝试
      字符串列表MyList
      字符串消息你好
      jedis lpush列表消息
      最后
      jedis关闭


    2. 从列表中弹出数据文件名ListPop Java导入redis客户jedis Jedis公共类ListPop
      静态Jedis jedis新的Jedis本地主机
      公共静态无效主字符串参数引发异常尝试
      字符串列表MyList
      字符串消息jedis rpop列表
      系统输出println消息
      最后
      jedis关闭