redis数据访问的关键设计
我对在redis上构建时间序列应用程序感兴趣。我的数据有时会历史性地到达,因此数据是可变的。我现在有大约一亿个活动 我正在考虑的数据访问需要灵活,因此按重要性排序 类型[销售佣金印象] 日期类型[每天的分钟小时数] 客户 布兰迪德 产品类型ID 产品ID 我想问的是,销售、佣金、印象是什么样的数据。 然后聚合类型为秒、分钟、小时、天 我有一个事件数据的层次结构,所以按客户、品牌、产品类型和每个特定的产品 是否有一种方法可以构建一个密钥,如: 销售:小时:客户ID:brandid:producttypeid:productid 然后查询该键的一部分,如 销售时间:小时:客户ID:brandid 或者我需要为每个人构建桶吗redis数据访问的关键设计,redis,key,data-access,Redis,Key,Data Access,我对在redis上构建时间序列应用程序感兴趣。我的数据有时会历史性地到达,因此数据是可变的。我现在有大约一亿个活动 我正在考虑的数据访问需要灵活,因此按重要性排序 类型[销售佣金印象] 日期类型[每天的分钟小时数] 客户 布兰迪德 产品类型ID 产品ID 我想问的是,销售、佣金、印象是什么样的数据。 然后聚合类型为秒、分钟、小时、天 我有一个事件数据的层次结构,所以按客户、品牌、产品类型和每个特定的产品 是否有一种方法可以构建一个密钥,如: 销售:小时:客户ID:brandid:productt
- 销售时间:小时
- 销售时间:小时:客户ID
- 销售时间:小时:客户ID:brandid
- 销售时间:小时:客户ID:brandid:producttypeid
- 销售:小时:客户ID:brandid:producttypeid:productid
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现在提供了一些有趣的功能。
对于您的用例,我们有一些标签,您可以在以后通过这些标签进行过滤,以便从相关的时间序列中检索数据。
它还支持多个聚合