redis - 如何扫描自上次 SCAN 以来其值已更新的键
问题描述
我想通过 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"
推荐阅读
- elasticsearch - 如何在 Elasticsearch 中索引文档以最小化文档数量?
- javascript - 将下拉列表定位到特定值
- java - 使用 setOnSeekBarChangeListener 或 Button 的两个 SeekBar 的值的 Android Java 总和
- ios - iOS 部署目标“IPHONEOS_DEPLOYMENT_TARGET”设置为 8.0,在 Flutter 中如何更改最小 IOS 部署目标
- file-upload - 错误的 JSON:预期的对象值。Dropbox API 文件上传错误
- python - 将 excel 或 csv 转换为列表或字典,或将 word doc 转换为 python 中的列表
- django-forms - 表单对象未加载到模板中
- c++ - 为什么我最大的素数 c++ 代码得到最终答案的速度如此之慢?
- spring-boot - 如何在 Spring Project 上记录不同的实例
? - python - 如何使用 Esc 停止 while 循环?