redis可以对key排序吗
高洛峰
高洛峰 2017-04-22 08:59:10
0
4
882

hset user:1 score 100

hset user:2 socre 101

hset user:3 score 200

hset user:4 score 201

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(4)
Peter_Zhu

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.

黄舟

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

PHPzhong

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

黄舟

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..

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal