Hayır, Redis bir önbellekten çok daha fazlası.
Önbellek gibi, Redis de anahtar = değer çiftlerini saklar. Ancak önbellekten farklı olarak Redis, değerler üzerinde çalışmanıza izin verir. Redis'de 5 veri türü vardır - Dizeler, Kümeler, Karma, Listeler ve Sıralı Kümeler. Her veri türü çeşitli işlemleri ortaya koyar.
Redis'i anlamanın en iyi yolu, bir uygulamayı nasıl bir veritabanında saklayacağınızı düşünmeden modellemektir.
Diyelim ki StackOverflow.com oluşturmak istiyoruz. Basitleştirmek için Sorular, Cevaplar, Etiketler ve Kullanıcılara ihtiyacımız var.
Soruları, Kullanıcıları ve Yanıtları Modelleme
Her nesne Harita olarak modellenebilir. Örneğin, Soru {id, title, date_asked, vote, asked_by, status} alanlarına sahip bir haritadır. Benzer şekilde, bir Yanıt {id, soru_kimliği, yanıt_metni, yanıtlanan_by, oylar, durum} alanlarına sahip bir haritadır. Benzer şekilde, bir kullanıcı nesnesini modelleyebiliriz.
Bu nesnelerin her biri doğrudan Redis içinde Karma olarak saklanabilir. Benzersiz kimlikler oluşturmak için atomik artış komutunu kullanabilirsiniz. Böyle bir şey -
$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK
$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK
Oyları İşleme
Şimdi, birisi bir soruyu veya yanıtı her yükselttiğinde, bunu yapmanız yeterlidir
$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2
Anasayfa için Soru Listesi
Ardından, ana sayfada görüntülenecek en son soruları saklamak istiyoruz. Bir .NET veya Java programı yazıyorsanız, soruları bir Listede saklarsınız. Görünen o ki, bunu Redis'te de saklamanın en iyi yolu bu.
Birisi her soru sorduğunda, kimliğini listeye ekleriz.
$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1
Şimdi, ana sayfanızı oluşturmak istediğinizde, Redis'e en son 25 soruyu sorarsınız.
$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"
Artık id'lere sahip olduğunuza göre, pipelining kullanarak Redis'ten öğeleri alın ve bunları kullanıcıya gösterin.
Etikete Göre Sorular, Oylara Göre Sıralama
Daha sonra, her bir etiket için soru almak istiyoruz. Ancak SO, her bir etiket altında en çok oy alan soruları, yeni soruları veya cevaplanmamış soruları görmenizi sağlar.
Bunu modellemek için Redis'in Sıralı Küme özelliğini kullanıyoruz. Sıralı Küme, bir puanı her öğeyle ilişkilendirmenize olanak tanır. Daha sonra öğeleri puanlarına göre alabilirsiniz.
Devam edelim ve bunu Redis etiketi için yapalım
$ zadd questions_by_votes_tagged:redis 2 question:1
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5
1) "question:2"
2) "question:613"
3) "question:1"
Burada ne yaptık? Sıralanmış bir kümeye sorular ekledik ve her bir soru ile bir puan (oy sayısı) ilişkilendirdik. Her soru yükseltilince puanını yükseltiriz. Bir kullanıcı "Redis etiketli sorular, oylara göre sıralanmış" ı tıkladığında, sadece bir tane yaparız zrevrange
ve en önemli soruları geri alırız .
Sayfayı yenilemeden Gerçek Zamanlı Sorular
Ve son olarak, bir bonus özellik. Sorular sayfasını açık tutarsanız, yeni bir soru eklendiğinde SO sizi bilgilendirir. Redis burada nasıl yardımcı olabilir?
Redis'in bir pub-sub modeli vardır. Kanallar oluşturabilirsiniz, örneğin "channel_questions_tagged_redis". Daha sonra subscribe
kullanıcıları belirli bir kanala yönlendirirsiniz. Yeni bir soru eklendiğinde, publish
o kanala bir mesaj gönderirsiniz. Tüm kullanıcılar mesajı alır. Mesajı gerçekten tarayıcıya teslim etmek için web soketleri veya kuyruklu yıldız gibi bir web teknolojisi kullanmanız gerekecektir, ancak Redis sunucu tarafındaki tüm tesisatlarda size yardımcı olur.
Kalıcılık, Güvenilirlik vb.
Bir Önbellekten farklı olarak, Redis sabit diskteki verileri saklar. Daha iyi güvenilirlik sağlamak için bir master-slave kurulumuna sahip olabilirsiniz. Daha fazla bilgi edinmek için buradaki Kalıcılık ve Çoğaltma konularına bakın - http://redis.io/documentation