Memcached, ücretsiz ve açık kaynaklı, yüksek performanslı bir bellek önbelleğe alma sistemidir . Genellikle uygulama performansını artırmak için veritabanı verilerini, API çağrılarını veya sayfa işleme parçalarını RAM’de önbelleğe almak için kullanılır.
Bir sayı kadar küçük veya tamamlanmış bir HTML sayfası kadar büyük veri depolayabilir .
Sistem , TCP aracılığıyla erişilmek üzere tasarlanmıştır , böylece ayrı bir sunucuda çalışabilir ve ayrıca birkaç sunucu arasında dağıtılabilir, bu da verileri depolamak için büyük bir karma tablo oluşturur.
Alan tükendiğinde, eski verilerin üzerine yazılır. Bu nedenle, geçici (sürekli olmayan) bir önbellek olarak ele alınmalıdır , yani verileriniz hala orada olmayabilir.
Kurulum
macOS kullanıyorsanız, Homebrew kullanarak Memcached’i kurmak çok kolaydır :
$ demlemek memcached'i kurun
Sonra bu komutu kullanarak başlatabilirsiniz :
$ /usr/yerel/opt/memcached/bin/memcached
Linux kullanıyorsanız , dağıtımınızın paket yöneticisini kullanarak kolayca kurabilirsiniz.
Bağlanıyor
Varsayılan bağlantı noktası 11211’dir. Telnet kullanarak bağlanmayı deneyelim :
$ telnet localhost 11211
127.0.0.1 deneniyor...
Localhost'a bağlandı.
Çıkış karakteri '^]'.
Harika! Sunucu açık. Şimdi Telnet’ten çıkın (komutu kullanarak ) ve sunucuyla daha rahat etkileşim kurmak için bir Ruby taşıquit
yükleyelim :
mücevher yüklemek dalli
Bir Ruby konsolu ( irb
) çalıştırın ve varsayılan bağlantı noktasını kullanarak sunucuya bağlanın :
'dalli'
önbelleği gerektirir = Dalli::Client.new('localhost')
=> #<Dalli::Client:0x007f999d867e80 @servers=["localhost"], @options={}, @ring=nil>
Temel depolama
Memcached ile bir dizge saklayarak oynamaya başlayalım ve sonra onu alalım:
cache.set 'selam', 'merhaba'
cache.get 'selam'
=> "merhaba"
Gördüğünüz gibi, zaten varsa üzerine yazılacak olan bir key’e bir değer ayarlamakset
için kullanılır . anahtar değerini almak için kullanılır .get
Veriler ayrıca saniye cinsinden bir süre ile sınırlandırılabilir:
cache.set 'selam', 'merhaba', 5
cache.get 'selam'
=> "merhaba"
uyku 5
cache.get 'selam'
=> nil
kullanılarak benzersiz bir sorguda birden fazla değer elde edilebilirget_multi
ve bu da bir hash ile sonuçlanır:
cache.set 'selam1', 'merhaba'
cache.set 'selam2', 'günaydın'
cache.get_multi 'selam1', 'selam2'
=> {"selam1"=>"merhaba", "selam2"=>"iyi Sabah"}
Bu selamları silerek hafızayı biraz boşaltalım :
cache.delete 'selam1'
önbellek.delete 'selam2'
önbellek.get_multi 'selam1', 'selam2'
=> {}
Tüm anahtarları silmek istiyorsanız, flush
ihtiyacınız olan işlem:
önbellek.flush
=> [true]
Veri ekleme
set
Anahtar zaten varsa , komut değerin üzerine yazar:
cache.set 'selam', 'merhaba'
cache.get 'selam'
=> "merhaba"
cache.set 'selam', 'günaydın'
cache.get 'selam'
=> "günaydın"
Bundan kaçınmak için, bunun yerine, anahtar yoksa değeri oluşturacakadd
olan komut kullanılabilir :
# Mevcut bir anahtarın (önceki kod bloğunda tanımlanan) üzerine yazmaz cache.add 'greet', 'iyi akşamlar' cache.get 'greet' => "günaydın"# Yeni anahtarlar için değer oluşturur cache.add 'greet2', 'iyi akşamlar' => "iyi akşamlar"
Verileri değiştirme
replace
mevcut bir anahtarın verilerini değiştirmek için kullanılır:
cache.replace 'selam', 'merhaba!'
cache.get 'selam'
=> "merhaba!"
Ancak anahtar yoksa hiçbir şey yapmaz :
cache.replace 'mevcut olmayan selam', 'merhaba!'
=> sıfır
Verileri ekleme ve başa ekleme
Verileri eklemek veya başa eklemek için Dalli , verilerin önceden raw olarak ayarlanmasını gerektirir :
cache.set 'selam', 'merhaba', 0, ham: doğru
Şimdi şunu ekleyebiliriz :
cache.append 'selam', '!'
cache.get 'selam'
=> "merhaba!"
Ve başına :
cache.prepend 'selam', 'hey! '
cache.get 'selam'
=> "Merhaba! Merhaba!"
Artırma ve azaltma verileri
Bir başka faydalı durum da bir sayaca sahip olmaktır , böylece artırılabilir veya azaltılabilir.
cache.set 'counter', 1, 0, ham: true
cache.incr 'counter'
=> 2
cache.incr 'counter', 2
=> 4
cache.decr 'counter'
=> 3
cache.decr 'counter', 3
=> 0
Kontrol et ve ayarla
Eşzamanlı herhangi bir müşteri tarafından güncellenebilecek bir değere sahip olduğunuzu düşünün (aynı anda güncellemeye çalışın). Bu sorun olmaz mıydı? cas
Bu , değerin güncellenmeden önce diğer istemci tarafından değiştirilip değiştirilmediğini kontrol eden işlem kullanılarak kontrol edilebilen bir yarış durumudur.
Bir işlem gibi çalışır set
, ancak bir blok gerektirir :
cache.set 'config', 'foo'
cache.cas('config') { 'bar' }
cache.get 'config'
=> "bar"
Bu nedenle, bu atomik bir işlemdir .
Çözüm
Memcached’in ne olduğunu ve doğrudan Dalli taşı kullanılarak nasıl kullanılabileceğini gördük . Basit görünebilir, ancak YouTube , Reddit , Facebook , Twitter ve Wikipedia gibi birçok önemli şirketin yaptığı gibi büyük bir web uygulamasının daha hızlı çalışmasına yardımcı olabilir .
Bazen , örneğin özel ihtiyaçları olan bir hizmet geliştirirken doğrudan Memcached ile çalışmak çok önemlidir . Çerçevenin ( örneğin Ruby on Rails ), Dalli gibi bir taş kullanarak önbelleğini Memcached’de depolayabildiği başka zamanlar da vardır .