python读取redis存储数据的存储时间_Redis应该如何存储带时间戳的分类实时数据?…

  • Post author:
  • Post category:python


4月份提的问题,中间插入一个项目,9月份来重新实施。在实际Coding过程中。发现使用Sorted Set还是有问题。

需求

一批设备每隔0.5秒发送带时间戳的数据给DB,Web端每隔2秒从DB读取后将带时间戳数据集以JSON格式交给绘图JS引擎。

可索引,以DevID,Timestamp进行索引

易失性,仅存在n秒,2

排序性,按照时间戳排序

精确性,写入2Hz,读出0.5Hz

Sorted Set 默认支持排序,可比较删除,可比较读取。按照您提议的数据结构是:

Zset name: DeviceID,如”NOKIA5110″

Zset member: Timestamp, 如20150908 12


30 -> “1441687256.437”

Zset value: “0x01,0x02,…… ”

Zset score: Timestamp, 以时间戳排序

索引:可以根据NOKIA5110设备号查到该设备下的任意缓存时间戳数据

比较读取:可以根据特定设备号和时间戳score排序比较

删除:必须按照特定设备号进行时间戳score排序删除

但是却必须利用另外的线程(CRON)去实现定期比较删除。Redis Expire 只针对Key,也就是说Sorted Set中的member是无法实现Expire自动删除的。

如果不采用独立线程对member进行比较删除,那么Sorted Set会很快导致系统崩溃。而且一旦设备数量上升,对于CRON和redis压力非常大。

看样子,如果要利用Expire指令的话,Sort需要要应用层实施了。

新的思路

采用Redis原始String数据结构

Key Namespace:DeviceId:Timestamp

Key Expiration: 2.1 seconds

Value: Serialized 8Byte data

操作

可删除:自动超时删除数据,无需单独线程

可索引:读取特定设备数据(超时删除后,每组设备为0~5组数据)

易失性:已满足

精确性:时间管理

扩展性:规模可控

排序性:返回集合规模小,5个Key比较实施起来很简单

Python的List结构的Sort可以很快速的解决排序的问题。

所以,由于Redis中排序和定时不可得兼,我放弃了排序这个要求,改在应用层中完成。