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

bagaimana menangani sesi kedaluwarsa berdasarkan redis?

Jadi, aplikasi Anda perlu diberi tahu saat sesi berakhir di Redis.

Meskipun Redis tidak mendukung fitur ini, ada beberapa trik yang dapat Anda gunakan untuk menerapkannya.

Pembaruan:Dari versi 2.8.0, Redis mendukung http://redis.io/topics/notifications ini

Pertama, orang-orang memikirkannya:ini masih dalam diskusi, tetapi mungkin akan ditambahkan ke versi Redis yang akan datang. Lihat masalah berikut:

  • https://github.com/antirez/redis/issues/83
  • https://github.com/antirez/redis/issues/594

Sekarang, berikut adalah beberapa solusi yang dapat Anda gunakan dengan versi Redis saat ini.

Solusi 1:menambal Redis

Sebenarnya, menambahkan pemberitahuan sederhana ketika Redis melakukan kedaluwarsa kunci tidak terlalu sulit. Ini dapat diimplementasikan dengan menambahkan 10 baris ke file db.c dari kode sumber Redis. Ini contohnya:

https://gist.github.com/3258233

Patch pendek ini memposting kunci ke daftar #expired jika kunci telah kedaluwarsa dan dimulai dengan karakter '@' (pilihan sewenang-wenang). Ini dapat dengan mudah disesuaikan dengan kebutuhan Anda.

Maka tidak perlu lagi menggunakan perintah EXPIRE atau SETEX untuk menyetel waktu kedaluwarsa untuk objek sesi Anda, dan menulis daemon kecil yang berulang di BRPOP untuk menghapus antrean dari daftar "#expired", dan menyebarkan notifikasi di aplikasi Anda.

Poin penting adalah memahami cara kerja mekanisme kedaluwarsa di Redis. Sebenarnya ada dua jalur yang berbeda untuk kedaluwarsa, keduanya aktif pada saat yang sama:

  • Mekanisme malas (pasif). Kedaluwarsa dapat terjadi setiap kali kunci diakses.

  • Mekanisme aktif. Pekerjaan internal secara teratur (secara acak) mengambil sampel sejumlah kunci dengan set kedaluwarsa, mencoba menemukan kunci yang kedaluwarsa.

Perhatikan bahwa tambalan di atas berfungsi baik dengan kedua jalur.

Akibatnya waktu kadaluarsa Redis tidak akurat. Jika semua kunci memiliki kedaluwarsa, tetapi hanya satu yang akan kedaluwarsa, dan tidak diakses, tugas kedaluwarsa yang aktif mungkin memerlukan beberapa menit untuk menemukan kunci dan kedaluwarsa. Jika Anda membutuhkan akurasi dalam pemberitahuan, ini bukan cara yang harus dilakukan.

Solusi 2:mensimulasikan kedaluwarsa dengan zsets

Idenya di sini adalah untuk tidak bergantung pada mekanisme kedaluwarsa kunci Redis, tetapi mensimulasikannya dengan menggunakan indeks tambahan ditambah daemon polling. Ini dapat bekerja dengan versi Redis 2.6 yang tidak dimodifikasi.

Setiap kali sesi ditambahkan ke Redis, Anda dapat menjalankan:

MULTI
SET <session id> <session content>
ZADD to_be_expired <current timestamp + session timeout> <session id>
EXEC

Kumpulan yang diurutkan to_be_expired hanyalah cara yang efisien untuk mengakses kunci pertama yang harus kedaluwarsa. Daemon dapat melakukan polling pada to_be_expired menggunakan skrip sisi server Lua berikut:

local res = redis.call('ZRANGEBYSCORE',KEYS[1], 0, ARGV[1], 'LIMIT', 0, 10 )
if #res > 0 then
   redis.call( 'ZREMRANGEBYRANK', KEYS[1], 0, #res-1 )
   return res
else
   return false
end

Perintah untuk meluncurkan skrip adalah:

EVAL <script> 1 to_be_expired <current timestamp>

Daemon akan mendapatkan paling banyak 10 item. Untuk masing-masing, itu harus menggunakan perintah DEL untuk menghapus sesi, dan memberi tahu aplikasi. Jika satu item benar-benar diproses (yaitu pengembalian skrip Lua tidak kosong), daemon harus segera mengulang, jika tidak, status tunggu 1 detik dapat diperkenalkan.

Berkat skrip Lua, dimungkinkan untuk meluncurkan beberapa daemon polling secara paralel (skrip menjamin bahwa sesi yang diberikan hanya akan diproses sekali, karena kunci dihapus dari to_be_expired oleh skrip Lua itu sendiri).

Solusi 3:gunakan timer terdistribusi eksternal

Solusi lain adalah dengan mengandalkan timer terdistribusi eksternal. Sistem antrian ringan pohon kacang adalah kemungkinan yang baik untuk ini

Setiap kali sesi ditambahkan dalam sistem, aplikasi memposting ID sesi ke antrian pohon kacang dengan penundaan yang sesuai dengan waktu sesi habis. Sebuah daemon sedang mendengarkan antrian. Ketika dapat dequeue item, itu berarti sesi telah kedaluwarsa. Itu hanya perlu membersihkan sesi di Redis, dan memberi tahu aplikasi.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Apakah memcached dinosaurus dibandingkan dengan Redis?

  2. Apakah ada cara untuk bekerja dengan sesi tanpa mengunci situs ASP.Net MVC?

  3. Tidak dapat terhubung ke Redis di 127.0.0.1:6379:Koneksi ditolak dengan homebrew

  4. Redis Config Set dengan Node jS

  5. Ide untuk menskalakan obrolan di AWS?