recherche

Maison  >  Questions et réponses  >  le corps du texte

redis可以对key排序吗

hset user:1 score 100

hset user:2 socre 101

hset user:3 score 200

hset user:4 score 201

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

高洛峰高洛峰2763 Il y a quelques jours849

répondre à tous(4)je répondrai

  • 天蓬老师

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

    hset ne peut pas être trié directement. Il existe une alternative pour obtenir l’équivalent du tri hset, qui consiste à utiliser la fonction sort. Sort ne peut généralement trier que des listes, des ensembles et des zsets, mais il peut être modifié. Le tri est utilisé comme suit :
    Touche SORT [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]

    Faites attention à ses paramètres de stockage et de stockage. by est utilisé pour déterminer sur quel champ trier, et le magasin peut enregistrer les résultats du tri dans une liste. Vous pouvez d'abord enregistrer toutes les clés de hachage dans un ensemble, par exemple, le nom de clé de cet ensemble est myhashes, puis trier en fonction du champ de score de chaque élément de l'ensemble (c'est-à-dire chaque hachage), et enfin enregistrer les résultats du tri. dans Dans la liste avec le nom de clé myresult. Le résultat du tri ici est bien sûr les noms de clé de tous les éléments de l'ensemble (c'est-à-dire toutes les clés de hachage). Vous pouvez obtenir les noms de clé de tous les éléments de l'ensemble en ajoutant # au paramètre GET. :
    TRIER mes hachages PAR *->score GET # STORE myresult

    SORT remplacera le * dans le paramètre BY par chaque valeur de myhashes (c'est-à-dire le nom de chaque clé de hachage), et obtiendra sa valeur en fonction des champs donnés après ->, et enfin comparera les champs de myhashes en fonction de ces valeurs de champ. Chaque valeur est triée. De cette façon, myresult contient des noms de clés de hachage qui ont été triés en fonction du score.

    Enfin, je pense qu'il y a quelque chose qui ne va pas avec votre conception de hachage. Le hachage ressemble plus à une ligne dans une base de données SQL, avec plusieurs champs, et chaque champ a une valeur correspondante. Si vous n'avez qu'un champ de score, pensez à utiliser zset.

    répondre
    0
  • 黄舟

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

    HashSetNe peut pas être organisé directement. Vous devez conserver un SortedSet distinct, qui stocke uniquement l'ID utilisateur et les scores correspondants.

    répondre
    0
  • PHPz

    PHPz2017-04-22 09:01:10

    Je ne sais pas si c'est ce que ça veut dire
    Téléchargez simplement le code

    $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" } 
    

    Documentation
    http://redis.cn/commands/sort.html

    répondre
    0
  • 黄舟

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

    Le hachage ne peut pas être trié.

    Si vous avez besoin de trier, veuillez utiliser l'opération ZSET, ZADD SCORES MEMBERS

    L'idée est :

    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 encore une fois, si votre HASH est uniquement utilisé pour stocker une clé de hachage, SCORES n'est pas recommandé de le stocker de cette façon..

    répondre
    0
  • Annulerrépondre