随时间存储温度读数的最佳数据结构

时间:2014-06-19 12:08:01

标签: redis

我曾经使用SQL,如MySQL,Postgres或MSSQL。

现在我想玩Redis。我正在开展一个小型家庭项目,我认为这是开始使用Redis的最佳选择。

我有一台可以读取温度(室内和室外)和湿度的机器。我需要将读数存储到Redis中。你能帮助我理解这样做的最佳数据结构吗?

除了这些数据外,我还需要存储温度读数的时间(例如unix时间戳),以便绘制图形。

我安装Redis阅读文档,所以我理解命令和数据类型。

3 个答案:

答案 0 :(得分:2)

因为这是你的第一个Redis项目而且它是一个家庭项目,所以我要小心谨慎。这里有几种方法可以考虑设计它(注意:上周末我只深入研究了REDIS,所以其他人一定会考虑到这一点。)

IDEA 1:

  • 四个有序集
  • 套装的关键是“indoor_temps”,“outdoor_temps”,“indoor_humidity”,“outdoor_humidity”
  • VALUES是温度/湿度
  • SCORE是存储为EPOCH的日期

IDEA 2:

  • 四种类型的键(最好通过示例显示)
  • datetime_key = / year:2014 /月:07 /天:12 /小时:07 /分钟:32 /秒:54
  • type_keys = [indoor_temps,outdoor_temps,indoor_humidity,outdoor_humidity]
  • 键的格式为+“/”+ datetime_key
  • 值是温度和湿度本身

您可能希望实施一些初始设计,然后立即处理数据 - 绘制图表,执行统计信息等。无论您打算如何处理它。这将暴露缺陷,如果它们是主要的,请刷新数据库并再试一次。这些设计实际上只需要大约1个小时来实现,因为您真正改变的唯一事情是使用一些Redis命令和一些字符串操作来将数据转换为键。

答案 1 :(得分:1)

我喜欢托尼的建议,但我也会抛出另一种可能性。

  • 4列表
  • 键是" indoor_temps"," outdoor_temps"," indoor_humidity"," outdoor_humidity"
  • 值的形式为<时间戳> _<阅读>即。(" 1403197981_27.2")

使用LPUSH将项目推送到列表的前面。使用LRANGE获取一组读数。列表将始终按阅读时间排序。显然将价值拆分为" _"得到你的时间和阅读...

老实说,这将提供与Tony的第一个示例相同的属性,查找性能略差,但better memory usage。我猜这个项目你既不是内存也不是CPU限制,所以选择可能不是问题。也就是说,如果您希望节省数百或者更多的读数,我会建议列表,除非您想要占用系统内存的大部分内容。

此外,最好在您的参赛作品上使用一些合理的TTL调用EXPIRE,该TTL包含您想要保存读数的时间长度。如果您的计划是让它们永久存在,那么您可能希望随着时间的推移将它们备份到磁盘DB,并且只需使用Redis作为最近读数的快速查找缓存。

答案 2 :(得分:0)

感谢所有回答,我选择了这个结构:

  • 4列表:tempIN,tempOut,humidIN和humidOUT
  • 值为:[value]:[timestamp]。例如:" 25.4:1403615247"

根据wallacer的建议,我想从Redis备份旧条目。 对于主要前端,我只需要持续两天的样本。

例如,我可以创建Redis RDB文件快照和" trim"现场名单。如果将来要恢复旧值,此解决方案不方便。

您是否有任何关于采用何种程序存储数据的提示?也许使用SQLIte DB?