Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Cara yang dapat diskalakan untuk mencatat data permintaan halaman dari aplikasi PHP?

Hal ini tentu bisa dilakukan dalam berbagai metode. Saya akan membahas setiap opsi yang terdaftar serta beberapa komentar tambahan.

1) Jika NGinx bisa melakukannya, biarkan. Saya melakukannya dengan Apache serta JBOSS dan Tomcat. Saya kemudian menggunakan syslog-ng untuk mengumpulkannya secara terpusat dan memproses dari sana. Untuk rute ini saya menyarankan format pesan log yang dibatasi seperti tab-separated agar lebih mudah untuk diurai dan dibaca. Saya tidak tahu tentang itu mencatat variabel PHP, tetapi tentu saja dapat mencatat informasi header dan cookie. Jika Anda akan menggunakan NGinx logging sama sekali, saya akan merekomendasikan rute ini jika memungkinkan - mengapa login dua kali?

2) Tidak ada "kurangnya kemampuan untuk menanyakan tanggal di kemudian hari", lebih lanjut di bawah.

3) Ini adalah opsi tetapi berguna atau tidaknya tergantung pada berapa lama Anda ingin menyimpan data dan seberapa banyak pembersihan yang ingin Anda tulis. Selengkapnya di bawah.

4) MongoDB pasti bisa bekerja. Anda harus menulis kueri, dan itu bukan perintah SQL sederhana.

Sekarang, untuk menyimpan data di redis. Saat ini saya mencatat hal-hal dengan syslog-ng seperti yang dicatat dan menggunakan tujuan program untuk mengurai data dan memasukkannya ke dalam Redis. Dalam kasus saya, saya memiliki beberapa kriteria pengelompokan seperti berdasarkan vhost dan cluster, jadi struktur saya mungkin sedikit berbeda. Pertanyaan yang perlu Anda jawab terlebih dahulu adalah "data apa yang saya inginkan dari data ini"? Beberapa di antaranya akan menjadi penghitung seperti tarif lalu lintas. Beberapa di antaranya akan menjadi agregat, dan masih banyak lagi yang akan menjadi hal-hal seperti "urutkan halaman saya berdasarkan popularitas".

Saya akan mendemonstrasikan beberapa teknik untuk dengan mudah memasukkan ini ke redis (dan dengan demikian mundur).

Pertama, mari kita pertimbangkan statistik lalu lintas dari waktu ke waktu. Pertama-tama tentukan granularitasnya. Apakah Anda ingin statistik per menit atau statistik per jam sudah cukup? Berikut adalah salah satu cara untuk melacak lalu lintas URL tertentu:

Simpan data dalam set yang diurutkan menggunakan kunci "traffic-by-url:URL:YYYY-MM-DD" dalam set yang diurutkan ini, Anda akan menggunakan perintah zincrby dan menyediakan anggota "HH:MM". misalnya dalam Python di mana "r' adalah koneksi redis Anda:

r.zincrby("traffic-by-url:/foo.html:2011-05-18", "01:04",1)

Contoh ini meningkatkan penghitung untuk url "/foo.html" pada tanggal 18 Mei pukul 1:04 pagi.

Untuk mengambil data untuk hari tertentu, Anda dapat memanggil zrange pada tombol (""traffic-by-url:URL:YYYY-MM-DD") untuk mendapatkan kumpulan yang diurutkan dari yang paling tidak populer hingga yang paling populer. Untuk mendapatkan 10 besar , misalnya, Anda akan menggunakan zrevrange dan memberikan rentangnya. Zrevrange mengembalikan pengurutan terbalik, hit paling banyak akan berada di atas. Beberapa perintah set yang diurutkan tersedia yang memungkinkan Anda melakukan kueri yang bagus seperti pagination, mendapatkan rentang hasil dengan skor minimum, dll.

Anda cukup mengubah atau memperluas nama kunci Anda untuk menangani jendela temporal yang berbeda. Dengan menggabungkan ini dengan zunionstore, Anda dapat secara otomatis menggulung ke periode waktu yang kurang terperinci. Misalnya, Anda dapat melakukan penyatuan semua kunci dalam seminggu atau sebulan dan menyimpan di kunci baru seperti "traffic-by-url:monthly:URL:YYYY-MM". Dengan melakukan hal di atas pada semua URL pada hari tertentu Anda bisa mendapatkan setiap hari. Tentu saja, Anda juga dapat memiliki kunci lalu lintas total harian dan meningkatkannya. Sebagian besar tergantung pada kapan Anda ingin data dimasukkan - offline melalui impor file log atau sebagai bagian dari pengalaman pengguna.

Saya akan merekomendasikan untuk tidak melakukan banyak hal selama sesi pengguna yang sebenarnya karena memperpanjang waktu yang dibutuhkan pengguna Anda untuk mengalaminya (dan memuat server). Pada akhirnya itu akan menjadi panggilan berdasarkan tingkat lalu lintas dan sumber daya.

Seperti yang dapat Anda bayangkan, skema penyimpanan di atas dapat diterapkan ke stat berbasis penghitung apa pun yang Anda inginkan atau tentukan. Misalnya, ubah URL menjadi ID pengguna dan Anda memiliki pelacakan per pengguna.

Anda juga dapat menyimpan log mentah di Redis. Saya melakukan ini untuk beberapa log yang menyimpannya sebagai string JSON (saya memilikinya sebagai pasangan nilai kunci). Kemudian saya memiliki proses kedua yang menarik mereka keluar dan melakukan sesuatu dengan data.

Untuk menyimpan hit mentah, Anda juga dapat menggunakan set yang diurutkan menggunakan Epoch Time sebagai peringkat dan dengan mudah mengambil jendela temporal menggunakan perintah zrange/zrevrange. Atau simpan dalam kunci yang didasarkan pada ID pengguna. Set akan berfungsi untuk ini, seperti halnya set yang diurutkan.

Opsi lain yang belum saya bahas tetapi untuk beberapa data Anda mungkin berguna adalah menyimpan sebagai hash. Ini bisa berguna untuk menyimpan informasi rinci tentang sesi yang diberikan misalnya.

Jika Anda benar-benar menginginkan data dalam database, coba gunakan fitur Pub/Sub Redis dan mintalah pelanggan yang mem-parsingnya ke dalam format terbatas dan membuangnya ke file. Kemudian lakukan proses impor yang menggunakan perintah salin (atau yang setara untuk DB Anda) untuk mengimpor secara massal. DB Anda akan berterima kasih.

Sedikit saran terakhir di sini (saya mungkin sudah mengambil cukup waktu mental) adalah menggunakan perintah kedaluwarsa secara bijaksana dan liberal. Menggunakan Redis 2.2 atau yang lebih baru, Anda dapat mengatur kedaluwarsa pada kunci penghitung genap. Keuntungan besar di sini adalah pembersihan data otomatis. Bayangkan Anda mengikuti skema seperti yang telah saya uraikan di atas. Dengan menggunakan perintah kedaluwarsa, Anda dapat menghapus data lama secara otomatis. Mungkin Anda ingin statistik per jam hingga 3 bulan, lalu hanya statistik harian; statistik harian selama 6 bulan kemudian statistik bulanan saja. Cukup kedaluwarsa kunci per jam Anda setelah tiga bulan (86400*90), harian Anda pada pukul 6 (86400*180) dan Anda tidak perlu melakukan pembersihan.

Untuk geotagging, saya melakukan pemrosesan IP secara offline. Bayangkan satu set yang diurutkan dengan struktur kunci ini:"traffic-by-ip:YYYY-MM-DD" menggunakan IP sebagai elemen dan menggunakan perintah zincryby yang disebutkan di atas, Anda mendapatkan data lalu lintas per-IP. Sekarang, dalam laporan Anda, Anda bisa mendapatkan kumpulan yang diurutkan dan melakukan pencarian IP. Untuk menghemat lalu lintas saat melakukan laporan, Anda bisa mengatur hash di redis yang memetakan IP ke lokasi yang Anda inginkan. Misalnya "geo:country" sebagai kunci dan IP sebagai anggota hash dengan kode negara sebagai nilai yang disimpan.

Peringatan besar yang ingin saya tambahkan adalah jika tingkat lalu lintas Anda sangat tinggi, Anda mungkin ingin menjalankan dua contoh Redis (atau lebih tergantung pada lalu lintas). Yang pertama akan menjadi contoh tulis, Itu tidak akan mengaktifkan opsi bgsave. Jika lalu lintas Anda cukup tinggi, Anda akan selalu melakukan bgsave. Inilah yang saya sarankan untuk contoh kedua. Ini adalah budak yang pertama dan melakukan penyimpanan ke disk. Anda juga dapat menjalankan kueri Anda terhadap slave untuk mendistribusikan beban.

Saya harap itu memberi Anda beberapa ide dan hal untuk dicoba. Bermain-main dengan pilihan yang berbeda untuk melihat apa yang terbaik untuk kebutuhan spesifik Anda. Saya melacak banyak statistik pada situs web lalu lintas tinggi (dan juga statistik log MTA) di redis dan kinerjanya bagus - dikombinasikan dengan Django dan API Visualisasi Google, saya mendapatkan grafik yang tampak sangat bagus.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. kedaluwarsa kunci cache redis pada jam-jam tertentu daripada durasi

  2. Pola Desain JavaScript -- Menghadapi Asinkron yang Tidak Diinginkan

  3. Redis pub/sub di rel

  4. atur kunci kedaluwarsa pada waktu tertentu saat menggunakan Spring caching dengan Redis

  5. Memasukkan Daftar ke Daftar lain di Redis