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

hset user:1 score 100

hset user:2 socre 101

hset user:3 score 200

hset user:4 score 201

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

高洛峰
高洛峰

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

membalas semua(4)
Peter_Zhu

hset tidak boleh diisih terus. Terdapat alternatif untuk mencapai persamaan pengisihan hset, iaitu menggunakan fungsi isihan. Isih secara amnya hanya boleh mengisih senarai, set dan zset, tetapi ia boleh diubah suai. Isih digunakan seperti berikut:
Kunci ISTIH [MENIKUT corak] [HAD kiraan mengimbangi] [DAPATKAN corak [DAPATKAN corak ...]] [ASC | DESC] [ALPHA] [Destinasi KEDAI]

Beri perhatian kepada parameter oleh dan simpannya. by digunakan untuk menentukan medan yang hendak diisih dan menyimpan boleh menyimpan hasil pengisihan ke dalam senarai. Mula-mula anda boleh menyimpan semua kunci cincang ke dalam set, contohnya, nama kunci set ini ialah myhashes, kemudian isi mengikut medan skor setiap elemen dalam set (iaitu, setiap cincang), dan akhirnya simpan hasil pengisihan dalam Dalam senarai dengan nama kunci myresult. Hasil pengisihan di sini sudah tentu nama kunci semua elemen dalam set (iaitu, semua kunci cincang Anda boleh mendapatkan nama kunci semua elemen dalam set dengan menambah # pada parameter GET :
ISIKAN myhashes OLEH *->skor DAPATKAN # KEDAI myhasil

SORT akan menggantikan * dalam parameter BY dengan setiap nilai dalam myhashes (iaitu, setiap nama kunci hash), dan mendapatkan nilainya berdasarkan medan yang diberikan selepas ->, dan akhirnya membandingkan medan dalam myhashes berdasarkan nilai medan ini. Setiap nilai diisih. Dengan cara ini, myresult mengandungi nama kunci cincang yang telah diisih mengikut skor.

Akhir sekali, saya rasa ada yang tidak kena dengan reka bentuk cincang anda. Hash lebih seperti baris dalam pangkalan data SQL, dengan berbilang medan, dan setiap medan mempunyai nilai yang sepadan. Jika anda hanya mempunyai medan skor, pertimbangkan untuk menggunakan zset.

黄舟

HashSetTak boleh susun langsung. Anda perlu mengekalkan SortedSet yang berasingan, yang hanya menyimpan ID pengguna dan skor yang sepadan.

PHPzhong

Saya tidak tahu sama ada itu maksudnya
Muat naik sahaja kod

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

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

黄舟

Hash tidak boleh diisih.

Jika anda perlu mengisih, sila gunakan operasi ZSET, ZADD SCORE MEMBERS

Ideanya ialah:

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 sekali lagi, jika HASH anda hanya digunakan untuk menyimpan HASHkey SKOR tidak disyorkan untuk menyimpannya dengan cara ini..

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan