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中排序和定时不可得兼,我放弃了排序这个要求,改在应用层中完成。