suchen

Heim  >  Fragen und Antworten  >  Hauptteil

redis可以对key排序吗

hset user:1 score 100

hset user:2 socre 101

hset user:3 score 200

hset user:4 score 201

要找出socre最高的user,应该如何设计。

高洛峰高洛峰2799 Tage vor878

Antworte allen(4)Ich werde antworten

  • 天蓬老师

    天蓬老师2017-04-22 09:01:10

    hset是不能直接排序的。有替代方案可以实现相当于hset排序的效果,即利用sort功能。sort一般只能对list,set和zset排序,不过可以变通一下。sort的使用方式如下:
    SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]

    注意它的by和store两个参数。by用于确定按照什么字段进行排序,store则能够把排序结果存到一个list中。你可以先把所有的hash键存到一个set中,比如说,这个set的键名为myhashes,然后按照set中每个元素(即每个hash)的score域进行排序,最后把排序结果存到键名为myresult的list中。这里的排序结果当然就是set中所有元素(即所有hash键)的键名了,用GET参数加#就能得到set中所有元素的键名,写出来就是这样:
    SORT myhashes BY *->score GET # STORE myresult

    SORT会用myhashes中的每个值(即每个hash键名)替换BY参数中的*,并根据->后面给出的字段获取其值,最后根据这些字段值对myhashes中的每个值进行排序。这样,myresult中就是已经按照score排好序的hash键名了。

    最后,我看你的hash设计有点问题。hash比较像sql数据库的一行,有多个域,每个域有相应的值。如果你只是一个score域,可以考虑用zset。

    Antwort
    0
  • 黄舟

    黄舟2017-04-22 09:01:10

    HashSet没法直接排。得单独维护一个SortedSet,里面只保存用户ID和对应的分数。

    Antwort
    0
  • PHPz

    PHPz2017-04-22 09:01:10

    不知道是不是这个意思
    直接上代码了

    $redis->del("user_id");
    $redis->hmSet("user_1",array("score"=>5,"id"=>1));
    $redis->hmSet("user_2",array("score"=>3,"id"=>2));
    $redis->hmSet("user_3",array("score"=>1,"id"=>3));
    $redis->hmSet("user_4",array("score"=>2,"id"=>4));
    $redis->hmSet("user_5",array("score"=>4,"id"=>5));
    $redis->lPush("user_id",1,2,3,4,5);
    $sortList = $redis->sort("user_id",array(
        'by' => "user_*->score",
        'alpha' => TRUE,
        'get' => array(
            "user_*->id"
        )
    ));
    var_dump($sortList);
    array(5) { [0]=> string(1) "3" [1]=> string(1) "4" [2]=> string(1) "2" [3]=> string(1) "5" [4]=> string(1) "1" } 
    

    文档
    http://redis.cn/commands/sort.html

    Antwort
    0
  • 黄舟

    黄舟2017-04-22 09:01:10

    Hash 没办法进行排序.

    如果需要排序, 请使用ZSET操作, ZADD SCORES MEMBERS

    思路为:

    PHP$uid = $redis->ZREVRANGE("u:scores", 0, 0, WITHSCORES);  //PHP-REDIS原生语法貌似这样: ZREVRANGE("u:scores", 0, 0, TRUE);
    
    //$uid is AN ARRAY
    
    $max_uid = array_keys_array($uid)[0]; //这个max uid 就是你要找到scores最大的UID了.
    

    再再PS 一下, 如果你的 HASH 只用于存储 一个hashkey SCORES 不推荐这样存..

    Antwort
    0
  • StornierenAntwort