定义问题:
我们有这个物联网设备,每个设备都会向我们发送有关汽车位置的日志。我们要计算汽车在线行驶的距离!因此,当日志出现时(将其放入队列等之后),我们会这样做:
type Delta struct {
DeviceId string
time int64
Distance float64
}
var LastLogs = make(map[string]FullLog)
var Distances = make(map[string]Delta)
func addLastLog(l FullLog) {
LastLogs[l.DeviceID] = l
}
func AddToLogPerDay(l FullLog) {
//mutex.Lock()
if val, ok := LastLogs[l.DeviceID]; ok {
if distance, exist := Distances[l.DeviceID]; exist {
x := computingDistance(val, l)
Distances[l.DeviceID] = Delta{
DeviceId: l.DeviceID,
time: distance.time + 1,
Distance: distance.Distance + x,
}
} else {
Distances[l.DeviceID] = Delta{
DeviceId: l.DeviceID,
time: 1,
Distance: 0,
}
}
}
addLastLog(l)
}
它基本上使用效用函数计算距离!因此,在Distances每个设备中,ID 都映射到了一定距离!现在是问题开始的地方:虽然这个距离被添加到Distances map,我想要一个 go 例程来把这个数据放在数据库中,但是因为有很多设备和很多日志等等,对每个日志进行这个查询并不是一个好主意. 所以我需要每 5 秒执行一次,这意味着每 5 秒尝试清空添加到地图的所有最后距离的列表。我写了这个函数:
func UpdateLogPerDayTable() {
for {
for _, distance := range Distances {
logs := model.HourPerDay{}
result := services.CarDBProvider.DB.Table(model.HourPerDay{}.TableName()).
}
}
它go utlis.UpdateLogPerDayTable()
在另一个 goroutine 上被调用。但是这里有很多问题:
我不知道如何保护Distances
,所以当我将它添加到另一个例程中时,我在其他地方阅读它,一切都很好!(问题是我想使用 go 频道并且不知道该怎么做)
对于这个问题,我如何安排任务?
可能我会添加一个 redis 来存储所有在线设备,这样我就可以更快地进行选择查询并更新实际的数据库。还为 redis 添加过期时间,因此如果设备在一段时间内没有发送和数据,它就会消失!我应该把这段代码放在哪里?
对不起,如果我的解释还不够,但我真的需要一些帮助。专门用于代码实现
慕容3067478
相关分类