[Location service] 删除/更新Geohash具体步骤和race condition的处理

  1. 假如说,某个司机需要更新自己的信息,他找到对应的geohash,如果set里的最早的ts是近期的,那么他只是把自己加入到set里或者更新一下自己在这个set里的ts对吗?
  2. 如果对应的geohash的driver list里的最早的ts是30秒之前的就需要清空所有set 然后把自己重新加入,是这么理解吗? 加入多个driver同时清空同一个set那岂不是会出现lost update的情况? 就是一个司机清空了set并且把自己已经加入进去了,然后第二个司机又清空了一次? 这种情况如何处理race condition?
  1. 是的
  2. 不是清空整个 set,而是删除那些30秒以前的部分。重复清空也没有问题,因为这些数据已经不需要了。

@logic 2 我的意思是 假如driver id为123的司机正在更新自己的geolash中自己的ts 发现 id为 456 对应的ts是三十秒之前了,正准备要删除它之前,突然被456的司机本身更新到了最新的ts,但是123 没有意识到数据已经更新了 就把456更新后的数据给删除了

对于 driver 123 来说,读和写在同一个 transaction 里面。直到完成之后,driver 456 才能写。

如果我没记错的话,redis是单线程的,这种race condition不会发生

你说的不对。单线程也可以有 race condition。可以看一下这个例子。

1 个赞

为了保证原子性,这里要使用 Redis 的 LUA Script?

这个例子分享的好,我觉得不加锁的情况下,可能要用Redis 的 LUA Script?

加锁就好了吧, LUA Script 怎么解决?

找了个类似的例子:

Atomicity with Lua | Redis Developer Hub.

1 个赞