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

Pencari kecocokan multi-parameter dengan Redis

Apa yang Anda coba lakukan di sini adalah indeks terbalik.

Untuk setiap kolom, buat petanya ke "set". Kemudian, Anda dapat memotong set untuk mendapatkan hasilnya.

Jadi, APPLE: RED ROUND FRUIT akan memetakan ke sisipan berikut:

SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE

Lalu, misalkan saya ingin menanyakan * ROUND FRUIT , saya akan melakukan:

SINTER p2:ROUND p3:FRUIT

Perintah ini mengambil persimpangan item di p2:ROUND set dan p3:FRUIT mengatur. Ini akan mengembalikan semua item yang ROUND dan FRUIT , tidak peduli apa p1 adalah.

Beberapa contoh lain:

SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN

Jawaban saya di atas akan menggunakan beberapa kekuatan komputasi karena operasi persimpangan adalah O(N*M) . Berikut adalah cara melakukannya yang lebih intensif memori, tetapi akan memiliki pengambilan lebih cepat karena secara efektif menghitung indeks sebelumnya.

Untuk setiap kombinasi properti, buat kunci yang menyimpan satu set:

Jadi, APPLE: RED ROUND FRUIT akan memetakan ke sisipan berikut:

SADD RED:ROUND:FRUIT APPLE
SADD :ROUND:FRUIT APPLE
SADD RED::FRUIT APPLE
SADD RED:ROUND: APPLE
SADD RED:: APPLE
SADD :ROUND: APPLE
SADD ::FRUIT APPLE
SADD ::: APPLE

Kemudian, untuk query, Anda cukup mengakses kunci masing-masing. Misalnya, * ROUND FRUIT hanya akan menjadi

SMEMBERS :ROUND:FRUIT

Jelas, ini tidak berskala sama sekali dalam hal memori ketika Anda memiliki banyak dimensi, tetapi akan sangat cepat untuk mengambil hasil.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Gunakan Redis untuk menghasilkan ID unik dari jangkauan terbatas

  2. bagaimana saya bisa membuat sesi bekerja menggunakan redis, express &socket.io?

  3. Pola Desain JavaScript -- Menghadapi Asinkron yang Tidak Diinginkan

  4. Redis::CommandError:ERR Client mengirim AUTH, tetapi tidak ada kata sandi yang disetel

  5. Laravel Socket.io Terhubung tetapi tidak menerima data