redis可以對key排序嗎
高洛峰
高洛峰 2017-04-22 08:59:10
0
4
861

hset user:1 score 100

hset user:2 socre 101

hset user:3 score 200

hset user:4 score 201

要找出socre最高的user,應該如何設計。

高洛峰
高洛峰

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

全部回覆(4)
Peter_Zhu

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。

黄舟

HashSet没法直接排。得单独维护一个SortedSet,裡面只保存使用者ID和對應的分數。

PHPzhong

不知道是不是這個意思
直接上程式碼了

$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

黄舟

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 不建議這樣存..

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板