Redis:迭代/扫描按其值排序的所有键

时间:2015-08-21 09:30:13

标签: redis

是否可以迭代按值排序的所有存储的redis键?

stored values:
  SET foo:a 1
  SET foo:b 20
  SET foo:c 5

desired output:
  SCAN 0 MATCH foo_* <some-sort-magic>
      foo:b
      foo:c
      foo:a

我无法在排序集中存储foo:a,foo:b,foo:c,因为值经常变化。

如果它也适用于哈希值会更好:

stored hashs:
  HSET foo:a bar 1
  HSET foo:b bar 20
  HSET foo:c bar 5

desired output:
  SCAN 0 MATCH foo_* <some-sort-magic-for-the-'bar'-field>
      foo:b
      foo:c
      foo:a

除了在应用程序中获取所有值和排序之外的任何建议? THX。

1 个答案:

答案 0 :(得分:2)

  

是否可以迭代按值排序的所有存储的redis键?

即使这是可能的,你真的不想这样做。对密钥空间进行全面扫描,存储响应需要RAM并且排序需要更多时间。你真的想让数据库占用吗?

编辑:如果您确实希望保持数据库占用,那么Redis没有开箱即用的功能。但是,如果没有应用程序执行过滤,至少还有两种方法可以做到这一点。

第一种方法是使用执行SCAN的Lua脚本,获取值并在返回回复之前对它们进行排序。

第二种方法是使用Redis模块,特别是RediSearch来扩展Redis的功能。

  

我无法在排序集中存储foo:a,foo:b,foo:c,因为值经常变化。

没有太频繁改变的事情 - Redis的一切都是在RAM中完成的,因此写入速度和......其他任何东西一样快。

  

除了在应用程序中获取所有值和排序之外的任何建议吗?

使用排序集。