2016-03-21 20 views
2

"timeitems", yani start - ("t_start") ve bitiş zamanı ("t_end") olan nesneleri önbelleğe almak istediğim bir projede Redis kullanıyorum.Sınırsız çok boyutlu dizin Redis kullanarak

Ben hiçbir şekilde zaman penceresi çakışıyor tüm timeitems bulmak da bir, başlatma ("w_start") ve endTime ("w_end) sahip bir zaman penceresi. İstediğim kullanarak önbellek sorgulamak istiyorum.

zaten başarıyla bu puanı = t_start + (t_end kullanarak (puanlarıyla belirlenen dizilmistir kullanarak uygulamıştır - t_start) ama bu sadece timeitem merkez süresi penceresi içinde nerede bana vurur verir

örtüşme. kodda sorgulama basittir:

bool overlap = t_start < w_end && w_start < t_end 

Şimdi, çok boyutlu indeksler hakkındaki belgeleri okudum: http://redis.io/topics/indexes#multi-dimensional-indexes

Ama bugün daha iyi bir bölüm için kafamı çarptıktan sonra bu senaryoda işe yaramayacağını düşünüyorum çünkü sorun sınırsız (?). Yani, zaman penceresinden önce başlayan ve biten bir zaman öğesinden bir çakışma algılaması gerekir.

Herkes benzer bir doğrusallaştırma sorunu üzerinde çalıştıysa, bunu duymak isterim.

cevap

0

Yeniden boyutlandırma, n boyutlu veri noktalarının indekslenmesi/sorgulanması için tasarlanmıştır. Durumunuzda kullanmak için, t_start ilk boyut ve ikinci boyutu t_end olacaktır. Not 1

inf w_start ile + arasında

  1. t_start t_end 0 ile w_end
  2. : her boyut için senin sorgunun aralıkları olmalıdır 0 yerine ve + aslında takip edebilirsiniz inf dak (t_start) ve max (t_end)

    Not 2: + inf sıralama f ayarlar Eğer iki kullanabilirsiniz, bunun yerine o redimensioning arasında, Alternatif bazen

    2038 olmalıdır veya timeitems - t_start ve t_end için bir tane. İki ZRANGEBYSCORE işleminden (her sette bir tane) gelen kesişim, pencerenin üst üste binen zaman çizelgelerini verir.

+0

Cevabınız için teşekkür ederiz. Evet, bunlar gerçekten aralıklardır, ancak sıralanmış kümedeki az çok TÜM zaman çizelgelerinin (Redis dışında filtrelenecek şekilde) alınacağını hissediyorum. Özellikle ikinci yöntem kullanılarak (iki sıralı set). Soru, "redimensioning" ve kesişimin redis.io üzerinde açıklanan tekniği kullanarak redis sunucusunun içinde yapılabilmesi mi? –

+0

Evet - Lua komut dosyalarını kullanın. Redimension için limamı kullanabilirsiniz: https://www.reddit.com/r/redis/comments/3s0h73/luaredimension_redis_multidimensional_query/ –

+1

Tamam, kesinlikle Lua'yı denemek için zaman bulmaya çalışacağım. Bir matematiksel bakış açısından (ve StackExchange.Redis'i kullanarak uygulamaya başladıktan sonra) şüphelerim var, çünkü örnekler çok boyutlu bir noktanın belirli bir aralıkta (aynı boyutta) bulunup bulunmadığını bulmaya çalışırken, bu senaryo bir dizi kavrayışın bulunup bulunmadığının anlaşılmasıyla ilgilidir. başka bir aralıkla. Sana geri dönmeme izin ver .. –