Redis sadece bir önbellek midir?


255

Bazı Redis belgelerini okuyorum ve http://try.redis-db.com/ adresindeki öğreticiyi deniyorum . Şimdiye kadar Redis ile Velocity veya Enterprise Library Caching Framework gibi önbellek teknolojileri arasında hiçbir fark göremiyorum

Yalnızca benzersiz bir anahtar kullanarak bellek içi veri deposuna nesneler eklersiniz. İlişkisel anlambilim yok gibi görünüyor ...

Neyi kaçırıyorum?


3
Gönderen redis.io : Redis bir açık kaynak, gelişmiş anahtar-değer mağaza. Anahtarlar dizeler, karmalar, listeler, kümeler ve sıralı kümeler içerebileceğinden, genellikle bir veri yapısı sunucusu olarak adlandırılır. Bununla birlikte, StackOverflow'un biçimine uymadığı için sorunuzu kapatmaya oy verdim.
Linus Thiel

29
Ben SO biçiminde kabul ediyorum. Nerede daha uygun olacağını düşünüyorsunuz?
Matt Evans

Yanıtlar:


631

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 zrevrangeve 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 subscribekullanıcıları belirli bir kanala yönlendirirsiniz. Yeni bir soru eklendiğinde, publisho 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


15
Ayrıca PUB / SUB ile ilgili komutları kullanan son derece basit bir servis veri yolu.
Jim Dennis

3
Kullanıcıya göre nasıl soru alabilirim? Sorular gibi her kullanıcı için bir liste oluşturmalı mıyım: sorular: kullanıcı: 1 mi yoksa etiketleri mi kullanmalıyım?
Diogo Alves

2
her SO üzerinde gördüğüm çok yararlı ve ayrıntılı açıklama
Trong Vu

5

Sadece bir önbellek değil.

  • Bellek anahtar / değer depolama alanında
  • Birden çok veri türünü (dizeler, karmalar, listeler, kümeler, sıralı kümeler, bitmapler ve hiperlogloglar) destekleyin
  • Önbellek verilerini fiziksel depolamaya (gerekirse) depolama olanağı sağlar.
  • Pub-sub modelini destekleyin
  • Redis önbellek yüksek kullanılabilirlik için çoğaltma sağlar (master / slave)

4

Redis, ultra hızlı lua komut dosyaları gibi benzersiz yeteneklere sahiptir. Yürütme süresi C komutlarının yürütülmesine eşittir. Bu aynı zamanda Kilitler ve Semaforlar gibi birçok gelişmiş nesnenin çalışması için gerekli olan gelişmiş Redis veri manipülasyonu için atomisite getirir.

Java üzerinde dağıtılmış uygulama oluşturmaya izin veren Redisson adlı bellek veri ızgarasında bulunan bir Redis vardır . Dağıtık sayesinde , , , , nesneler ve diğerleri.LockSemaphoreReadWriteLockCountDownLatchConcurrentMap

Bulutta mükemmel çalışır ve AWS Elastik Önbellek , AWS Elastik Önbellek Kümesi ve Azure Redis Önbellek desteğini destekler


1

Aslında göreceli veri gösterimi (veya herhangi bir veri gösterimi türü) ile veritabanı rolü (önbellek, kalıcı kalıcılık vb.) Arasında bir bağımlılık yoktur.

Redis önbellek için iyidir, ama sadece bir önbellekten çok daha fazlası. Yüksek hızlı tam bellek içi veritabanı. Diskteki verileri kalıcı hale getirir. İlişkisel değil, anahtar / değer depolama.

Üretimde kullanıyoruz. Redis, saniyede binlerce talebi işleyen bir yazılım geliştirmemize ve tüm doğal yaşam döngüsü boyunca müşteri iş verilerini tutmamıza yardımcı olur.


0

Redis, dağıtılmış ortam / Microservice mimarisi için en uygun önbellektir.

Hızlı, güvenilir, atomiklik ve tutarlılık sağlar ve setler, karmalar, liste vb.Gibi veri türlerine sahiptir.

Son bir yıldan beri kullanıyorum ve her zaman verileri önbelleğe almak için kullanabileceğiniz gibi, üretime hazır bir çözüm çok hızlı ve performansla ilgili herhangi bir sorun sağlamanız gerektiğinde gerçekten bir kurtarıcı olarak geliyor.


0

Önbellek sunucusu olmasının yanı sıra, Redis özellikle bir veri yapısı sunucusudur. Veri yapısı sunucusu şeklinde bir önbellek olmak çok önemlidir, çünkü veri yapıları programların veya uygulamaların temelidir . SQL veritabanlarını depolama teknolojisi olarak kullandığınızı ve bir liste, bir karma harita, bir sıralama seti veya bunun gibi şeyler oluşturmanız gerektiğini düşünün, boyunda bir çeşit acı var. Redis, bu işlevleri doğrudan çok basit bir şekilde sağlayabilir , böylece gelişimi son derece basitleştirir.

Öte yandan, bir veri yapısı sunucusunun önbellek şeklinde olması gerekmez. Redis ile uyumlu ancak kalıcı depolama motorlarına sahip projeler var.


0

Redis; dizeler, karmalar, listeler, kümeler, aralık sorguları, bitmapler, hiperlogloglar, yarıçap sorguları ve akışları olan coğrafi uzamsal dizinler gibi veri yapılarını destekler. Redis, yerleşik çoğaltma, Lua komut dosyası oluşturma, LRU tahliyesi, işlemler ve farklı disk üzerinde kalıcılık düzeylerine sahiptir ve Redis Sentinel aracılığıyla yüksek kullanılabilirlik ve Redis Kümesi ile otomatik bölümleme sağlar.

python ile uygulama

https://beyondexperiment.com/vijayravichandran06/redis-data-structure-with-python/

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.