如何在给定的时间窗口内处理资源的单个更新

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

我正在从设备接收特定资源id的多个位置更新。这些位置更新也可以以秒或毫秒的间隔接收。
我只想在给定的时间窗口(比如说10秒)内处理任何特定资源id的一个更新。
目前,我正在从redis集群读取最后一次处理的资源id请求,并检查时间差是否大于30秒,然后只有我在处理该请求。
当我们几乎在同一时间(毫秒间隔)收到请求时,就会发生问题。两台不同的机器选择处理这些请求。当两台计算机都试图获取该资源id的最后一个已处理请求时,它们都会获得相同的记录,因此两个请求都会进入系统。
有什么方法可以防止这种情况发生吗?

z31licg0

z31licg01#

可以使用setnx(如果不存在则设置)。对于资源id 1,在任何时间戳处进行10000除法(10秒)。例如,timestamp 1583906206000,值将为158390620。并将密钥构造为资源时间158390620。在接下来的10秒钟里,我们的钥匙都是一样的。

setnx resource_1_time_158390620 value

如果多个appservers尝试,或者多个请求在10秒内出现,则仅为第一个请求设置该值。此外,此命令返回1表示值已设置,0表示值已存在。你也可以利用它。

相关问题