Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
redis数据访问的关键设计_Redis_Key_Data Access - Fatal编程技术网

redis数据访问的关键设计

redis数据访问的关键设计,redis,key,data-access,Redis,Key,Data Access,我对在redis上构建时间序列应用程序感兴趣。我的数据有时会历史性地到达,因此数据是可变的。我现在有大约一亿个活动 我正在考虑的数据访问需要灵活,因此按重要性排序 类型[销售佣金印象] 日期类型[每天的分钟小时数] 客户 布兰迪德 产品类型ID 产品ID 我想问的是,销售、佣金、印象是什么样的数据。 然后聚合类型为秒、分钟、小时、天 我有一个事件数据的层次结构,所以按客户、品牌、产品类型和每个特定的产品 是否有一种方法可以构建一个密钥,如: 销售:小时:客户ID:brandid:productt

我对在redis上构建时间序列应用程序感兴趣。我的数据有时会历史性地到达,因此数据是可变的。我现在有大约一亿个活动

我正在考虑的数据访问需要灵活,因此按重要性排序

类型[销售佣金印象] 日期类型[每天的分钟小时数] 客户 布兰迪德 产品类型ID 产品ID

我想问的是,销售、佣金、印象是什么样的数据。 然后聚合类型为秒、分钟、小时、天 我有一个事件数据的层次结构,所以按客户、品牌、产品类型和每个特定的产品

是否有一种方法可以构建一个密钥,如:

销售:小时:客户ID:brandid:producttypeid:productid

然后查询该键的一部分,如

销售时间:小时:客户ID:brandid

或者我需要为每个人构建桶吗

  • 销售时间:小时
  • 销售时间:小时:客户ID
  • 销售时间:小时:客户ID:brandid
  • 销售时间:小时:客户ID:brandid:producttypeid
  • 销售:小时:客户ID:brandid:producttypeid:productid

我认为couchbase-及其视图(索引)对于您的用例来说是一个更好的无sql选择。您可以将每个项目存储为单个条目,然后使用视图以任何方式对其进行切片。然而,它最终只能在视图上持久化(因此数据可能有点陈旧——几秒钟/最多一分钟左右)。如果你能接受,这对你来说是一个更好的工具。它还具有持久性,这在redis中很难实现

您可以使用redis sortedset从中签出本节词典索引。

您知道何时需要使用
ZADD
commmand向SortedSet添加元素。像这样:

ZADD key score member
ZRANGEBYLEX myset [FG63dF:2017-08-28T08:<client-id>:<brand-id>:<producttypeid>:<product-id> + 
但在您的情况下,所有列都是字符串,分数必须是十进制的,所以在这里它是无用的。我们将始终将分数设置为0,以保持它对我们没有影响。因为对于相同的分数,排序集将按照其成员的词典顺序对元素进行排序

然后我们用sortedset创建一个复合索引,就像关系数据库一样。像这样:

ZADD myset 0 sale:hour:clientid:brandid:producttypeid:productid:real_value
如果您想使用sale:hour进行查询,您可以这样做:(假设sale是六个字符的唯一ID,hour是带有YYYY-MM DDTH的datetime格式,您想使用sale:FG63dF进行查询,小时是2017-08-28T08)

这将返回具有相同销售Id的本小时数据。其他查询与上述相同。关于(和[)的含义,这意味着范围项分别是独占的还是包含的

如果要查询包含所有列的数据,请执行以下操作:

ZADD key score member
ZRANGEBYLEX myset [FG63dF:2017-08-28T08:<client-id>:<brand-id>:<producttypeid>:<product-id> + 
ZRANGEBYLEX myset[FG63dF:2017-08-28T08::+
“+”类似于无限值,您也可以为自己指定限制。 详情请参考

需要注意的是:您要在sale、hour等复合索引中使用的所有列必须具有相同的格式和相同的填充。例如,如果某些brandid为四位数,而其他brandid为五位数,则必须在四位数上添加左填充。例如,7878=>07878

在本例中,我们使用冒号分割这些列,因此这些列不能有冒号

更详细的“如何”您可以参考我最初提到的文章。RedisLabs现在提供了一些有趣的功能。 对于您的用例,我们有一些标签,您可以在以后通过这些标签进行过滤,以便从相关的时间序列中检索数据。 它还支持多个聚合