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
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 .