首页 > 解决方案 > 如何扫描自上次 SCAN 以来其值已更新的键

问题描述

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

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

标签: redis

解决方案


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"

推荐阅读