redis是否支持字符串数据类型的二级索引?我想知道如何在redis中存储数据以及备用键。例如,假设我想将键值为'id:<some\u string>'的实体存储,并将其有效负载存储为压缩的json字符串。但有时我需要用json中的另一个值来搜索负载,这个值可能也是唯一的。比如,sql查询,我可以用json中除了key以外的其他字段进行查询吗?另外,我想知道在redis中使用主键设置值时,如何为它设置二级索引值。
oxosxuxt1#
jredisearch是redis模块redisearch的客户机,它提供了对jedis的扩展,允许通过简单的查询命令在redis中轻松定义二级索引。例如
Query q = new Query("@brand:Toyota") .addFilter(new Query.NumericFilter("price", 0, 1000)) .limit(0,5); SearchResult res = client.search(q);
juud5qan2#
“有时我需要用json中的另一个值搜索有效负载”你不能,redis不是为这个而建的。redis速度很快,主要用于键值存储。如果json中有很多字段需要索引,那么就需要一个关系数据库。是的,你可以使用redisearch.io,尽管你应该注意到它的免费版本不允许你在aws或azure等平台上使用,但你必须部署自己的redis,而且它不支持redis集群。因此,如果您只使用关系数据库或elasticsearch,效果会更好。但是,如果您只需要一个或两个额外的索引就可以找到值(在您的例子中是json负载),那么它可以高效地实现。将json存储为redis字符串{“somekey”,“你的json负载”}这里没什么不寻常的。或者更好,就像redis hash一样{“myredishash”、[{“somekey”、“your json payload”}、{“anotherkey”、“another json”}]}(哈希在字符串上节省一些内存)然后将第二个索引存储在redis hash中{“mysecondindexhash”、[{“second\u index\u 1”、“somekey”}、{“second\u index\u 2”、“anotherkey”}]}所以它基本上把第二个索引Map到主键。在更新主值字符串/哈希的同时,维护第二个索引哈希。对你的第三个,第四个索引做同样的操作。注意,多个操作不是原子的,如果这对您很重要,您应该用lua scrip编写它们。
2条答案
按热度按时间oxosxuxt1#
jredisearch是redis模块redisearch的客户机,它提供了对jedis的扩展,允许通过简单的查询命令在redis中轻松定义二级索引。
例如
juud5qan2#
“有时我需要用json中的另一个值搜索有效负载”
你不能,redis不是为这个而建的。redis速度很快,主要用于键值存储。如果json中有很多字段需要索引,那么就需要一个关系数据库。是的,你可以使用redisearch.io,尽管你应该注意到它的免费版本不允许你在aws或azure等平台上使用,但你必须部署自己的redis,而且它不支持redis集群。因此,如果您只使用关系数据库或elasticsearch,效果会更好。
但是,如果您只需要一个或两个额外的索引就可以找到值(在您的例子中是json负载),那么它可以高效地实现。
将json存储为redis字符串
{“somekey”,“你的json负载”}
这里没什么不寻常的。或者更好,就像redis hash一样
{“myredishash”、[{“somekey”、“your json payload”}、{“anotherkey”、“another json”}]}
(哈希在字符串上节省一些内存)
然后将第二个索引存储在redis hash中
{“mysecondindexhash”、[{“second\u index\u 1”、“somekey”}、{“second\u index\u 2”、“anotherkey”}]}
所以它基本上把第二个索引Map到主键。在更新主值字符串/哈希的同时,维护第二个索引哈希。对你的第三个,第四个索引做同样的操作。
注意,多个操作不是原子的,如果这对您很重要,您应该用lua scrip编写它们。