如何扫描自上次扫描以来其值已更新的键

时间:2019-05-31 18:08:57

标签: redis

我想通过Redis实例定期扫描自上次扫描以来已更改的键。在两次扫描之间,我不想处理密钥。

例如,一个键可能在两次扫描之间获得一千次更新。我仅在进行下一次定期扫描时才关心最新值。

1 个答案:

答案 0 :(得分:0)

Redis还没有内置的方法来实现这一目标。

例如,您可以重新编码您的应用并添加某种方式来跟踪更新。例如,无论您在呼叫SET foo bar的哪个地方,也都要呼叫ZADD updated <timestamp> foo。然后,您可以使用“更新的”排序集来检索更新的密钥。

或者,您可以尝试使用RedisGears自动执行跟踪部分(对于初学者)。假设您正在运行RedisGears(即docker run -it -p 6379:6379 redislabs/redisgears),则可以执行以下操作:

$ cat gear.py
def addToUpdatedZset(x):
    import time
    now = time.time()
    execute('ZADD', 'updated', now, x['key'])
    return x

GB().filter(lambda x: x['key'] != 'updated').foreach(addToUpdatedZset).register('*')

$ redis-cli RG.PYEXECUTE "$(cat gear.py)"
OK
$ redis-cli
127.0.0.1:6379> KEYS *
(empty list or set)
127.0.0.1:6379> SET foo bar
OK
127.0.0.1:6379> KEYS *
1) "updated"
2) "foo"
127.0.0.1:6379> ZRANGE updated 0 -1 WITHSCORES
1) "foo"
2) "1559339877.1392548"
127.0.0.1:6379> SET baz qux
OK
127.0.0.1:6379> KEYS *
1) "updated"
2) "baz"
3) "foo"
127.0.0.1:6379> ZRANGE updated 0 -1 WITHSCORES
1) "foo"
2) "1559339877.1392548"
3) "baz"
4) "1559339911.5493586"