代码之家  ›  专栏  ›  技术社区  ›  Mormoran

Python redis:按每个列表中的第一个元素对包含JSON列表的列表进行排序

  •  0
  • Mormoran  · 技术社区  · 5 年前

    我正在想办法对redis列表进行排序。此列表包含[X,Y]值的列表。我想按X升序排序。

    我的一个问题是,如果元素首先是字符串,我只能弄清楚如何添加到redis列表中,所以我 json.dumps() 在将每个列表添加到redis之前:

    for i in some_loop:
        redis_json_str = json.dumps(
            [
                unix_time_millis(time), # <--- Need to sort on this, ascending
                str(algorithm_value)
            ]
        )
    
        # Then I add it to redis (and trim it after to only keep the 50th "freshest" values)
    
        rds.rpush("alg-" + str(algorithm_parameter.id), redis_json_str)
        rds.ltrim("alg-" + str(algorithm_parameter.id), -50, -1)
    

    价值观 redis_json_str[0] 是从纪元开始的MS时间值。它们旨在用于基于时间的图形。

    当我从redis检索列表时,我需要排序。我试图首先在redis中找到一种方法来执行此操作,但如果这是不可能的,我可以在检索后尝试在python中执行。

    我在另一个视图中检索列表,如下所示:

    result_values = rds.lrange("algo-" + str(param_id), 0, -1)
    

    我在用 RPUSH 将插入项放入列表中,然后 LRANGE 在网站的其他地方检索它。

    这是检索时的输出示例:

    (我添加了'x'和'y',以便更容易阅读示例,我还修剪了一些'x'值,因为epoch中的MS是一个很大的数字)

    'x': 940880.7622, 'y': '0.5685352436168158'
    'x': 935089.762, 'y': '0.5685352436168158'
    'x': 935661.762, 'y': '0.5685352436168158'
    'x': 938553.762, 'y': '0.21320071635628374'
    'x': 937978.762, 'y': '0.9949366763293833'
    'x': 940309.762, 'y': '0.9949366763293833'
    'x': 939138.762, 'y': '0.9949366763293833'
    'x': 939716.762, 'y': '0.21320071635628374'
    'x': 936235.762, 'y': '0.5685352436168158'
    'x': 955547.3489, 'y': '0.21320071635628374'
    'x': 955547.3489, 'y': '0.21320071635628374'
    'x': 956696.3489, 'y': '0.21320071635628374'
    'x': 955547.3489, 'y': '0.21320071635628374'
    'x': 956123.3489, 'y': '0.5685352436168158'
    'x': 957268.3489, 'y': '0.9949366763293833'
    'x': 957268.3489, 'y': '0.9949366763293833'
    'x': 958415.349, 'y': '0.9949366763293833'
    'x': 955547.3489, 'y': '0.21320071635628374'
    'x': 956696.3489, 'y': '0.21320071635628374'
    'x': 957841.3489, 'y': '0.21320071635628374'
    'x': 956123.3489, 'y': '0.5685352436168158'
    

    如您所见,整个列表中的“x”值顺序错误。理想情况下,列表检索应该按每个列表的第一个元素的升序返回列表列表。

    我刚开始使用redis(我们以前使用DB调用,但我们需要它更快,所以我们跳过了这个非常时间敏感的图的磁盘操作),我正在研究 Redis SORT ,但我不确定这是否是我的用例,而且我还没能让它工作。

    0 回复  |  直到 5 年前