Sayaç görsellerini bellekte önbelleğe almak
Bu hizmetin çizdiği sayaç görsellerinin beşte birine yakını artık hiçbir şeyi değiştirmiyor. Önceki kuşaktan kalma, fare hareketlerini izleyen bir betik görseli her harekette yeniden yüklüyor; bu istekler hiçbir şeyi artırmaz olduğundan beri de art arda gelen iki istek bayt bayt aynı resmi üretiyor.
Önbellek için bariz bir aday. İlginç kararlar, onu nereye koymak ve anahtarını neye göre oluşturmaktı.
Diskte değil
Bu hizmet küçük bir sunucuda çalışıyor ve diski bir SD kart. Çizilen görselleri oraya önbelleğe almak kabaca şu anlama gelirdi: günde 70 MB yazma, karşılığında ölçülen kazanç ise günde 1,6 dakika işlemci süresi.
Bu kötü bir takas. SD kartlar yazmaktan bozulur; satın alınan şey ise işlemci gücünün darboğaz olmadığı bir makinede bir yuvarlama hatasından ibaret. Bu yüzden önbellek şurada duruyor: /dev/shm, yani tmpfs, yani RAM. Orada ölçülen: okuma 0,027 ms, yazma 0,036 ms, boş alan 1,9 GB.
Yeniden başlatmada her şey silinir. Bir önbellek için bu bir kayıp değil, olağan durumdur.
Aynı makinede Redis de çalışıyor. Teknolojiyle hiçbir ilgisi olmayan bir nedenle kullanılmadı: başka bir uygulamaya ait ve o uygulama için parolayla korunuyor. Tek bir Redis örneğini paylaşmak, birbiriyle ilgisiz iki hizmeti birbirine bağlardı; birinin kötü günü diğerinin de kötü günü olurdu.
Anahtar sayıları içeriyor
Olağan önbellek anahtarı bir kimlik ile bir geçerlilik süresinden oluşur ve bu süre bir bahistir: son beş dakikada önemli hiçbir şey değişmedi. Bir sayaçta ise değişen şey tam da ekranda gösterilen şeydir.
Bu yüzden gösterilen değerler anahtarın içine giriyor. Bir sayı değişirse anahtar da değişir ve görsel yeniden çizilir. Bahis dikkatle oynanmak yerine ortadan kalkar. Sayılan her ziyaret en azından tüm zamanların toplamını artırır; dolayısıyla sayılan hiçbir ziyarete bayat bir resim sunulamaz. Geriye kalan geçerlilik süresi yalnızca anahtarda olmayan değerler için bir üst sınırdır — haftalık, aylık ve yıllık rakamlar.
Önce doğrulanması gerekenler
Bir önbellek ancak sakladığı şey anahtarının bir fonksiyonuysa güvenlidir. Bu, her tasarım hakkında bir iddiadır ve varsayılmak yerine kontrol edildi:
- hiçbir tasarım şunları kullanmıyor:
rand(),mt_rand(),shuffle()ya dauniqid() - hiçbir tasarım zamanı saat düzeyinden daha ince okumuyor
- eski betiğin izleme parametreleri kod ağacının hiçbir yerinde okunmuyor
Sonuncusu, tüm çalışmanın en güzel başarısızlığını üretti. Bu parametreler henüz anahtarın parçasıyken her istek biraz farklı fare koordinatları taşıyordu, yani her anahtar benzersizdi. Önbellek tam bir gün çalıştı ve şunu kaydetti: 13 isabet. Kusursuz çalışıyordu ve hiçbir şey yapmıyordu; bu da fark edilmesi en zor bozukluk türüdür.
Burada herhangi bir şey ters giderse de — okunamayan dizin, dolu disk, bozuk kayıt — görsel basitçe normal yoldan çizilir. Bir önbellek asla bir sayacın görünmemesinin nedeni olmamalıdır.