Redis有效地创建密钥

时间:2016-07-19 08:57:54

标签: database optimization redis high-availability nosql

我正在尝试将一些数据存储在redis中。

考虑以下示例。

一个人在不同年份拥有不同的汽车。

目前我正在存储这样的密钥 -

cars:johndoe:1991:mercedes model s1 engine v1
cars:johndoe:1992:mercedes model s1 engine v1
cars:jane:1992:BMW model s2 engine v2
cars:foobar:1991:honda model s3 engine v3

这样做的好处是 - 我可以使用带密钥的通配符来获取不同的数据。 例如

1. all cars bought in 1991
keys cars:*:1991:*

2. all cars owned by johndoe
keys cars:johndoe:*

但是根据redis文档,带有通配符的keys命令效率不高,因为它会搜索所有键。
所以我决定使用这些数据集。 但是为了获得与上面相同的结果,我需要许多不同类型的集合,例如

1. sadd cars cars:johndoe:1991:mercedes cars:johndoe:1992:mercedes cars:jane:1992:BMW cars:foobar:1991:honda
2. sadd cars:johndoe cars:johndoe:1991:mercedes cars:johndoe:1992:mercedes
3. sadd cars:jane cars:jane:1992:BMW 
4. sadd cars:foobar cars:foobar:1991:honda
5. sadd cars:1991 cars cars:johndoe:1991:mercedes  cars:foobar:1991:honda

这样,我需要添加&删除许多单个操作的键。

这是唯一的方法吗?如果有更有效的解决方法,请告诉我。

提前致谢。

2 个答案:

答案 0 :(得分:0)

在第一种方法中,您可以使用SCAN

而不是使用键

您可以编写一个简单的lua脚本,甚至可以在应用程序逻辑中使用光标点迭代扫描命令并获取与给定模式匹配的所有键。

IMO如果您有很多标准要处理,那么第一个选项将是最合适的

  1. 你可以避免碰到多个悲伤
  2. 根据任何条件进行检索
  3. 如果您的标准数量较少,则第二个选项最合适

    1. 无需使用scan命令进行迭代,您将拥有要查找的密钥。
    2. 希望这会有所帮助。

答案 1 :(得分:0)

这些确实是唯一的两种方法 - 不仅适用于Redis,还适用于任何数据库。这是经典的时空权衡:要么用RAM付费(即存储多个索引[集])以使搜索快速或使用CPU(即进行特别扫描)。

Redis的理念是利用空间,因为我们的目标是最大化性能。这意味着您希望以您需要的方式存储数据。因为在您的情况下,您有兴趣使用不同的维度阅读数据,您需要适当地索引每个维度。对于那种类型的索引,Redis'集合是一个不错的选择,不包括“生成年份”数据,它可以从排序集中索引以便于范围搜索(多年来,但仅在需要时)。