redis数据访问的key设计
Key design for redis data access
我有兴趣在 Redis 上构建时间序列应用程序。我的数据有时会在历史上到达,因此数据是可变的。我目前有大约 1 亿个事件。
我正在考虑的数据访问需要灵活,因此按重要性排序
键入 [销售佣金印象]
日期类型 [最小时日]
客户编号
布兰迪
产品类型id
productid
我想问的是销售、佣金、印象等什么类型的数据。
然后是聚合类型 second, min, hour, day
我有事件数据的层次结构,因此按客户、品牌、产品类型和每个特定产品分类。
有没有办法像这样构建密钥:
sale:hour:clientid:brandid:producttypeid:productid
然后查询该键的一部分,例如
销售:小时:clientid:brandid
或者我是否需要为每个
构建存储桶
- 销售:小时
- 销售:小时:clientid
- 销售:小时:clientid:brandid
- 销售:小时:clientid:brandid:producttypeid
- sale:hour:clientid:brandid:producttypeid:productid
我认为 couchbase - 及其视图(索引)对于您的用例来说是一个更好的无 sql 选择。您可以将每个项目存储为单个条目,然后根据需要使用视图对其进行切片。但是,它最终只会在视图上持久存在(因此数据可能有点陈旧 - seconds/up 到一分钟左右)。如果您能忍受这一点,那么这对您来说是一个更好的工具。它也是持久的,这对于redis来说更难获得。
你可以使用redis sortedset。 查看此部分 article 中的词典索引。
您知道何时要向 SortedSet 添加元素,使用 ZADD
命令。像这样:
ZADD key score member
但是在你的例子中,所有的列都是字符串,分数必须是小数,所以在这里是没有用的。我们将始终将分数设置为 0 以保持它对具有相同分数的 us.Because 没有影响,sorted set 将按照其成员的字典顺序对元素进行排序。
然后我们像关系数据库一样创建一个带有排序集的复合索引。像这样:
ZADD myset 0 sale:hour:clientid:brandid:producttypeid:productid:real_value
如果您想使用 sale:hour 进行查询,您可以这样做:(假设销售是六个字符的唯一 ID,小时是 YYYY-MM-ddThh 的日期时间格式,并且您想要查询销售的东西是 FG63dF,时间是 2017-08-28T08)
ZRANGEBYLEX myset [FG63dF:2017-08-28T08 (FG63dF:2017-08-28T09
这将 return 这一小时的数据具有相同的销售 ID。其他查询同上。关于 ( 和 [ 的含义,分别表示范围项是独占还是包含。
如果你想查询一个包含所有列的数据,像这样:
ZRANGEBYLEX myset [FG63dF:2017-08-28T08:<client-id>:<brand-id>:<producttypeid>:<product-id> +
'+'就像无限大的值,你也可以指定你的极限。
详情请参考ZRANGEBYLEX
注意事项:您要在复合索引(如销售、小时等)中使用的所有列必须具有相同的格式和相同的填充。例如,如果一些 brandid 是四位数字,而其他品牌有五位数字,则必须向四位数字添加左填充。例如。 7878 => 07878
并且在这种情况下我们使用冒号来分隔这些列,所以这些列不能有冒号。
更详细"How to"可以参考我最开始提到的那篇文章
RedisLabs 现在提供 RedisTimeSeries,其中有一些有趣的功能。
对于您的用例,我们有标签,您稍后可以根据这些标签进行过滤,以便从相关时间序列中检索数据。
它还支持多种聚合
我有兴趣在 Redis 上构建时间序列应用程序。我的数据有时会在历史上到达,因此数据是可变的。我目前有大约 1 亿个事件。
我正在考虑的数据访问需要灵活,因此按重要性排序
键入 [销售佣金印象] 日期类型 [最小时日] 客户编号 布兰迪 产品类型id productid
我想问的是销售、佣金、印象等什么类型的数据。 然后是聚合类型 second, min, hour, day 我有事件数据的层次结构,因此按客户、品牌、产品类型和每个特定产品分类。
有没有办法像这样构建密钥:
sale:hour:clientid:brandid:producttypeid:productid
然后查询该键的一部分,例如
销售:小时:clientid:brandid
或者我是否需要为每个
构建存储桶- 销售:小时
- 销售:小时:clientid
- 销售:小时:clientid:brandid
- 销售:小时:clientid:brandid:producttypeid
- sale:hour:clientid:brandid:producttypeid:productid
我认为 couchbase - 及其视图(索引)对于您的用例来说是一个更好的无 sql 选择。您可以将每个项目存储为单个条目,然后根据需要使用视图对其进行切片。但是,它最终只会在视图上持久存在(因此数据可能有点陈旧 - seconds/up 到一分钟左右)。如果您能忍受这一点,那么这对您来说是一个更好的工具。它也是持久的,这对于redis来说更难获得。
你可以使用redis sortedset。 查看此部分 article 中的词典索引。
您知道何时要向 SortedSet 添加元素,使用 ZADD
命令。像这样:
ZADD key score member
但是在你的例子中,所有的列都是字符串,分数必须是小数,所以在这里是没有用的。我们将始终将分数设置为 0 以保持它对具有相同分数的 us.Because 没有影响,sorted set 将按照其成员的字典顺序对元素进行排序。
然后我们像关系数据库一样创建一个带有排序集的复合索引。像这样:
ZADD myset 0 sale:hour:clientid:brandid:producttypeid:productid:real_value
如果您想使用 sale:hour 进行查询,您可以这样做:(假设销售是六个字符的唯一 ID,小时是 YYYY-MM-ddThh 的日期时间格式,并且您想要查询销售的东西是 FG63dF,时间是 2017-08-28T08)
ZRANGEBYLEX myset [FG63dF:2017-08-28T08 (FG63dF:2017-08-28T09
这将 return 这一小时的数据具有相同的销售 ID。其他查询同上。关于 ( 和 [ 的含义,分别表示范围项是独占还是包含。
如果你想查询一个包含所有列的数据,像这样:
ZRANGEBYLEX myset [FG63dF:2017-08-28T08:<client-id>:<brand-id>:<producttypeid>:<product-id> +
'+'就像无限大的值,你也可以指定你的极限。 详情请参考ZRANGEBYLEX
注意事项:您要在复合索引(如销售、小时等)中使用的所有列必须具有相同的格式和相同的填充。例如,如果一些 brandid 是四位数字,而其他品牌有五位数字,则必须向四位数字添加左填充。例如。 7878 => 07878
并且在这种情况下我们使用冒号来分隔这些列,所以这些列不能有冒号。
更详细"How to"可以参考我最开始提到的那篇文章
RedisLabs 现在提供 RedisTimeSeries,其中有一些有趣的功能。 对于您的用例,我们有标签,您稍后可以根据这些标签进行过滤,以便从相关时间序列中检索数据。 它还支持多种聚合