我想通过Redis实例定期扫描自上次扫描以来已更改的键。在两次扫描之间,我不想处理密钥。
例如,一个键可能在两次扫描之间获得一千次更新。我仅在进行下一次定期扫描时才关心最新值。
答案 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"