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

hset user:1 score 100

hset user:2 socre 101

hset user:3 score 200

hset user:4 score 201

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

高洛峰
高洛峰

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

reply all(4)
Peter_Zhu

hset cannot be sorted directly. There is an alternative to achieve the equivalent of hset sorting, which is to use the sort function. Sort can generally only sort lists, sets and zsets, but it can be modified. The usage of sort is as follows:
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]

Pay attention to its by and store parameters. by is used to determine which field to sort by, and store can save the sorting results into a list. You can first save all hash keys into a set, for example, the key name of this set is myhashes, then sort according to the score field of each element in the set (that is, each hash), and finally save the sorting results in In the list with the key name myresult. The sorting result here is of course the key names of all elements in the set (that is, all hash keys). You can get the key names of all elements in the set by adding # to the GET parameter. It is written like this:
SORT myhashes BY *->score GET # STORE myresult

SORT will replace the * in the BY parameter with each value in myhashes (that is, each hash key name), and obtain its value based on the fields given after ->, and finally compare each value in myhashes based on these field values. Values ​​are sorted. In this way, myresult contains hash key names that have been sorted according to score.

Finally, I think there is something wrong with your hash design. Hash is more like a row in a SQL database, with multiple fields, and each field has a corresponding value. If you only have a score field, consider using zset.

黄舟

HashSet没法直接排。得单独维护一个SortedSet, only the user ID and corresponding score are stored in it.

PHPzhong

I don’t know if that’s what it means
Just upload the 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" } 

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

黄舟

Hash cannot be sorted.

If you need to sort, please use ZSET operation, ZADD SCORES MEMBERS

The idea is:

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 it again, if your HASH is only used to store a hashkey SCORES is not recommended to save like this..

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template