并行获取Redis键值对

uwopmtnx  于 9个月前  发布在  Redis
关注(0)|答案(1)|浏览(72)

我需要获取所有匹配某个键前缀的键/值对。这需要并行进行(例如,使用线程)。
我的想法是扫描所有匹配前缀的键,只过滤那些(hash(key) % partition_size) == partition_id的键,其中partition_size是并行进程的数量,partition_id是分配给每个进程的0..partition_size-1之间的数字。
Redis命令或脚本是什么样子的?有没有一种非脚本的方式可以做到这一点?

gzjq41n4

gzjq41n41#

你应该看看Redis Stack的搜索功能。您可以使用FT.CREATE命令在包含Redis Hash或Redis Stack JSON文档的部分键空间上创建搜索索引,然后使用FT.SEARCH命令搜索更像SQL语法的匹配项。
这将允许你做这样的事情(使用哈希的演示,你也可以使用JSON):
创建一些数据:

> hset data:1 value 1 data hello
(integer) 2

> hset data:2 value 2 data world
(integer) 2

> hset data:3 value 3 data how
(integer) 2

> hset data:4 value 4 data are
(integer) 2

> hset data:5 value 5 data you
(integer) 2

在数据上创建一个索引,这里我将value作为数字索引,但您也可以将data作为标记或全文索引。

> ft.create idx:data on hash prefix 1 data: schema value numeric sortable
"OK"

搜索现在将跟踪对前缀为data:的键的所有更改,其类型为Hash。
现在我可以做一些搜索并得到数据。所有值小于3的东西:

> ft.search idx:data "@value:[-inf 2]"
1) "2"
2) "data:1"
3) 1) "value"
   2) "1"
   3) "data"
   4) "hello"
4) "data:2"
5) 1) "value"
   2) "2"
   3) "data"
   4) "world"

返回所有索引项的搜索:

> ft.search idx:data "*"
1) "5"
2) "data:1"
3) 1) "value"
   2) "1"
   3) "data"
   4) "hello"
4) "data:4"
5) 1) "value"
   2) "4"
   3) "data"
   4) "are"
6) "data:3"
7) 1) "value"
   2) "3"
   3) "data"
   4) "how"
8) "data:2"
9) 1) "value"
   2) "2"
   3) "data"
   4) "world"
10) "data:5"
11) 1) "value"
   2) "5"
   3) "data"
   4) "you"

默认情况下,您将获得前10个,并可以使用LIMIT分页。让我们得到2:

> ft.search idx:data "*" LIMIT 0 2
1) "5"
2) "data:1"
3) 1) "value"
   2) "1"
   3) "data"
   4) "hello"
4) "data:4"
5) 1) "value"
   2) "4"
   3) "data"
   4) "are"

如果您只想返回数据的某些部分,请使用RETURN

> ft.search idx:data "*" LIMIT 0 2 RETURN 1 data
1) "5"
2) "data:1"
3) 1) "data"
   2) "hello"
4) "data:4"
5) 1) "data"
   2) "are"

如果你只需要keyname,使用NOCONTENT

> ft.search idx:data "*" LIMIT 0 2 NOCONTENT
1) "5"
2) "data:1"
3) "data:4"

请注意,Redis基本上是单线程的,因此“并行”在这里的使用有限。
参考文献:

相关问题