Redis için kullanılan temel veri yapıları nelerdir?


305

Kesin bir listede iki soruya cevap vermeye çalışıyorum:

  1. Redis için kullanılan temel veri yapıları nelerdir?
  2. Ve her tip için ana avantajlar / dezavantajlar / kullanım durumları nelerdir?

Bu yüzden, Redis listelerinin aslında bağlantılı listelerle uygulandığını okudum. Ancak diğer türler için herhangi bir bilgi açamıyorum. Ayrıca, birisi bu soruya rastlarsa ve farklı veri yapılarını değiştirmenin veya bunlara erişmenin artı ve eksilerinin yüksek bir özetine sahip olmasaydı, referans vermek için belirli türlerin en iyi ne zaman kullanılacağına dair tam bir listeye sahip olacaklardı .

Özellikle, tüm türleri özetlemek istiyorum: string, list, set, zset ve hash.

Oh, şu ana kadar bu makaleye baktım:


7
Trivia bir sunucu nasıl kullanılır? Bir programlama yapısının diğeri üzerinde ne zaman kullanılacağını nasıl belirlerim? Bu, farklı kullanımlar için farklı türleri kullanacağım için doğrudan programlama için geçerlidir.
Homer6

2
Bir sunucunun nasıl kullanılacağı önemsiz değildir, ancak konu dışıdır - ve sorduğunuz şey bu değildir. Belirli amaçlar için hangi veri yapılarının kullanılacağı topikal olacaktır, ancak sorduğunuz da bu değildir. Redis'te kullanılan şey , önemsiz şeydir, belirli bir durumda neden belirli bir yapı kullandıklarına dair ek bir akıl yürütme yoktur - bu noktada, zaten söylediğim şeye geri döneceğiz ve Redis'in yapacağı şey şudur: ilgisiz.
Jerry Coffin

5
Konu açıkça belirtiyor: "Veri yapıları nelerdir ve ne zaman farklı türler kullanmalısınız?" Bu konu dışı mı? Bağlantılı listeler, karmalar ve diziler hakkında bilgi edinmenin, programlama ile ilgisi olmadığını mı söylüyorsunuz? Çünkü, özellikle doğrudan performans için tasarlanmış bir sunucuda doğrudan alakalı olduklarını iddia ediyorum. Ayrıca önemlidir, çünkü yanlış seçim bir uygulamadan diğerine önemli ölçüde daha az performans anlamına gelebilir.
Homer6

19
antirez'in cevabı bu soruyu kullanıyor. programcıların zararına yaklaşır ve kullanıcıları her yerde yeniden yönlendirir.
John Sheehan

75
@JerryCoffin tüm saygı ile, redis bir yazılım geliştirme aracıdır ve yazılım geliştirme araçları hakkında soru sormak kesinlikle konuyla ilgilidir. "Cevabı kaynağından alabilirsiniz" gerçeği yakın bir sebep değildir ... cevabı kaynağından almak saatler sürecektir. Ve redis çok yaygın olarak kullanılmaktadır, bu nedenle bu soru çok lokalize değildir. Stack Overflow, programlama hakkında bilgi edinmek ve çılgınca popüler bir programlama aracı tarafından hangi veri yapısının kullanıldığını sormakla ilgilidir. Kısacası bu soruyu kapatmak için herhangi bir neden bulamıyorum.
Joel Spolsky

Yanıtlar:


612

Sorunuzu cevaplamaya çalışacağım, ancak ilk başta garip görünebilecek bir şeyle başlayacağım: Redis içleriyle ilgilenmiyorsanız, veri türlerinin dahili olarak nasıl uygulandığına dikkat etmemelisiniz . Bu basit bir nedendir: her Redis işlemi için belgelerde zaman karmaşıklığını bulacaksınız ve eğer işlemler kümeniz ve zaman karmaşıklığı varsa, ihtiyacınız olan tek şey bellek kullanımı hakkında bir ipucu (ve verilere bağlı olarak değişebilecek birçok optimizasyon yapıyoruz, bu son rakamları almanın en iyi yolu birkaç önemsiz gerçek dünya testi yapmaktır).

Ancak sorduğunuzdan, her Redis veri türünün altında yatan uygulama.

  • Dizeler , bir C dinamik dize kütüphanesi kullanılarak uygulanır, böylece ekleme işlemlerindeki ayırmalar için ödeme yapmazız (asimptolojik olarak konuşursak). Bu şekilde, örneğin ikinci dereceden davranış yerine O (N) eklerimiz olur.
  • Listeler bağlantılı listelerle uygulanır.
  • Kümeler ve Hash'ler karma tablolarla uygulanır.
  • Sıralama setleri ile uygulanmaktadır atlama listeleri (dengeli ağaçlar tuhaf bir türü).

Ancak listeler, kümeler ve sıralı kümeler, öğe sayısı ve en büyük değerlerin boyutu az olduğunda, farklı, çok daha kompakt bir kodlama kullanılır. Bu kodlama farklı türler için farklılık gösterir, ancak her işlem için genellikle O (N) taramaya zorlayan kompakt bir veri bloğu olması özelliğine sahiptir. Bu biçimi yalnızca küçük nesneler için kullandığımız için bu bir sorun değildir; küçük bir O (N) blobun taranması önbellekten habersizdir, bu yüzden pratik olarak çok hızlıdır ve çok fazla eleman olduğunda kodlama otomatik olarak yerel kodlamaya (bağlantılı liste, karma vb.) geçer.

Ama sorunuz aslında sadece içsel konularla ilgili değildi, amacınız neyi gerçekleştirmek için ne tür bir yöntemdi? .

Teller

Bu, tüm türlerin temel türüdür. Bu dört türden biridir, ancak aynı zamanda karmaşık türlerin temel türüdür, çünkü List dizelerin listesidir, Küme dizelerin kümesidir, vb.

Bir Redis dizesi, bir HTML sayfasını saklamak istediğiniz tüm açık senaryolarda ve aynı zamanda zaten kodlanmış verilerinizi dönüştürmekten kaçınmak istediğinizde iyi bir fikirdir. Örneğin, JSON veya MessagePack'iniz varsa, nesneleri yalnızca dize olarak saklayabilirsiniz. Redis 2.6'da, bu tür bir nesne sunucusu tarafını Lua komut dosyalarını kullanarak bile değiştirebilirsiniz.

Dizelerin bir başka ilginç kullanımı bitmap'lerdir ve genel olarak baytların rasgele erişim dizileridir, çünkü Redis rastgele bayt aralıklarına, hatta tek bitlere erişmek için komutlar verir. Örneğin, bu iyi blog gönderisini kontrol edin : Redis kullanarak Hızlı Kolay gerçek zamanlı metrikler .

Listeler

Listenin yalnızca uç noktalarına dokunma olasılığınız varsa listeler iyidir: yakın kuyruk veya başın yakınında. Listeler, öğeleri sayfalamak için çok iyi değildir, çünkü rastgele erişim yavaştır, O (N). Listelerin en iyi kullanımı, düz kuyruklar ve yığınlar veya öğeleri bir halka halkasını "döndürmek" için aynı kaynak ve hedefe sahip RPOPLPUSH kullanarak bir döngüdeki öğeleri işlemektir.

Listeler, genellikle yalnızca üst veya alt öğelere eriştiğimiz N kapaklı bir koleksiyon oluşturmak istediğimizde veya N küçük olduğunda da iyidir.

Setler

Kümeler sırasız bir veri koleksiyonudur, bu nedenle her öğe koleksiyonunuz olduğunda iyidir ve koleksiyonun varlığını veya boyutunu çok hızlı bir şekilde kontrol etmek çok önemlidir. Setlerle ilgili bir diğer harika şey, rastgele öğeleri (SRANDMEMBER ve SPOP komutları) gözetleme veya patlatma desteği.

Kümeler ilişkileri göstermek için de iyidir, örneğin, "X kullanıcısının arkadaşları nedir?" ve benzerleri. Ancak bu tür şeyler için diğer iyi veri yapıları, göreceğimiz gibi sıralanmış kümelerdir.

Setler kavşaklar, birlikler ve benzeri gibi karmaşık işlemleri destekler, bu nedenle verileriniz olduğunda ve bazı çıktılar elde etmek için bu veriler üzerinde dönüşümler yapmak istediğinizde Redis'i "hesaplama" tarzında kullanmak için iyi bir veri yapısıdır.

Küçük setler çok verimli bir şekilde kodlanır.

Hash'ler

Karmalar, alanlardan ve değerlerden oluşan nesneleri temsil etmek için mükemmel bir veri yapısıdır. Hash alanları ayrıca HINCRBY kullanılarak atomik olarak artırılabilir. Kullanıcılar, blog gönderileri veya başka bir öğe türü gibi nesneleriniz varsa, JSON veya benzeri gibi kendi kodlamanızı kullanmak istemiyorsanız, karma işlemlerin yapılması muhtemeldir.

Ancak, küçük karmaların Redis tarafından çok verimli bir şekilde kodlandığını ve Redis'ten tek tek alanları çok hızlı bir şekilde GET, SET veya artırmasını isteyebilirsiniz.

Karmalar referanslar kullanılarak bağlantılı veri yapılarını temsil etmek için de kullanılabilir. Örneğin yorumların lamernews.com uygulamasını kontrol edin.

Sıralama Kümeleri

Sıralı kümeler, sıralı öğeleri korumak için listelerin yanı sıra diğer veri yapılarıdır . Sıralı setlerle birkaç harika şey yapabilirsiniz. Örneğin , web uygulamanızda her türlü En İyi Şey listesine sahip olabilirsiniz . Skora göre en iyi kullanıcılar, sayfa görüntülemelere göre en iyi yayınlar, her ne olursa olsun en iyiler, ancak tek bir Redis örneği saniyede tonlarca ekleme ve üst öğe işlemlerini destekleyecektir.

Sıralı kümeler, normal kümeler gibi, ilişkileri tanımlamak için kullanılabilir, ancak aynı zamanda öğe listesini sayfalandırmanıza ve sıralamayı hatırlamanıza izin verir. Örneğin, X kullanıcısını sıralı bir kümeyle hatırlarsam, kabul edilen arkadaşlık sırasına göre onları kolayca hatırlayabilirim.

Sıralama kümeleri öncelik sıraları için iyidir.

Sıralı kümeler, listenin ortasına aralık ekleme, çıkarma veya aralığın her zaman hızlı olduğu daha güçlü listeler gibidir. Ancak daha fazla bellek kullanırlar ve O (log (N)) veri yapılarıdır.

Sonuç

Umarım bu yazıda bazı bilgiler verdim, ancak http://github.com/antirez/lamernews adresinden lamernews kaynak kodunu indirmek ve nasıl çalıştığını anlamak çok daha iyi . Redis'in birçok veri yapısı Lamer News'un içinde kullanılıyor ve belirli bir görevi çözmek için ne kullanılacağına dair birçok ipucu var.

Dilbilgisi yazım hataları için üzgünüm, gece yarısı burada ve yayını incelemek için çok yorgun;)


45
Bu Redis'in tek yazarı. Ona e-posta gönderdim ve cevap vermesini istedim. Çok, çok, çok teşekkür ederim Salvatore. Bu harika bir bilgi.
Homer6

58
Teşekkürler, ancak tek büyük katılımcı değilim, Pieter Noordhuis mevcut uygulamanın çok büyük bir kısmını sağladı :)
antirez

1
Aynı dize birçok farklı kümede bulunuyorsa, dizenin yalnızca tek bir kopyası saklanır mı?
sbrian

O (1) 'de zscore sadece bir atlama listesi kullanarak nasıl?
Maxime

1
Bir atlama listesi uygun dengeli bir ağaç olmasa da, bir atlama listesini "ters çevrilmiş" rastgele ağaç olarak görebilirsiniz. Uygulama ve düzen farklı olsa bile temelde eşdeğerdir.
antirez

80

Çoğu zaman, Redis tarafından kullanılan temel veri yapılarını anlamanız gerekmez. Ancak biraz bilgi CPU v / s Bellek takas yapmanızı sağlar. Ayrıca verilerinizi verimli bir şekilde modellemenize yardımcı olur.

Dahili olarak, Redis aşağıdaki veri yapılarını kullanır:

  1. sicim
  2. Sözlük
  3. Çift Bağlantılı Liste
  4. Listeyi Atla
  5. Posta Listesi
  6. Int Setleri
  7. Zip Haritalar (Redis 2.6'dan bu yana zip listesi lehine kullanımdan kaldırıldı)

Belirli bir anahtar tarafından kullanılan kodlamayı bulmak için komutu kullanın object encoding <key>.

1. Dizeler

Redis'te Dizelere Basit Dinamik Dizeler veya SDS denir . Bu char *, dizenin uzunluğunu ve boş bayt sayısını önek olarak saklamanızı sağlayan ufacık bir sarıcıdır.

Dizenin uzunluğu saklandığından, strlen bir O (1) işlemidir. Ayrıca, uzunluk bilindiği için, Redis dizeleri ikili güvenlidir. Bir dizgenin null karakteri içermesi tamamen yasaldır .

Dizeler, Redis'te bulunan en çok yönlü veri yapısıdır. Bir Dize olan tüm aşağıdakilerden:

  1. Metin depolayabilen bir karakter dizesi. Bkz. SET ve GET komutları.
  2. İkili verileri depolayabilen bir bayt dizisi.
  3. longNumaraları saklayabilen A. Bkz. INCR , DECR , INCRBY ve DECRBY komutları.
  4. Array (arasında chars, ints, longsetkin rastgele erişim izin verebilir ya da başka bir veri türü). Bkz. SETRANGE ve GETRANGE komutları.
  5. Bireysel bitleri ayarlamanıza veya almanıza izin veren bir bit dizisi . Bkz. SETBIT ve GETBIT komutları.
  6. Diğer veri yapılarını oluşturmak için kullanabileceğiniz bir bellek bloğu. Bu, dahili olarak, az sayıda öğe için kompakt, bellek açısından verimli veri yapıları olan ziplists ve intsets oluşturmak için kullanılır. Bu konuda daha fazlası aşağıda.

2. Sözlük

Redis , aşağıdakiler için bir Sözlük kullanır :

  1. Bir anahtarı, değerinin bir dize, karma, küme, sıralanmış küme veya liste olabileceği ilişkili değerine eşlemek için.
  2. Bir anahtarı süre sonu zaman damgasına eşlemek için.
  3. Karma, Küme ve Sıralı Küme veri türlerini uygulamak için.
  4. Redis komutlarını bu komutları işleyen işlevlerle eşlemek için.
  5. Bir Redis anahtarını, o anahtarda engellenen istemciler listesine eşlemek için. Bkz. BLPOP .

Redis Sözlükleri Karma Tablolar kullanılarak uygulanır . Uygulamayı açıklamak yerine, Redis'e özgü şeyleri açıklayacağım:

  1. Sözlükler dictType, karma tablonun davranışını genişletmek için çağrılan bir yapı kullanır . Bu yapının işlev işaretçileri vardır ve bu nedenle aşağıdaki işlemler genişletilebilir: a) karma işlevi, b) anahtar karşılaştırması, c) anahtar yıkıcı ve d) değer yıkıcı.
  2. Sözlükler murmurhash2 kullanır . (Daha önce seed = 5381 ile djb2 ​​hash işlevini kullandılar , ancak hash işlevi murmur2 olarak değiştirildi . Djb2 hash algoritmasının açıklaması için bu soruya bakın .)
  3. Redis, Artımlı Yeniden Boyutlandırma olarak da bilinen Artımlı Hashing kullanır . Sözlüğün iki karma tablosu vardır. Sözlüğe her dokunuşta bir kova ilk (daha küçük) karma tablodan ikinciye taşınır. Bu şekilde Redis pahalı bir yeniden boyutlandırma işlemini önler.

SetVeri yapısı hiçbir çiftleri vardır garantilemek amacıyla Sözlük kullanır. Sorted SetNeden onun puanı, bir öğe eşleştirmek için bir sözlük kullanır ZSCORE bir O (1) operasyondur.

3. Çift Bağlantılı Listeler

listVeri türü kullanılarak uygulanır Çifte Bağlantılı Listeler . Redis'in uygulaması, algoritma-ders kitabından direktir. Tek değişiklik Redis'in uzunluğu liste veri yapısında saklamasıdır. Bu, LLEN'nin O (1) karmaşıklığına sahip olmasını sağlar .

4. Listeleri Atla

Redis, Sıralı Kümeler için temel alınan veri yapısı olarak Listeleri Atla'yı kullanır . Vikipedi'nin iyi bir tanıtımı var. William Pugh'un Makaleleri Atla Listeleri: Dengeli Ağaçlara Olasılıksal Bir Alternatif daha fazla ayrıntıya sahiptir.

Sıralama Kümeleri hem Atlama Listesi hem de Sözlük kullanır. Sözlük her öğenin puanını saklar.

Redis'in Atlama Listesi uygulaması, standart uygulamadan aşağıdaki şekillerde farklıdır:

  1. Redis yinelenen puanlara izin verir. İki düğüm aynı skora sahipse, sözlük sırasına göre sıralanır .
  2. Her düğümün 0. seviyede bir geri işaretçisi vardır. Bu, öğeleri skorun ters sırasına göre hareket ettirmenizi sağlar.

5. Zip Listesi

Bir Zip Listesi iki noktadan bağlantılı bir liste gibidir, ancak işaretçiler kullanmaz ve verileri satır içinde depolar.

Çift bağlantılı bir listedeki her düğümün 3 işaretçisi vardır - bir ileri işaretçi, bir geri işaretçi ve o düğümde depolanan verilere referans vermek için bir işaretçi. İşaretçiler bellek gerektirir (64 bit sistemde 8 bayt) ve bu nedenle küçük listeler için çift bağlantılı bir liste çok verimsizdir.

Bir Zip Listesi, öğeleri bir Redis Dizesinde sırayla saklar. Her öğenin, öğenin uzunluğunu ve veri türünü, bir sonraki öğeye kaydırmayı ve bir önceki öğeye kaydırmayı depolayan küçük bir üstbilgisi vardır. Bu ofsetler ileri ve geri işaretçilerin yerini alır. Veriler yerinde saklandığından bir veri işaretçisine ihtiyacımız yok.

Zip listesi küçük listeleri, sıralı kümeleri ve karmaları saklamak için kullanılır. Sıralanan kümeler [element1, score1, element2, score2, element3, score3]Zip Listesinde olduğu gibi bir listede düzleştirilir ve saklanır. Karmalar, [key1, value1, key2, value2]vb. Gibi bir listeye düzleştirilir .

Zip Listeleri ile CPU ve Bellek arasında bir denge kurma gücüne sahipsiniz. Zip Listeleri bellek tasarrufludur, ancak bağlantılı listeden (veya Karma tablo / Atlama Listesi) daha fazla CPU kullanırlar. Zip listesinde bir öğe bulmak O (n) şeklindedir. Yeni bir öğe eklemek için belleğin yeniden tahsis edilmesi gerekir. Bu nedenle, Redis bu kodlamayı yalnızca küçük listeler, karmalar ve sıralı kümeler için kullanır. Redis.conf içinde <datatype>-max-ziplist-entriesve <datatype>-max-ziplist-value>içindeki değerleri değiştirerek bu davranışı düzenleyebilirsiniz. Daha fazla bilgi için bkz. Redis Bellek Optimizasyonu, "Küçük toplu veri türlerinin özel kodlaması" bölümü .

Ziplist.c yorum var mükemmel olduğunu ve kod okumak zorunda kalmadan tamamen bu veri yapısını anlayabiliriz.

6. Int Setleri

Int Setler "Sıralı Tam Sayı Diziler" için süslü bir isimdir.

Redis'te, kümeler genellikle karma tablolar kullanılarak uygulanır. Küçük setler için, bir karma tablosu bellek bakımından verimsizdir. Küme yalnızca tamsayılardan oluştuğunda, bir dizi genellikle daha verimlidir.

Int Set, sıralı bir tamsayı dizisidir. Bir öğeyi bulmak için bir ikili arama algoritması kullanılır. Bu O'nun karmaşıklığına sahiptir (log N). Bu diziye yeni tamsayılar eklemek, büyük tamsayı dizileri için pahalı olabilen bir bellek yeniden tahsisi gerektirebilir.

Daha fazla bellek optimizasyonu olarak, Int Setler farklı tamsayı boyutlarına sahip 3 varyant halinde gelir: 16 bit, 32 bit ve 64 bit. Redis, elemanların boyutuna bağlı olarak doğru varyantı kullanacak kadar akıllıdır. Yeni bir öğe eklendiğinde ve mevcut boyutu aştığında, Redis otomatik olarak bir sonraki boyuta geçirir. Bir dize eklenirse, Redis Int Setini otomatik olarak normal Hash Tablosu tabanlı bir sete dönüştürür.

Int Setler CPU ve Bellek arasında bir değiş tokuştur. Int Setler son derece bellek verimlidir ve küçük setler için karma tablodan daha hızlıdır. Ancak belirli sayıda elemandan sonra O (log N) geri alma süresi ve hafızanın yeniden tahsis edilmesi maliyeti çok fazla olur. Deneylere dayanarak, normal bir karma tabloya geçmek için en uygun eşik 512 olarak bulundu. Ancak, uygulamanızın ihtiyaçlarına göre bu eşiği (mantıklı olmayan azaltma) artırabilirsiniz. Bkz set-max-intset-entries. Redis.conf.

7. Zip Haritaları

Zip Haritalar düzleştirilmiş ve bir listede saklanan sözlüklerdir. Zip Listelerine çok benzerler.

Zip Maps Redis 2.6'dan beri kullanımdan kaldırıldı ve küçük karmalar Zip Listelerinde saklandı. Bu kodlama hakkında daha fazla bilgi edinmek için zipmap.c'deki yorumlara bakın .


2

Redis, değerlere işaret eden tuşları saklar. Anahtarlar makul bir boyuta kadar herhangi bir ikili değer olabilir (okunabilirlik ve hata ayıklama amacıyla kısa ASCII dizeleri kullanılması önerilir). Değerler, beş yerel Redis veri türünden biridir.

1. dizeler - 512 MB'a kadar ikili güvenli bayt dizisi

2.hashes - anahtar değer çiftlerinin bir koleksiyonu

3.lists - ekleme sıralı bir dize koleksiyonu

4.sets - sipariş vermeyen benzersiz dizelerden oluşan bir koleksiyon

5. sıralı setler - kullanıcı tanımlı puanlama tarafından sıralanan benzersiz dizelerden oluşan bir koleksiyon

Teller

Bir Redis dizesi bir bayt dizisidir.

Redis'teki dizeler ikili güvenlidir (yani, herhangi bir özel sonlandırma karakteri tarafından belirlenmeyen bilinen bir uzunluğa sahip oldukları anlamına gelir), bu nedenle bir dizede 512 megabayta kadar herhangi bir şey saklayabilirsiniz.

Dizeler, kanonik "anahtar değer deposu" konseptidir. Bir değere işaret eden bir anahtarınız vardır; burada hem anahtar hem de değer metin veya ikili dizelerdir.

Dizelerle ilgili tüm olası işlemler için http://redis.io/commands/#string adresine bakın.

Hash'ler

Bir Redis karması, anahtar / değer çiftlerinin bir koleksiyonudur.

Bir Redis karması, her anahtar ve değerin bir dize olduğu birçok anahtar değer çifti içerir. Redis karmaları, karmaşık değerleri doğrudan desteklemez (yani, karma alanının bir liste veya küme veya başka bir karma değerine sahip olamazsınız), ancak diğer üst düzey karmaşık değerlere işaret etmek için karma alanlarını kullanabilirsiniz. Karma alan değerleri üzerinde yapabileceğiniz tek özel işlem, sayısal içeriğin atomik artışı / azalmasıdır.

Bir Redis karmasını iki şekilde düşünebilirsiniz: doğrudan nesne temsili ve birçok küçük değeri kompakt bir şekilde saklamanın bir yolu olarak.

Doğrudan nesne gösterimlerinin anlaşılması kolaydır. Nesnelerin bir adı (karma anahtarı) ve değerleri olan dahili anahtarlar koleksiyonu vardır. Bir örnek için aşağıdaki örneğe bakın.

Bir karma kullanarak birçok küçük değeri depolamak akıllı Redis büyük veri depolama tekniğidir. Bir karma az sayıda alana (~ 100) sahip olduğunda, Redis tüm karma'nın depolama ve erişim etkinliğini optimize eder. Redis'in küçük karma depolama optimizasyonu ilginç bir davranış yaratır: dize değerlerini gösteren 10.000 üst düzey tuşa sahip olmak yerine her biri 100 dahili anahtar ve değer içeren 100 karma yapmak daha etkilidir. Veri depolama alanınızı bu şekilde optimize etmek için Redis karmalarını kullanmak, verilerin nerede bittiğini izlemek için ek programlama yükü gerektirir, ancak veri depolama alanınız temelde dize tabanlıysa, bu garip hileyi kullanarak çok fazla bellek yükü kaydedebilirsiniz.

Karmalarla ilgili tüm işlemler için karma belgelere bakın

Listeler

Yeniden listeler bağlantılı listeler gibi davranır.

Listenin başına veya kuyruğuna listeler ekleyebilir, listeden listeden listeyi başlatabilirsiniz.

Değerleri girildikleri sırayla tutmanız gerektiğinde listeleri kullanın. (Redis, gerekirse herhangi bir rastgele liste konumuna ekleme seçeneği sunar, ancak başlangıç ​​konumunuzdan uzağa eklerseniz ekleme performansınız düşer.)

Redis listeleri genellikle üretici / tüketici kuyrukları olarak kullanılır. Bir listeye öğe ekleyin, ardından listeden öğeleri açın. Tüketicileriniz element içermeyen bir listeden çıkmaya çalışırsa ne olur? Redis'ten bir öğenin görünmesini beklemesini ve eklendiğinde hemen size geri vermesini isteyebilirsiniz. Bu, Redis'i gerçek zamanlı mesaj kuyruğu / olay / iş / görev / bildirim sistemine dönüştürür.

Listenin her iki ucundaki öğeleri atomik olarak kaldırarak herhangi bir listenin yığın veya kuyruk olarak değerlendirilmesini sağlayabilirsiniz.

Ayrıca, her ekleme işleminden sonra listenizi belirli bir boyuta getirerek sabit uzunluklu listeleri (kapaklı koleksiyonlar) koruyabilirsiniz.

Listelerdeki tüm olası işlemler için listeler belgelerine bakın

Setler

Redis kümeleri, kümelerdir.

Bir Redis kümesi, her dizenin set başına yalnızca bir kez bulunduğu benzersiz sıralanmamış Redis dizeleri içerir. Aynı öğeyi bir kümeye on kez eklerseniz, öğe yalnızca bir kez görünür. Setler, biriken ve alan israf eden yinelenen öğeler hakkında endişelenmeden bir şeyin en az bir kez varlığını tembellik etmek için mükemmeldir. Zaten var olup olmadığını kontrol etmenize gerek kalmadan aynı dizeyi istediğiniz kadar ekleyebilirsiniz.

Setler üyelik kontrolü, sete üye ekleme ve silme işlemleri için hızlıdır.

Setlerin beklediğiniz gibi verimli set işlemleri vardır. Birden çok kümenin birleşimini, kesişimini ve farkını aynı anda alabilirsiniz. Sonuçlar arayan kişiye geri gönderilebilir veya sonuçlar daha sonra kullanılmak üzere yeni bir kümede saklanabilir.

Setler üyelik kontrolleri (listelerin aksine) için sürekli zaman erişimine sahiptir ve Redis bile uygun rastgele üye kaldırma ve döndürme ("setten rastgele bir öğe pop") veya değiştirmeden dönen rastgele üye ("bana 30 rastgele-ish benzersiz kullanıcı verir) ") veya değiştirerek (" bana 7 kart verin, ancak her seçimden sonra kartı tekrar örnekleyebilecek şekilde geri koyun ").

Setlerdeki tüm olası işlemler için set belgelerine bakın .

Sıralama Kümeleri

Yeniden sıralanan kümeler, kullanıcı tanımlı bir sıralamaya sahip kümelerdir.

Basitlik için, sıralı bir kümeyi benzersiz öğelere sahip bir ikili ağaç olarak düşünebilirsiniz. (Yeniden sıralanan kümeler aslında atlama listeleridir .) Öğelerin sıralama düzeni her öğenin puanı ile tanımlanır.

Sıralı kümeler hala kümelerdir. Öğeler kümede yalnızca bir kez görünebilir. Bir öğe, benzersiz amaçlar için, dize içeriği ile tanımlanır. Puan elma 3 ile "elma" öğesi ekleme, sonra 500 puan sıralama ile "elma" öğesi ekleme Sıralanan kümenizde 500 puan sıralama ile bir öğe "elma" sonuçlanır. Kümeler yalnızca (Veriler, Veriler) çiftlerine değil, Verilere dayalı olarak benzersizdir.

Veri modelinizin, öğenin benzersizlik puanına değil, dize içeriğine dayandığından emin olun. Skorların tekrarlanmasına (hatta sıfıra) izin verilir, ancak son bir kez ayarlanan elemanlar sıralı set başına sadece bir kez bulunabilir. Örneğin, skoru girişin çağı ve kullanıcı kimliğinin değerini yaparak her kullanıcı girişinin geçmişini sıralanmış bir küme olarak depolamaya çalışırsanız, tüm kullanıcılarınız için yalnızca son giriş dönemini depolarsınız. Kümeniz, istediğiniz kullanıcı tabanı * girişleri boyutuna değil, kullanıcı tabanınızın boyutuna göre büyüyecektir.

Öğeler setinize puanlarla eklenir. Herhangi bir öğenin puanını istediğiniz zaman güncelleyebilirsiniz, öğeyi yeni bir puanla tekrar eklemeniz yeterlidir. Skorlar kayan nokta iki katıyla gösterilir, böylece gerekirse yüksek hassasiyetli zaman damgalarının ayrıntı düzeyini belirtebilirsiniz. Birden fazla eleman aynı puana sahip olabilir.

Öğeleri birkaç farklı yolla alabilirsiniz. Her şey sıralandığından, en düşük puanlardan başlayarak öğeleri isteyebilirsiniz. En yüksek puanlardan ("tersine") başlayarak öğeleri isteyebilirsiniz. Öğeleri doğal veya ters sırayla sıralama puanlarına göre isteyebilirsiniz.

Sıralı kümelerdeki tüm olası işlemler için sıralı kümeler belgelerine bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.