有效地验证和处理redis排序集中的数据

hfyxw5xn  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(382)

我们有微服务 Go lang )它的主要目的是从多个物联网设备获取日志并对其进行处理,然后将结果放入postgresql表中。系统的工作方式是,每个设备都有自己的排序集,日志将保存在那里,对于每个日志,分数将是一个时间戳(当然,我知道时间序列将是一个更好的决定,但我们目前希望使用排序集)。要知道每个设备每1秒都会有一个日志。
我想每5秒钟处理一次这些集合中的数据,但是对于每个集合,其中的日志都应该通过一些测试:
集合中应该有多个日志
如果时间戳之间的时间差为1秒,则可以从集合中删除两个日志
验证日志后,可以将其传递给其他方法或函数,然后再传递给其余的处理。如果日志无效(存在一个与其他日志的时差超过1秒的日志),那么它将返回到集合,并等待再次检查下一次迭代。
问题:
我的问题基本上是我不知道如何从列表中取出数据,验证它们,然后再放回去!更清楚的是,每个集合中的所有日志都可以被删除,或者没有日志可以被删除,而这种情况发生在新数据内容进来的时候,因为我不能用redis-it-self验证数据,所以我不知道该怎么做。我目前的解决方案如下:
每隔5秒,所有来自每个集合的数据都应该从redis中移除,并保存在代码中的某个数据结构中(如列表…),在验证之后,一些尚未验证的日志应该放回redis。如您所见,这些解决方案需要从代码中进行两次数据库访问,并且在放置无效日志时,应按redis对其进行排序。。。当日志太多并且有很多设备的时候,我认为这个解决方案不是最好的方法。我对redis不是很有经验,所以非常感谢您对这个问题的评论。谢谢

yvt65v4c

yvt65v4c1#

既然您决定使用排序集,那么首先要知道以下几点
“集合中应该有多个日志”。如果排序集中没有元素,则 set / key 不存在。您可以通过两个不同的命令检查排序集中是否有日志;zcard和exists都在o(1)中工作。
排序集中不能有多次相同的日志(实际上是相同的)。您需要一个标识符(例如 timestamp , uuid , hash etc)在一个单独的排序集中将每个单独的日志彼此分开。它将更新 score 现有元素(可能不是您想要的)

127.0.0.1:6379> zadd mydevice 1234 "log-a"
(integer) 1
127.0.0.1:6379> zadd mydevice 12345 "log-a"
(integer) 0
127.0.0.1:6379> zrange mydevice 0 -1 withscores
1) "log-a"
2) "12345"
127.0.0.1:6379>

使用内置方法在数据层上实现这一点没有单一的方法。您将需要具有业务逻辑的应用程序层来完成所需的工作。
我的建议是将每个物联网设备+分钟的组合保持在不同的分类集中。所以每一分钟每个设备都会有一个不同的键,你会追加一分钟 2020:06:06:21:21 对于设备标识符键,它最多将放置60个日志。你可以和我核对一下 zcard 可能是这样的;

127.0.0.1:6379> zadd device:1:2020:06:06:21:21 1591442137 my-iot-payload
(integer) 1
127.0.0.1:6379> zadd device:1:2020:06:06:21:21 1591442138 my-iot-payload-another
(integer) 1
127.0.0.1:6379> zadd device:1:2020:06:06:21:21 1591442138 my-iot-payload-yet-another
(integer) 1
127.0.0.1:6379> zrange device:1:2020:06:06:21:21 0 -1
1) "my-iot-payload"
2) "my-iot-payload-another"
3) "my-iot-payload-yet-another"
127.0.0.1:6379>

在应用层中;
每分钟为每台设备检查排序集(我知道你说的是5秒,但如果你想这样做,你需要一个模的方式,以5秒的间隔键,而不是1分钟分开他们)
你有设备列表(可能在数据库表中),你知道现在几点了(转换成redis键)
获取分钟/设备分隔键 zrange (withscores选项)在应用程序级别对每个设备和精确的分钟进行计算和验证。
如果通过,则保存到postgresql数据库中(删除排序的set键或执行 expire 无论何时添加新元素 zadd ).
如果他们失败了,那完全取决于你。对于每个设备,您都有单独的日志,您可以删除它或部分解析它们来保存它。

相关问题