Üç ana ehcache, memcache ve redis önbelleğinin karşılaştırması

Son zamanlarda, proje ekibi bu üç önbelleği kullandı.İlgili resmi sitelere gittim ve gerçekten kendi değerlerine sahip olduklarını gördüm! Bugün, her önbelleğin avantajlarını ve dezavantajlarını yalnızca referans olması için kasıtlı olarak özetledim!

Ehcache

içinde Java Proje yaygın olarak kullanılmaktadır. RDBMS'den veri getirmenin yüksek maliyetini ve yüksek gecikmesini iyileştirmek için tasarlanmış açık kaynaklı bir önbelleğe alma çözümüdür. Ehcache sağlam (java tabanlı geliştirilmiş), sertifikalı (apache 2.0 lisanslı) ve özelliklerle dolu (daha sonra ayrıntılı olarak açıklanacaktır) olduğundan, büyük ve karmaşık bir dağıtılmış web uygulamasının her düğümünde kullanılır.

Hangi özellikler?

1. yeterince hızlı

Ehcache, yıllarca süren sıkı çalışma ve sayısız performanstan sonra uzun süredir piyasaya sürüldü Ölçek Ehcache nihayet büyük, yüksek eşzamanlı sistemler için tasarlandı.

2. Yeterince basit

Geliştirici tarafından sağlanan arayüz çok basit ve nettir ve Ehcache'nin kurulmasından uygulama ve işletmeye kadar değerli dakikalarınızdan sadece birkaç dakika alır. Aslında birçok geliştirici Ehcache kullandıklarını bilmiyor, Ehcache diğer açık kaynak projelerinde yaygın olarak kullanılıyor

gibi: kış uykusuna yatmak

3. Yeterince küçük

Bu özellik ile ilgili olarak, yetkili çok sevimli bir isim küçük ayak izi verdi Genel olarak, Ehcache'nin yayın sürümü 2M'ye ulaşmayacak ve V 2.2.3 sadece 668KB'dir.

4. Yeterince hafif

Çekirdek program sadece slf4j paketine bağlıdır, kimse yoktur!

5. İyi genişleme

Ehcache sağlar Büyük veri En son sürüm, birden çok örneğe, nesnelerin kaydedilmesinde yüksek esnekliğe izin verir ve LRU, LFU, FIFO eleme sağlar algoritma , Temel özellikler çalışırken yapılandırmayı destekler ve birçok eklentiyi destekler

6. Dinleyici

Önbellek yöneticisi dinleyici (CacheManagerListener) ve önbellek dinleyici (CacheEvenListener), bazı istatistikler veya veri tutarlılığı yayını yapmak çok yararlıdır

nasıl kullanılır?

Yeterince basit, Ehcache'nin önemli bir özelliğidir, doğal olarak kullanımı çok kolaydır!

Bir parça temel kod gönderin

CacheManager yöneticisi = CacheManager.newInstance ("src / config / ehcache.xml");

Ehcache cache = new Cache ("testCache", 5000, false, false, 5, 2);

cacheManager.addCache (önbellek);

Kodda bir ehcache.xml dosyası var, şimdi bu dosyaya bazı nitelikler ekleyelim

  • ad: önbellek adı.
  • maxElementsInMemory: Maksimum önbellek sayısı.
  • ebedi: Nesnenin kalıcı olarak geçerli olup olmadığı, bir kez ayarlandıktan sonra zaman aşımı çalışmayacaktır.
  • timeToIdleSeconds: Geçersiz hale gelmeden önce nesnenin izin verilen boşta kalma süresini (birim: saniye) ayarlayın. Yalnızca eternal = false nesnesi kalıcı olarak geçerli olmadığında, isteğe bağlı bir özellik olduğunda kullanılır, varsayılan değer 0'dır, yani boşta kalma süresi sonsuzdur.
  • timeToLiveSeconds: Nesnenin süresi dolmadan önce izin verilen hayatta kalma süresini ayarlayın Maksimum süre oluşturma süresi ile sona erme süresi arasındadır. Yalnızca eternal = false nesnesi kalıcı olarak geçerli olmadığında kullanılır, varsayılan değer 0'dır. Yani, nesnenin ömrü sonsuzdur.
  • overflowToDisk: Bellekteki nesnelerin sayısı maxElementsInMemory'ye ulaştığında, Ehcache nesneleri diske yazacaktır.
  • diskSpoolBufferSizeMB: Bu parametre, DiskStore'un (disk önbelleği) arabellek boyutunu ayarlar. Varsayılan 30MB'dir. Her Önbelleğin kendi tamponu olmalıdır.
  • maxElementsOnDisk: Maksimum sabit disk önbellek sayısı.
  • diskPersistent: Sanal makine yeniden başlatma verilerinin önbelleğe alınıp alınmayacağı Sanal Makinenin yeniden başlatılmaları arasında disk deposunun devam edip etmediği Varsayılan değer false.
  • diskExpiryThreadIntervalSeconds: Disk hatası iş parçacıklarının çalışma aralığı, varsayılan 120 saniyedir.
  • memoryStoreEvictionPolicy: maxElementsInMemory sınırına ulaşıldığında, Ehcache belleği belirtilen ilkeye göre temizleyecektir. Varsayılan strateji LRU'dur. FIFO veya LFU olarak ayarlayabilirsiniz.
  • clearOnFlush: Bellek miktarı maksimum olduğunda temizlenip temizlenmeyeceği.
  • memcache

    memcache, başlangıçta dinamik web sitelerini rahatlatmak için tasarlanmış, yüksek performanslı, dağıtılmış bir nesne önbelleğe alma sistemidir. veri tabanı Veri yükleme gecikmesi, bunu bir anahtar-değer önbelleği olan büyük bir HashTable bellek olarak düşünebilirsiniz. Danga Interactive, LiveJournal için BSD lisansı altında yayınlanan bir dizi açık kaynaklı yazılım geliştirdi.

    1. Bağımlılık

    memcache C dili Yazılı, GCC'nin ve libevent'in en son sürümüne bağlıdır. GCC onun derleyicisidir ve meslektaşları libevent'e dayalı olarak soket io yapar. Memcache yüklerken sistem arkadaşlarınızın bu iki ortama sahip olduğundan emin olun.

    2. Çoklu iş parçacığı desteği

    Memcache birden fazla CPU'nun aynı anda çalışmasını destekler. Memcache yükleme dosyasında thread.txt adında özel bir not vardır, varsayılan olarak memcached tek iş parçacıklı bir uygulama olarak derlenir. Varsayılan, tek iş parçacıklı derleme ve kurulumdur. Birden fazla iş parçacığına ihtiyacınız varsa Çok çekirdekli sistemleri desteklemek için ./configure --enable-thread'leri değiştirin, temel nokta, sisteminizin çok iş parçacıklı çalışma moduna sahip olması gerektiğidir. Çok iş parçacıklı işler için varsayılan iş parçacığı sayısı 4'tür. İş parçacığı sayısı CPU sayısını aşarsa, işlem kilitlenmesi olasılığı büyük olasılıkla ortaya çıkar. Kendi iş modeli seçimlerinizi birleştirmek, her şeyden en iyi şekilde faydalanmanızı sağlayabilir.

    3. Yüksek performans

    Soket iletişimini tamamlamak için libevent aracılığıyla, teorik olarak performans darboğazı ağ kartına düşer.

    Basit kurulum:

    1. Sırasıyla memcached ve libevent'i indirin ve / tmp dizinine koyun:

    # cd / tmp

    # wget

    # wget

    2. Önce libevent'i yükleyin:

    # tar zxvf libevent-1.2.tar.gz

    # cd libevent-1.2

    # ./configure -prefix = / usr

    # make (gcc'nin kurulu olmadığına dair bir istemle karşılaşırsanız, önce gcc'yi kurun)

    # make install

    3. libevent'in başarıyla kurulup kurulmadığını test edin:

    # ls -al / usr / lib | grep libevent

    lrwxrwxrwx 1 kök kök 2111 ?? 1217:38 libevent-1.2.so.1- > libevent-1.2.so.1.0.3

    -rwxr-xr-x 1 kök kökü 26354611 ?? 1217:38 libevent-1.2.so.1.0.3

    -rw-r-r- 1 kök kök 45415611 ?? 1217:38 libevent.a

    -rwxr-xr-x 1 kök kök 81111 ?? 1217:38 libevent.la

    lrwxrwxrwx 1 kök kök 2111 ?? 1217:38 libevent.so- > libevent-1.2.so.1.0.3

    Fena değil, hepsi kurulu.

    4. memcached'i kurun ve kurulumda libevent'in kurulum konumunu belirtmeniz gerekir:

    # cd / tmp

    # tar zxvf memcached-1.2.0.tar.gz

    # cd memcached-1.2.0

    # ./configure -with-libevent = / usr

    # Yapmak

    # make install

    Ortada bir hata oluşursa, lütfen hata mesajını dikkatlice kontrol edin ve ilgili kitaplığı veya yolu hata mesajına göre yapılandırın veya ekleyin.

    Kurulum tamamlandıktan sonra memcached / usr / local / bin / memcached içine yerleştirilecektir,

    5. Memcached'in başarıyla yüklenip yüklenmediğini test edin:

    # ls -al / usr / local / bin / mem *

    -rwxr-xr-x 1 kök kök 13798611 ?? 1217:39 / usr / local / bin / memcached

    -rwxr-xr-x 1 kök kök 14017911 ?? 1217:39 / usr / local / bin / memcached-debug

    Memcache hizmetini başlatın

    Memcached hizmetini başlatın:

    1. Memcache'nin sunucu tarafını başlatın:

    # / usr / local / bin / memcached -d -m 8096 -u root -l 192.168.77.105 -p 12000 -c 256 -P /tmp/memcached.pid

    -D seçeneği bir arka plan programı başlatmaktır,

    -m Memcache'ye ayrılan bellek miktarıdır, birim MB'dir, burada 8096MB'dir,

    -u, Memcache çalıştıran kullanıcı, burada kök benim,

    -l izlenen sunucunun IP adresidir Birden fazla adres varsa sunucunun IP adresini 192.168.77.105 belirledim,

    -p Memcache'nin dinlediği porttur.Buraya 12000, tercihen 1024'ün üzerinde bir port ayarladım.

    -C seçeneği, çalıştırılacak maksimum eşzamanlı bağlantı sayısıdır, varsayılan 1024'tür, burada 256 ayarladım, sunucunuzun yüküne göre ayarladım,

    -P Memcache'yi kaydetmek için ayarlanan pid dosyasıdır, /tmp/memcached.pid içine kaydederim,

    2. Memcache sürecini sonlandırmak istiyorsanız, şunu yürütün:

    # cat /tmp/memcached.pid veya ps -aux | grep memcache (ilgili işlem kimlik numarasını bulun)

    # kill işlemi kimlik numarası

    Ayrıca birden fazla arka plan yordamı başlatabilirsiniz, ancak bağlantı noktası çoğaltılamaz.

    memcache bağlantısı

    telnet ip bağlantı noktası

    Bağlanmadan önce memcache sunucusuna memcache güvenlik duvarı kuralları eklemeniz gerektiğini unutmayın.

    -A RH-Firewall-1-INPUT -m state - state YENİ -m tcp -p tcp --dport 3306 -j KABUL

    Güvenlik duvarı kurallarını yeniden yükleyin

    hizmet iptables yeniden başlat

    Tamam, şimdi memcache'ye bağlanabilmelisin

    Memcache durum bilgilerini görüntülemek için istemcideki istatistikleri girin

    pid memcache sunucusu işlem kimliği

    uptime Sunucunun çalıştığı saniye sayısı

    zaman sunucusu geçerli unix zaman damgası

    versiyon memcache versiyonu

    pointer_size geçerli işletim sistemi İşaretçi boyutu (32 bit sistem genellikle 32 bittir)

    Rusage_user işleminin kümülatif kullanıcı süresi

    Rusage_system işleminin kümülatif sistem süresi

    curr_items Sunucu tarafından şu anda depolanan öğelerin sayısı

    total_items Sunucu başladığından beri depolanan toplam öğe sayısı

    bayt Mevcut sunucu tarafından öğeleri depolamak için kullanılan bayt sayısı

    curr_connections Şu anda açık olan bağlantıların sayısı

    total_connections Sunucunun başlatılmasından bu yana açılan bağlantıların sayısı

    connection_structures Sunucu tarafından ayrılan bağlantı yapılarının sayısı

    cmd_get get command (get) toplam istek sayısı

    cmd_set set komutu (kaydetme) toplam istek sayısı

    get_hits toplam isabet

    get_misses toplam özlüyor

    tahliyeler Boş bellek elde etmek için silinen öğe sayısı (memcache'ye ayrılan alan dolduğunda, yeni öğelere ayrılan alanı almak için eski öğelerin silinmesi gerekir)

    bytes_read okuma baytları (istek baytları)

    bytes_written gönderilen toplam bayt (sonuç baytlarının sayısı)

    limit_maxbytes Memcache'ye ayrılan bellek boyutu (bayt)

    konu mevcut konu sayısı

    Redis

    Redis Memcache'den sonra yazılmıştır.Herkes genellikle ikisini karşılaştırır.Eğer bir anahtar-değer deposu ise ancak zengin veri türlerine sahipse, tıpkı mevcut lojistik merkezi gibi geçici olarak bir önbellek veri akış merkezi olarak adlandırmak istiyorum. , Sipariş, paket, depo, sınıflandırma, dağıtım, son. LAMP şimdi hala çok popüler PHP mimarisi Bilmiyorum ve yeniden oluştur + MySQL Veya redis + MongoDB Performans karşılaştırması (Gruptaki insanlardan mongodb parçalanmasının kararsız olduğunu duydum).

    Önce reidis'in özelliklerinden bahsedeyim

    1. Kalıcılığı destekleyin

    Redis'in yerel kalıcılığı iki yöntemi destekler: RDB ve AOF. RDB, redis.conf yapılandırma dosyasındaki kalıcılık tetikleyicisini yapılandırır. AOF, redis DB olarak kullanılmazsa, redis'in bir kayıt eklemediği ve kalıcılık dosyasına kaydedileceği (bu kaydı oluşturma komutu kaydedilir) anlamına gelir. Yine de AOF'yi açmak istiyor musunuz? Veriler çok büyük ve yeniden başlatırken ve kurtarırken çok büyük bir proje!

    2. Zengin veri türleri

    Redis, String, Listeler, kümeler, sıralı kümeler, hash'ler gibi birden çok veri türünü destekler.Sina Weibo, esas olarak bu türlere sahip olduğu için nosql yapmak için redis'i kullanacak, zaman sıralama, işlevsel sıralama, Weibo'm ve bana gönderilen bu işlevler Listesi. Ve sıralanmış set

    Güçlü çalıştırma işlevleri yakından ilişkilidir

    3. Yüksek performans

    Bu memcache'ye çok benzer. Hafıza işlem seviyesi milisaniye seviyesindedir ve doğal olarak sabit disk işleminin ikinci seviye işleminden çok daha verimlidir.Baş arama, veri okuma ve sayfa değiştirme gibi daha ucuz işlemler vardır! NOSQL'in ortaya çıkmasının nedeni bu, yüksek performans olmalı

    RDBMS'ye dayalı türev bir üründür.RDBMS'nin de bir önbellek yapısı olmasına rağmen, uygulama düzeyinde her zaman istediğimiz kadar kontrollü değildir.

    4. çoğaltma

    Redis, mysql artımlı replikasyon ile aynı olan ve replikasyon uygulaması çok benzer olan bir master-slave replikasyon şeması sağlar. Bu replikasyon biraz AOF'ye benzer. Replication yeni kayıt komutudur. Ana kütüphanenin yeni kaydı yeni script'i slave kütüphanesine gönderir. Kütüphane betiğe göre kayıtlar üretir.Bu işlem çok hızlıdır.Ağa bağlıdır.Genelde master ve slave aynı yerel alan ağındadır.Bu nedenle redis'in master ve slave'lerinin zamanla senkronize olduğu söylenebilir.Çalışanlar ayrıca bir master ve birden fazla slave'i destekler ve dinamik olarak slave kütüphaneleri ekler. , Slave sayısında herhangi bir sınırlama yoktur. Master-slave kütüphanesi oluşturuldu, sanırım mesh modu hala benimseniyor.Eğer zincir tipi (master-slave-slave-slave ·····) kullanılıyorsa, ilk slave arızalanır ve yeniden başlarsa, önce master'dan veri kurtarma komut dosyasını alın Bu engellemedir.Ana kütüphane verilerinin kurtarma işlemi birkaç terabayt ise, biraz zaman alır, bu işlem sırasında diğer slave'ler ana kütüphane ile senkronize edilemez.

    5. Hızlı güncelleme

    Görünüşe göre redis ile temasa geçtiğimden beri, şimdiye kadar sadece 4 ana sürüm yayınlandı, ancak küçük sürüm sayılmadı. Redis'in yazarı çok aktif bir kişidir, e-posta sorusu veya forum gönderisi olsun, size hızlı ve sabırlı bir şekilde yüksek derecede bakımla cevap verebilir. Birisi bunu sürdürürse, rahatlıkla ve gönül rahatlığıyla kullanalım. Şu anda, yazarın redis için önde gelen geliştirme yönü, redis'in küme yönüdür.

    redis kurulumu

    Redis'in kurulumu aslında oldukça basittir.Genel olarak üç adım vardır: tar paketini indirin, tar paketini açın ve kurun.

    Ancak son zamanlarda 2.6.7'den sonra centos 5.532bit'i kullanırken bir kurulum problemi ile karşılaştım.Aşağıda kurulum sürecinde karşılaşılan problemi resimlerle paylaşacağım. Redis klasöründe make'i çalıştırdığımda aşağıdaki gibi bir hata oluşuyor: undefined reference to ' __sync_add_and_fetch_4 '

    İnternette çok araştırdım ve sonunda https://github.com/antirez/redis/issues/736 adresinde bir çözüm buldum, src / Makefile kafasına CFLAGS = -march = i686 yazın!

    Henüz yüklenemeyen dosyayı silmeyi, yeni kurulum dosyasını yeniden açmayı, Makefile'ı değiştirmeyi ve ardından kurulumu yapmayı unutmayın. Orijinal hatayı bulamayacaksınız

    Bazı öznitelik ek açıklamaları ve temel türdeki redis işlemleri, önceki redis mezesinde ayrıntılı olarak açıklanmıştır, bu yüzden onları burada tekrar etmeyeceğim (esas tembel olmaktır, haha!)

    Son olarak, memcache ve redis'i bir araya getirmek, insanlara daha hızlı ve kullanımı daha kolay olan ikisi arasındaki karşılaştırmayı düşündürmeli, grup uzun süredir bunun için mücadele ediyor, burada sizlerle gördüklerimi paylaşacağım .

    Birisi performansı redis'den çok daha iyi olan bir memcache yayınladıktan sonra, redis yazarı antirez, esas olarak redis ve memcache stres testinin nasıl yapılacağıyla ilgili bir blog yazısı yayınladı.Birisi, birçok açık kaynak yazılımın tuvalete atılması gerektiğini söyledi. Stres testi senaryoları çok 2 olduğu için yazar bunu biraz açıkladı. redis vs memcache kesinlikle elma ile elma karşılaştırmasıdır. Haha, çok açık, ikisi arasındaki karşılaştırma biraz yumurta toplama etkisi mi? Yazar, iyi bir değer elde etmek için aynı çalışma ortamında üç test yaptı ve elde edilen sonuçlar aşağıdaki gibidir:

    Belirtilmesi gereken, bu testte tek çekirdekli işlemenin verileridir.Memcache çok çekirdekli ve çok iş parçacıklı işlemleri destekler (varsayılan etkin değildir), bu nedenle yukarıdaki şekil varsayılan olarak referans anlamındadır, öyleyse, memcache redis'den daha hızlıdır. O halde redis neden çok iş parçacıklı çok çekirdekli işlemeyi desteklemiyor? Yazar da görüşünü ifade etti: Öncelikle çoklu okuma, hata düzeltmeleri ile aynı şey değil.Aslında yazılımı genişletmek kolay değil.Veri tutarlılığı sorunu da var.Tüm redis işlemleri atomik işlemler olduğu için yazar kelime kabusu kullanıyor. Ha ha! Tabii ki, çok iş parçacıklı çalışmayı desteklemiyor. Bazı dezavantajlar olmalı.Örneğin, performans zayıf olmalı.Yazar, performans dezavantajlarını hafifletmek için sürüm 2.2'den sonra redis kümesinin geliştirilmesine odaklandı. Açıkça söylemek gerekirse, dikey olarak çalışmıyor ve yatay olarak gelişiyor.

    Uygulama senaryoları:

    Ehcache, hızlı ve verimli olan jvm sanal makinesinde doğrudan önbelleğe alır; ancak önbellek paylaşımı zahmetlidir ve küme dağıtılmış uygulamalar sakıncalıdır.

    Redis, önbellek hizmetine ecache'den daha az verimli ve veritabanlarından çok daha hızlı olan soketler aracılığıyla erişir.Kümeleri ve dağıtılmış önbellekleri işlemek için uygundur ve olgun çözümlere sahiptir.

    Tek bir uygulama veya yüksek önbellek erişimi gerektiren bir uygulama ise, ehcache kullanın.

    Büyük bir sistemse, önbellek paylaşımı, dağıtılmış dağıtım ve büyük önbellek içeriği vardır. Redis önerilir.

    Ek: ehcache ayrıca bir önbellek paylaşım şemasına sahiptir, ancak yayın önbellek bildirim güncellemelerini gerçekleştirmek için RMI veya Jgroup multicast kullanır.Önbellek paylaşımı karmaşıktır ve sürdürülmesi zordur; basit paylaşım tamamdır, ancak uygun olmayan önbellek kurtarma ve büyük veri önbelleği içerir .

    "Doğa Karnavalı" sizi ormanı birlikte keşfetmeye davet ediyor
    önceki
    William, son 22 yılda Diana'yı asla unutmayacak. Anılarını bulmak için gittiği spor salonuna patronluk taslıyor.
    Sonraki
    American Airlines tarafından uçaktan inmeleri için altı Çinli yolcu "davet edildi" ve netizenler kavga etti!
    Http stres testi için Jmeter (grafik eğitimi)
    Shandong açık hava sergi parkı "Qilu Park" inşaatı tamamladı ve deneme işletmesi aşamasına girdi
    Profesyoneller şok oldu: Notre Dame yangınının arkasında çok fazla hata ve boşluk var
    Js bir nesnenin dizi türü olup olmadığına nasıl karar verir?
    Riverside 5.000 genci bir araya getiriyor
    Pekin'deki insanlar "Foxiangge" ve "Li Bai" yi nasıl telaffuz ediyor?
    Otomatik finans gizli 4S mağazasının kodunu çözme
    Zeng Chunlei: Müdür Lang'tan bir kısa mesaj 3 yıl önce kalbimin düğümünü açtı
    Paylaşım: Yeni web ön uç mühendislerine: Öğrenme yönteminiz doğru mu?
    Tüm insanlık pişmanlıkları! 800 yaşındaki Notre Dame de Paris'te yangın çıktı! Sivri çöktü ve gül penceresi yıkıldı! Fransa Cumhurbaşkanı yeniden yapılanmayı duyurdu
    "Mazu burada kardeşler, kapın!"
    To Top