Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Redis:menyebarkan umpan berita dalam daftar atau kumpulan yang diurutkan?

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"



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Pengantar Redis

  2. Mengubah database MySQL sederhana menjadi solusi NoSQL

  3. Menggunakan Seledri untuk Realtime, Permintaan API Eksternal Sinkron dengan Gevent

  4. Apakah Redis menggunakan nama pengguna untuk otentikasi?

  5. Menggunakan nginx untuk menyajikan konten langsung dari cache redis