Rumah > Soal Jawab > teks badan
hset user:1 score 100
hset user:2 socre 101
hset user:3 score 200
hset user:4 score 201
要找出socre最高的user,应该如何设计。
天蓬老师2017-04-22 09:01:10
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.
黄舟2017-04-22 09:01:10
HashSet
Tak boleh susun langsung. Anda perlu mengekalkan SortedSet
yang berasingan, yang hanya menyimpan ID pengguna dan skor yang sepadan.
PHPz2017-04-22 09:01:10
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
黄舟2017-04-22 09:01:10
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..