cari

Rumah  >  Soal Jawab  >  teks badan

redis可以对key排序吗

hset user:1 score 100

hset user:2 socre 101

hset user:3 score 200

hset user:4 score 201

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

高洛峰高洛峰2798 hari yang lalu870

membalas semua(4)saya akan balas

  • 天蓬老师

    天蓬老师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.

    balas
    0
  • 黄舟

    黄舟2017-04-22 09:01:10

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

    balas
    0
  • PHPz

    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

    balas
    0
  • 黄舟

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

    balas
    0
  • Batalbalas