Redis核心技术与实战
蒋德钧
中科院计算所副研究员
新⼈⾸单¥19.9
7124 人已学习
课程目录
已更新 18 讲 / 共 50 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 这样学Redis,才能技高一筹
免费
基础篇 (10讲)
01 | 基本架构:一个键值数据库包含什么?
02 | 数据结构:快速的Redis有哪些慢操作?
03 | 高性能IO模型:为什么单线程Redis能那么快?
04 | AOF日志:宕机了,Redis如何避免数据丢失?
05 | 内存快照:宕机后,Redis如何实现快速恢复?
06 | 数据同步:主从库如何实现数据一致?
07 | 哨兵机制:主库挂了,如何不间断服务?
08 | 哨兵集群:哨兵挂了,主从库还能切换吗?
09 | 切片集群:数据增多了,是该加内存还是加实例?
10 | 第1~9讲课后思考题答案及常见问题答疑
实践篇 (5讲)
11 | “万金油”的String,为什么不好用了?
12 | 有一亿个keys要统计,应该用哪种集合?
13 | GEO是什么?还可以定义新的数据类型吗?
14 | 如何在Redis中保存时间序列数据?
15 | 消息队列的考验:Redis有哪些解决方案?
加餐篇 (2讲)
加餐(一)| 经典的Redis学习资料有哪些?
加餐(二)| Kaito:我是如何学习Redis的?
Redis核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

14 | 如何在Redis中保存时间序列数据?

蒋德钧 2020-09-07
你好,我是蒋德钧。
我们现在做互联网产品的时候,都有这么一个需求:记录用户在网站或者 App 上的点击行为数据,来分析用户行为。这里的数据一般包括用户 ID、行为类型(例如浏览、登录、下单等)、行为发生的时间戳:
UserID, Type, TimeStamp
我之前做过的一个物联网项目的数据存取需求,和这个很相似。我们需要周期性地统计近万台设备的实时状态,包括设备 ID、压力、温度、湿度,以及对应的时间戳:
DeviceID, Pressure, Temperature, Humidity, TimeStamp
这些与发生时间相关的一组数据,就是时间序列数据。这些数据的特点是没有严格的关系模型,记录的信息可以表示成键和值的关系(例如,一个设备 ID 对应一条记录),所以,并不需要专门用关系型数据库(例如 MySQL)来保存。而 Redis 的键值数据模型,正好可以满足这里的数据存取需求。Redis 基于自身数据结构以及扩展模块,提供了两种解决方案。
这节课,我就以物联网场景中统计设备状态指标值为例,和你聊聊不同解决方案的做法和优缺点。
俗话说,“知己知彼,百战百胜”,我们就先从时间序列数据的读写特点开始,看看到底应该采用什么样的数据类型来保存吧。

时间序列数据的读写特点

在实际应用中,时间序列数据通常是持续高并发写入的,例如,需要连续记录数万个设备的实时状态值。同时,时间序列数据的写入主要就是插入新数据,而不是更新一个已存在的数据,也就是说,一个时间序列数据被记录后通常就不会变了,因为它就代表了一个设备在某个时刻的状态值(例如,一个设备在某个时刻的温度测量值,一旦记录下来,这个值本身就不会再变了)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Redis核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥19.9
立即订阅
登录 后留言

精选留言(9)

  • Kaito
    使用Sorted Set保存时序数据,把时间戳作为score,把实际的数据作为member,有什么潜在的风险?

    我目前能想到的风险是,如果对某一个对象的时序数据记录很频繁的话,那么这个key很容易变成一个bigkey,在key过期释放内存时可能引发阻塞风险。所以不能把这个对象的所有时序数据存储在一个key上,而是需要拆分存储,例如可以按天/周/月拆分(根据具体查询需求来定)。当然,拆分key的缺点是,在查询时,可能需要客户端查询多个key后再做聚合才能得到结果。

    如果你是Redis的开发维护者,你会把聚合计算也设计为Sorted Set的内在功能吗?

    不会。因为聚合计算是CPU密集型任务,Redis在处理请求时是单线程的,也就是它在做聚合计算时无法利用到多核CPU来提升计算速度,如果计算量太大,这也会导致Redis的响应延迟变长,影响Redis的性能。Redis的定位就是高性能的内存数据库,要求访问速度极快。所以对于时序数据的存储和聚合计算,我觉得更好的方式是交给时序数据库去做,时序数据库会针对这些存储和计算的场景做针对性优化。

    另外,在使用MULTI和EXEC命令时,建议客户端使用pipeline,当使用pipeline时,客户端会把命令一次性批量发送给服务端,然后让服务端执行,这样可以减少客户端和服务端的来回网络IO次数,提升访问性能。
    2020-09-07
    5
    48
  • 阳明
    存在member重复的问题,会对member覆盖
    2020-09-07
    5
  • pedro
    Hash 和 Sorted Set 的结合让我想到了 LRU 中的 HashMap 和 LinkedList 的结合,二者均取长处碰撞出了不一样的火花,看看毫不沾边的事物,往往具有相同的内涵。
    2020-09-07
    3
  • 咸鱼
    使用sorted set时间戳作为score,可能会出现时间戳相同导致被覆盖的可能吧
    2020-09-07
    2
    1
  • test
    redis的事务不是完整的事务,当有一个命令失败时还是会继续往下执行,这是个问题。时序数据还是交给时序数据库来保存比较专业
    2020-09-07
    3
    1
  • 夏虫井蛙
    现在很多服务都上云了,用的redis也是供应商提供的服务,一般不自己搭建。RedisTimeSeries以及上一讲的自定义数据类型需要编译加载,一般云供应商不提供这些吧?这时候是不是只能用基础数据类型,没办法用RedisTimeSeries以及自定义数据类型了?
    2020-09-09
  • 王嘉伟
    相同時間戳的數據,本應該是覆蓋更新,但是會存下兩條數據
    2020-09-09
  • Geek_d20fa9
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> HSET device:temperature 202008030911 26.8
    QUEUED
    127.0.0.1:6379> ZADD device:temperature 202008030911 26.8
    QUEUED
    127.0.0.1:6379> exec
    1) (integer) 1
    2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
    2020-09-08
  • Sue
    老师,为什么那个存温度的value🀄️也有key?难道这个value类型是hash类型吗
    2020-09-08
收起评论
9
返回
顶部