《Redis 核心技术与实战》学习笔记 08:GEO 数据类型和时间序列数据
学习极客时间《Redis 核心技术与实战》专栏过程中的一些学习笔记,部分已经作为留言发布,但是留言太多,排在后面的一般很难被大家看到,所以集中发布在这里,欢迎讨论。
题图来自极客时间《Redis 核心技术与实战》专栏
13 | GEO 是什么?还可以定义新的数据类型吗?
位置信息服务现在已经成为了各种服务的标配,另外,用户的地理位置信息也是很有价值的,其实我倒是非常看好高德,这可能也是百度和其他一些大厂始终不放弃开发地图和导航应用的初衷。
一开始不理解 GeoHash 的编码,为什么要经纬度编码交叉组合,后来看到那个 4 分区图示,就只能说,第一个想到的人实在是天才。
GEOADD 和 GEOADIUS 已经有点类似于 DSL 了,简化了很多操作。
专栏中老师手把手的教了一遍如何自定义类型,虽然暂时用不到,但是看的还是比较过瘾的。不过因为已经看过了全部的加餐内容,老师提到后面会讲到持久化保存的代码,明显不在其中,也可能是在专栏的正式文章里面?
个人猜测,基于位置服务的应用不会只用 Redis 来查询,还会有持久化到数据库的部分,Redis 只是提供接近实时的查询应用,Elastic 似乎也有类似的功能。
另外,从老师回复中知道,Redis 的键和值都是用 RedisObject 保存的。稍有疑问,键直接用 String 或者 SDS 来存不好么?
14 | 如何在 Redis 中保存时间序列数据?
记录用户的行为以及物联网设备实时状态,这两种用法都把 Redis 当做“数据库”来用,似乎有悖于 Redis 的初衷。
时间序列数据要求“写”的时候插入快,“读”的时候查询模式多,似乎对于读的快并没有太高的要求,我怎么觉得 Elastic 似乎也挺合适。
读完专栏,感觉上似乎针对查询需求,点查询使用 Hash,范围查询使用 Sorted Set,聚合计算使用 RedisTimeSeries。
如果想要保证插入事务的原子性,那么使用 MUTLI 和 EXEC 关键字。
专栏里面没说,如何编译 RedisTimeSeries,在哪里加载 loadmodule,暂时只能是不明觉厉了。
git clone --recursive https://github.com/RedisTimeSeries/RedisTimeSeries.git
cd RedisTimeSeries
make setup
...
$ redis-server --loadmodule /path/to/module/redistimeseries.so
loadmodule bin/redistimeseries.so
课后题,使用 Sorted Set 保存时间序列数据,时间戳作为 score,实际数据作为 member,潜在的风险可能是时间戳作为 score 有点太长了,或者说太大了,并不方便比较,而且在存储上有些浪费。
看了课代表 @Kaito 的回答,发现我忽略了潜在的 bigkey 风险。另外,可能更大的风险来自于留言中多位同学指出的,当温度作为 member 相同的时候,zadd 会覆盖掉原有的 score,也就是 时间戳,然后就没法查询了。
如果我是 Redis 的开发维护者,不会把 聚合计算 作为 Sorted Set 的内在功能,因为 Redis 本来就不是用作聚合计算或者说是统计的,Redis 的初心应该是“缓存”,或者说是提供高性能的数据读取。
同样来自课代表,聚合计算是 CPU 密集型任务,而 Redis 是单线程的……
在 @Eric.Lee 的留言里面看到时间序列数据库:influxdb 和 Prometheus,后者不是一个监控框架么?
还有同学问到了如何在云 Redis 上加载 RedisTimeSeries 的问题,同问。
版权声明: 本文为 InfoQ 作者【escray】的原创文章。
原文链接:【http://xie.infoq.cn/article/6bf7b5d52cabb9a753535a622】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论