【问题标题】:how to get data based on date range in redis如何根据redis中的日期范围获取数据
【发布时间】:2017-07-27 16:41:08
【问题描述】:

我在mysql中有一个日志数据

id |   value | date
1  |   10.2  | 2017-07-20 18:00:00
2  |   10.5  | 2017-07-20 18:00:01
3  |   10.3  | 2017-07-20 18:00:03

然后将其转换为 redis 中的 hash dan sorted set。 这是我的哈希:

hmset mylog:1 id 1 value 10.2 date 1388534400 
hmset mylog:2 id 2 value 10.5 date 1388534401
hmset mylog:3 id 3 value 10.3 date 1388534402

和排序集:

zadd log_date 1388534400 1
zadd log_date 1388534401 2
zadd log_date 1388534402 3

我想像WHERE date beetween .... and ....一样进行查询

是否有任何可能的方法可以根据排序集中的日期范围从哈希中获取数据?

谢谢!

【问题讨论】:

    标签: hash redis sortedset zset


    【解决方案1】:

    有两种可能的方法。

    1. 将数据保存在哈希中,日期作为排序集中的 unix 时间戳,并使用 ZRANGE 查询排序集以获取 id,然后使用这些 id 查询哈希

    2. 如果您的 MySQL 行数据很简单,即具有原始值的 2-3 列,我会推荐另一种方法,将数据本身作为键存储在排序集中,日期为分数。

    zadd log_date 1388534400 1_10.2

    元素在拆分键时的位置是固定的,因此 [0] 索引将为您提供id,1 索引将为您提供value。 这样,您的所有数据都将位于排序集中,您可以使用 ZRANGE(带有 WITHSCORE 标志)查询数据,以获取所有数据以及提供的 unix 时间戳日期内的日期。这种方法是内存效率高的,并且还使您免于数据链接到两个点的问题,您必须在排序集中添加或删除数据以及散列。这里只需要排序集。

    【讨论】:

    • 我知道这是一个完全不同的问题,但就性能而言,这比查询数据库好吗?当您有数千条记录时会发生什么?
    【解决方案2】:

    为此,首先对 Sorted Set 执行查询以获取日期范围内的成员,然后获取相关的 Hash。

    【讨论】:

    • 这个答案当然可以更完整,但它不值得一票否决,因为它是绝对正确的。
    • @Madbreaks 说客气话
    • 在存储在属性中的 unix 时间戳的两端使用 AND 过滤器的哈希属性上的直接 redis 搜索查询怎么样?
    猜你喜欢
    • 1970-01-01
    • 2023-01-12
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    相关资源
    最近更新 更多