Kasus penggunaan yang Anda gambarkan tidak dapat dimodelkan secara elegan dalam solusi NoSQL. Ini bukan batasan Redis.
Mari saya jelaskan itu sedikit lagi. Anda menjalankan kueri rentang di satu bidang, dan mengurutkan di bidang lain. Ini bukan sesuatu yang bisa dilakukan oleh solusi NoSQL. Misalnya, Google App Engine melarang kueri semacam itu. Lihat Pembatasan Kueri GAE dan baca bagian "Properti dalam Filter Ketidaksetaraan Harus Diurutkan sebelum Urutan Pengurutan Lainnya"
Untuk mendapatkan semua hasil yang cocok dengan filter ketidaksetaraan, kueri memindai tabel indeks untuk baris pertama yang cocok, lalu mengembalikan semua hasil yang berurutan hingga menemukan baris yang tidak cocok. Agar baris berturut-turut mewakili rangkaian hasil yang lengkap, baris harus diurutkan oleh filter ketidaksetaraan sebelum urutan pengurutan lainnya.
Karena itu, Anda masih dapat menjalankan kueri secara efisien, tetapi solusinya tidak akan menjadi elegan.
- Buat rentang gaji - 0-5000, 5000-10000, 10.000-15000, dan seterusnya
- Buat set seperti
users_with_salary:10000-15000
. Set ini akan berisi id pengguna yang memiliki gaji dalam kisaran tertentu. - Demikian pula, buat kumpulan seperti `users_with_rating:1-2". Kumpulan ini akan berisi ID pengguna yang memiliki peringkat dalam rentang yang diberikan
- Sekarang, jalankan kode semu berikut
String userids[];
for(rating = 10; rating > 0; rating--) {
for(salary = min_salary; salary < max_salary; salary += 5000) {
String salary_key = "users_with_salary:" + salary + "-" + (salary+5000);
String rating_key = "users_with_rating:" + rating + "-" + (rating+1);
userids.append(redis.sinter(salary_key, rating_key));
if(userids.length > 10) {
break;
}
}
}
Dengan skrip redis 2.6 dan lua, Anda bahkan dapat menjalankan ini di server lua.
Kesimpulannya, jika Anda ingin menjalankan kueri kompleks pada data Anda, yang terbaik adalah memodelkannya dalam database relasional.