Ya, set yang diurutkan sangat cepat dan kuat. Mereka tampaknya jauh lebih cocok untuk kebutuhan Anda daripada SORT
operasi. Kompleksitas waktu sering disalahpahami. O(log(N)) sangat cepat, dan skalanya bagus. Kami menggunakannya untuk puluhan juta anggota dalam satu set yang diurutkan. Pengambilan dan penyisipan adalah sub-milidetik.
Gunakan ZRANGEBYSCORE key min max WITHSCORES [LIMIT offset count]
untuk mendapatkan hasil Anda.
Bergantung pada cara Anda menyimpan stempel waktu sebagai 'skor', ZREVRANGEBYSCORE mungkin lebih baik.
Komentar kecil tentang stempel waktu:Kumpulan SCORES
yang diurutkan yang tidak memerlukan bagian desimal harus menggunakan 15 digit atau kurang. Jadi SCORE
harus tetap dalam kisaran -999999999999999 hingga 999999999999999. Catatan:Batasan ini ada karena server Redis sebenarnya menyimpan skor (mengambang) sebagai representasi string redis secara internal.
Karena itu saya merekomendasikan format ini, dikonversi ke Waktu Zulu:-20140313122802 untuk presisi kedua. Anda dapat menambahkan 1 digit untuk presisi 100 md, tetapi tidak lebih dari jika Anda tidak ingin kehilangan presisi. Omong-omong, ini masih float64, jadi kehilangan presisi bisa jadi baik-baik saja dalam beberapa skenario, tetapi casing Anda cocok dengan kisaran 'presisi sempurna', jadi itulah yang saya sarankan.
Jika data Anda kedaluwarsa dalam 10 tahun, Anda juga dapat melewati tiga digit pertama (CCY dari CCYY), untuk mencapai presisi .0001 detik.
Saya menyarankan skor negatif di sini, sehingga Anda dapat menggunakan ZRANGEBYSCORE
yang lebih sederhana bukannya REV
satu. Anda dapat menggunakan -inf
sebagai skor awal (minus tak terhingga) dan LIMIT 0 100
untuk mendapatkan 100 hasil teratas.
Dua set members
yang diurutkan (atau 'keys'
tapi itu ambigu karena set yang diurutkan juga merupakan kunci itu sendiri) dapat berbagi score
, tidak masalah, hasilnya dalam score
yang identik adalah abjad.
Semoga membantu, TW
Edit setelah mengobrol
OP ingin mengumpulkan data (menggunakan ZSET
) dari kunci yang berbeda (GET
/SET
atau HGET
/HSET
kunci). JOIN
dapat melakukannya untuk Anda, ZRANGEBYSCORE
tidak bisa. Cara yang lebih disukai untuk melakukan ini, adalah skrip Lua sederhana. Script Lua dieksekusi di server. Pada contoh di bawah ini saya menggunakan EVAL
untuk kesederhanaan, dalam produksi Anda akan menggunakan SCRIPT EXISTS
, SCRIPT LOAD
dan EVALSHA
. Sebagian besar pustaka klien memiliki beberapa logika pembukuan bawaan, jadi Anda tidak mengunggah skrip setiap kali.
Berikut adalah example.lua
:
local r={}
local zkey=KEYS[1]
local a=redis.call('zrangebyscore', zkey, KEYS[2], KEYS[3], 'withscores', 'limit', 0, KEYS[4])
for i=1,#a,2 do
r[i]=a[i+1]
r[i+1]=redis.call('get', a[i])
end
return r
Anda menggunakannya seperti ini (contoh mentah, tidak dikodekan untuk kinerja) :
redis-cli -p 14322 set activity:1 act1JSON
redis-cli -p 14322 set activity:2 act2JSON
redis-cli -p 14322 zadd feed 1 activity:1
redis-cli -p 14322 zadd feed 2 activity:2
redis-cli -p 14322 eval '$(cat example.lua)' 4 feed '-inf' '+inf' 100
Hasil:
1) "1"
2) "act1JSON"
3) "2"
4) "act2JSON"