Redis verileri saklıyor mu?


122

Redis'in tüm verileri bellekten sunduğunu anlıyorum, ancak sunucu yeniden başlatıldığında diskteki tüm verileri belleğe okuyacak şekilde sunucunun yeniden başlatılması sırasında da devam ediyor mu? Yoksa sadece uygulamalar kalıcı olmadan çalışırken verileri depolamak için her zaman boş bir depo mu?


1
Sorunuzu doğru anladığımdan emin değilim. Anlık görüntüyü diske kaydedebilir ve o dosyadan okuyabilirsiniz, yapmazsanız, yeniden başlatıldığında redis veritabanınız boş olacaktır.
Sefa

Yanıtlar:


82

Bu konuyu http://redis.io/topics/persistence adresinde okumanızı öneririm . Temelde, yalnızca bellek içi depolamayı kullanarak performansı artırdığınızda garantili kalıcılığı kaybedersiniz. Belleğe EKLEDİĞİNİZ bir senaryo hayal edin, ancak daha önce diske güç kaybetmeden önce. Veri kaybı olacaktır.

Redis, "anlık görüntüleri" destekler. Bu, bellekte olanların tam bir kopyasını zamanın bazı noktalarında (örneğin her saat başı) yapacağı anlamına gelir. İki anlık görüntü arasında güç kaybettiğinizde, son anlık görüntü ile kilitlenme arasındaki zamandan verileri kaybedersiniz (elektrik kesintisi olması gerekmez ..). Redis, çoğu NoSQL-DB'nin yaptığı gibi veri güvenliği ile performans arasında ticaret yapar.

Çoğu NoSQL veritabanı, bu riski en aza indirmek için birden çok düğüm arasında bir çoğaltma konseptini takip eder. Redis, veri tutarlılığını garanti eden bir veritabanı yerine daha hızlı bir önbellek olarak kabul edilir. Bu nedenle, kullanım durumları tipik olarak gerçek veritabanlarından farklıdır: Örneğin, oturumları, performans sayaçlarını veya içindeki her şeyi benzersiz bir performansla ve bir çökme durumunda gerçek bir kayıp olmadan depolayabilirsiniz. Ancak siparişlerin / satın alma geçmişlerinin vb. İşlenmesi, geleneksel veritabanları için bir iş olarak kabul edilir.


1
Varsayılan kalıcılık davranışını ekleyebilirseniz harika olur. @Leonid Beschastny cevabı gibi.
yeya

40

Redis sunucusu, tüm verilerini zaman zaman HDD'ye kaydederek bir miktar kalıcılık sağlar.

Verileri aşağıdaki durumlardan birinde kaydeder:

  • zaman zaman otomatik olarak
  • komutu manuel olarak çağırdığınızdaBGSAVE
  • redis kapandığında

Ancak redis'teki veriler gerçekten kalıcı değildir, çünkü:

  • redis sürecinin çökmesi, son kayıttan bu yana tüm değişikliklerin kaybedilmesi anlamına gelir
  • BGSAVE İşlem yalnızca yeterli boş RAM'iniz varsa gerçekleştirilebilir (fazladan RAM miktarı redis DB'nin boyutuna eşittir)

Not: BGSAVE RAM gereksinimi gerçek bir sorundur, çünkü yeniden çalışacak RAM kalmayıncaya kadar çalışmaya devam eder, ancak verileri HDD'ye kaydetmeyi çok daha erken durdurur (RAM'in yaklaşık% 50'sinde).

Daha fazla bilgi için bkz. Redis Persistence .


1
Bu cevap yazıldığından beri, önemli ölçüde daha yüksek kalıcılık sağlayan, ancak daha yüksek disk kullanımı ve daha yavaş sunucu başlatma gibi diğer bazı dezavantajları olan AOF adlı alternatif bir kalıcılık modeli sundu.
Leonid Beschastny

15

Bu bir yapılandırma meselesidir. Verilerinizin hiçbiri, kısmen veya tamamen Redis üzerinde kalıcılığına sahip olamazsınız. En iyi karar, projenin teknik ve iş ihtiyaçlarına göre verilecektir.

Redis kalıcılık belgelerine göre , örneğinizi zaman zaman diske veya her sorguda kısaca verileri kaydedecek şekilde ayarlayabilirsiniz. AOF ve RDB olmak üzere iki strateji / yöntem sağlarlar (o zamanla ilgili ayrıntıları görmek için belgeleri okuyun), her birini tek başına veya birlikte kullanabilirsiniz.

"SQL benzeri kalıcılık" istiyorsanız, dediler:

Genel gösterge, PostgreSQL'in size sağlayabileceği ile karşılaştırılabilir bir veri güvenliği derecesi istiyorsanız, her iki kalıcılık yöntemini de kullanmanız gerektiğidir.


7

Cevap genellikle evettir , ancak daha kapsamlı bir cevap gerçekten ne tür verileri depolamaya çalıştığınıza bağlıdır. Genel olarak, daha eksiksiz kısa cevap şudur:

  • Redis, esas olarak performans odaklı olduğu için kalıcı depolama için en uygun seçenek değildir
  • Redis, mevcut durum verilerinin güvenilir bellek içi depolanması / önbelleğe alınması için, özellikle birden çok istemcide / sunucuda kullanılan veriler için merkezi bir kaynak sağlayarak ölçeklenebilirliğe izin vermek için gerçekten daha uygundur.

Varsayılan olarak Redis, bu söyledikten sonra olacak veri devam anlık (görünüşte bu her 1 dakikadır, ancak ben bu doğrulamadıysanız - bu iyi bir temel intro aşağıda makalede, tarafından açıklanan) periyodik aralıklarla:

http://qnimate.com/redis-permanent-storage/


TL; DR

Gönderen resmi dokümanlar :

  • RDB kalıcılığı [varsayılan] , veri kümenizin belirli aralıklarla anlık anlık görüntülerini gerçekleştirir.
  • AOF kalıcılığı [açıkça yapılandırılması gerekir] , sunucu tarafından alınan her yazma işlemini günlüğe kaydeder ve sunucu başlangıcında yeniden oynatılır ve orijinal veri kümesini yeniden oluşturur.

Redis , gerekliyse, AOF kalıcılığı için açıkça yapılandırılmalıdır ve bu, performans kaybına ve günlüklerin büyümesine neden olur. Sınırlı miktarda veri akışının nispeten güvenilir bir şekilde sürekliliği için yeterli olabilir.


5

Hiç kalıcılık seçemezsiniz Daha iyi performans ancak Redis kapatıldığında tüm veriler kaybedilir.

Redis'in iki kalıcılık mekanizması vardır: RDB ve AOF. RDB, bir zamanlayıcı genel anlık çekim kullanır ve AOF, güncellemeyi MySql'e benzer bir salt-eklenti günlük dosyasına yazar.

Bunlardan birini veya her ikisini birden kullanabilirsiniz. Redis yeniden başlatıldığında, RDB dosyasını veya AOF dosyasını okuyarak veri oluşturur.

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.