Cache gambar penghitung di memori
Hampir seperlima gambar penghitung yang digambar layanan ini tidak lagi mengubah apa pun. Skrip pelacak mouse dari generasi sebelumnya memuat ulang gambar pada setiap gerakan, dan karena permintaan-permintaan itu tidak lagi menambah angka apa pun, dua permintaan berturut-turut menghasilkan gambar yang sama, byte demi byte.
Kandidat yang jelas untuk cache. Keputusan yang menarik adalah di mana menaruhnya dan apa yang dijadikan kuncinya.
Bukan di disk
Layanan ini berjalan di server kecil, dan disknya adalah kartu SD. Menyimpan gambar yang sudah digambar ke dalamnya berarti kira-kira 70 MB penulisan per hari, dengan imbalan penghematan terukur sebesar 1,6 menit waktu CPU per hari.
Itu pertukaran yang buruk. Kartu SD rusak karena penulisan, dan yang didapat hanyalah selisih pembulatan pada mesin yang tidak dibatasi oleh CPU. Karena itu cache ditempatkan di /dev/shm, yang merupakan tmpfs, yang berarti RAM. Diukur di sana: 0,027 ms untuk membaca, 0,036 ms untuk menulis, 1,9 GB kosong.
Semuanya hilang saat reboot. Bagi cache, itu bukan kerugian, melainkan hal yang normal.
Redis berjalan di mesin yang sama. Redis tidak dipakai, karena alasan yang tidak ada hubungannya dengan teknologi: Redis itu milik aplikasi lain dan dilindungi kata sandi untuk aplikasi tersebut. Berbagi satu instans akan mengikat dua layanan yang tidak berhubungan, sehingga hari buruk bagi yang satu menjadi hari buruk bagi yang lain.
Kuncinya memuat angka-angkanya
Kunci cache yang biasa terdiri atas identitas ditambah masa berlaku, dan masa berlaku adalah taruhan: tidak ada hal penting yang berubah dalam lima menit terakhir. Pada penghitung, hal yang berubah justru hal yang ditampilkan.
Karena itu nilai-nilai yang ditampilkan dimasukkan ke dalam kunci. Jika sebuah angka berubah, kuncinya pun berbeda, dan gambar digambar ulang. Taruhannya hilang, bukan sekadar dibuat dengan hati-hati. Setiap kunjungan yang terhitung setidaknya menambah total sepanjang masa, sehingga tidak ada kunjungan terhitung yang bisa mendapat gambar usang. Masa berlaku yang tersisa hanyalah batas atas untuk nilai-nilai yang tidak ada di dalam kunci — angka mingguan, bulanan, dan tahunan.
Apa yang harus diperiksa lebih dulu
Cache hanya aman jika hal yang disimpannya merupakan fungsi dari kuncinya. Itu pernyataan tentang setiap desain, dan pernyataan itu diperiksa, bukan diasumsikan:
- tidak ada desain yang memakai
rand(),mt_rand(),shuffle()atauuniqid() - tidak ada desain yang membaca jam lebih rinci daripada per jam
- parameter pelacakan dari skrip lama tidak dibaca di mana pun dalam kode sumber
Poin terakhir itu menghasilkan kegagalan terbaik dari seluruh upaya ini. Selama parameter-parameter itu masih menjadi bagian dari kunci, setiap permintaan membawa koordinat mouse yang sedikit berbeda, sehingga setiap kunci unik. Cache berjalan selama satu hari penuh dan mencatat 13 hit. Cache itu bekerja sempurna dan tidak melakukan apa pun, jenis kerusakan yang paling sulit disadari.
Dan jika ada yang gagal di sini — direktori tidak dapat dibaca, disk penuh, entri rusak — gambar cukup digambar dengan cara biasa. Cache tidak boleh menjadi alasan sebuah penghitung tidak muncul.