2011-10-31 37 views
5

Ben şöyle bazı bilgileri saklamak istiyorum (not, ben bu veri yapısına evli değilim, ama bu size gösterir yatan bilgi Ben saklamak istediğiniz): BunlardaDeğere göre basit arama?

{ user_id: 12345, page_id: 2, country: 'DE' } 

kayıtları, user_id benzersiz bir alan, ancak page_id değil.

Bir Redis veri yapısı içine bu çevirmek istiyorum, ben şöyle verimli aramalar çalıştırmak mümkün istiyorum:, user_id 12345 İçin

  • ilgili ülke bulmak.
  • page_id 2 için ilgili tüm user_ids ve ülkelerini bulun.

Bunu aslında Redis'te yapmak mümkün mü? Eğer öyleyse, hangi veri yapılarını kullanmalıyım ve bunları eklediğimde kayıtları çoğaltma olasılığını nasıl önleyebilirim?

cevap

4

İki anahtar türüne ihtiyacınız var gibi geliyor: Bir HASH anahtarı Kullanıcı verilerinizi ve ilgili kullanıcıların listesini içeren her sayfa için bir LIST saklamak. Aşağıda bunun nasıl çalışabileceğine dair bir örnek verilmiştir.

Yük veri:

> RPUSH page:2:users 12345 
> HMSET user:12345 country DE key2 value2 

çekin veri: Sayfasından

# All users for page 2 
> LRANGE page:2:users 0 -1 

# All users for page 2 and their countries 
> SORT page:2:users By nosort GET # GET user:*->country GET user:*->key2 

Kaldır Kullanıcı:

> LREM page:2:users 0 12345 

tekrarlayın kullanıcı için ek değerleri almak için SIRALAMA içinde GETler.

Umarım bu yardımcı olur, açıklığa kavuşturmak istediğiniz bir şey varsa veya daha fazla yardıma ihtiyacınız varsa bildirin. Ayrıca, özellikle SORT işlemi ile ilgili redis web site adresinde bulunan komut listesini ve dökümantasyonu okumanızı tavsiye ederim.

+0

Teşekkürler - aslında bir HASH ve bir SET kullanarak sona erdi LİSTESİ - ama iyi cevap! – Richard

1

Kullanıcı_kimliği benzersiz olduğu ve ülke olduğu için, bunları basit bir anahtar/değer çiftinde saklayın. Bir kullanıcı için sorgulama O (1) böyle bir durumda ... Daha sonra, bazı_isim_, page_id ve üyeler tüm kullanıcı_kullanıcıları ile saklayın ..

+0

Teşekkürler. Bu konudaki kaygım şu: eğer yeni bir kullanıcıyı anahtar-değerine eklerseniz, o zaman * önceden * set girişini ekleyebilirseniz, veritabanı azalır? Geri geldiğinde, kötü girilmiş bilgi parçalarıyla kalacaksınız. – Richard

+1

Böyle bir durumda, iki seçeneğiniz vardır: ya müşteri kodunuzda bir çeşit durumu koruyun, başka bir deyişle, her işlemden sonra geri dönüşün döndüğü sonucu inceleyin ve hata durumunda buna göre davranın ya da http: // redis komutunu kullanın. io/# işlemleri komutları; – hymloth

+1

Bence [Pipelining] (http://redis.io/topics/pipelining) iyi bir seçimdir –

İlgili konular