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

Mengapa kunci Redis tidak kedaluwarsa?

Sunting:Sekarang dengan kode yang diperbarui, saya yakin metodologi Anda pada dasarnya cacat selain dari apa yang Anda laporkan.

Cara Anda mengimplementasikannya, Anda perlu menjalankan KEYS dalam produksi - ini buruk. Saat Anda memperkecil, Anda akan menyebabkan beban pemblokiran sistem yang berkembang, dan tidak perlu, di server. Seperti yang tertulis di setiap bagian dokumentasi, jangan jangan gunakan keys dalam produksi. Perhatikan bahwa pengkodean waktu kedaluwarsa dalam nama kunci tidak memberi Anda manfaat. Jika Anda menjadikan bagian dari nama kunci itu sebagai stempel waktu pembuatan, atau bahkan nomor acak, tidak ada yang akan berubah. Memang, jika Anda menghapus bit itu, tidak akan ada yang berubah.

Rute yang lebih waras adalah menggunakan nama kunci yang tidak bergantung pada waktu. Penggunaan kedaluwarsa menangani fungsi itu untuk Anda. Izinkan kami menyebut acara terbatas tarif Anda sebagai "sesi". Nama kunci Anda tanpa cap waktu adalah "ID sesi". Dengan menetapkan kedaluwarsa 60-an di atasnya, itu tidak akan lagi tersedia pada tanda 61-an. Jadi Anda dapat dengan aman menambah dan membandingkan hasilnya dengan batas Anda tanpa perlu mengetahui waktu saat ini atau waktu kedaluwarsa. Yang Anda butuhkan hanyalah nama kunci statis dan set kedaluwarsa yang sesuai.

Jika Anda INCR kunci yang tidak ada, Redis akan mengembalikan "1" yang berarti ia membuat kunci dan menambahkannya dalam satu langkah/panggilan. jadi pada dasarnya logikanya seperti ini:

  1. buat ID "sesi"
  2. penghitung kenaikan menggunakan ID
  3. bandingkan hasil dengan batas
    1. jika hitungan ==1, setel kedaluwarsa menjadi 60 detik
    2. jumlah id> batasi, tolak

Langkah 3.1 adalah penting. Hitungan 1 berarti ini adalah kunci baru di Redis, dan Anda ingin menetapkan masa berlakunya. Hal lain berarti kedaluwarsa seharusnya sudah ditetapkan. Jika Anda menyetelnya di 3.2, Anda akan menghentikan prosesnya karena penghitung akan bertahan lebih dari 60 detik.

Dengan ini, Anda tidak perlu memiliki nama kunci dinamis berdasarkan waktu kedaluwarsa, dan karenanya tidak perlu menggunakan keys untuk mengetahui apakah ada "sesi" yang ada untuk objek dengan tarif terbatas. Ini juga membuat kode Anda lebih sederhana dan dapat diprediksi, serta mengurangi perjalanan pulang pergi ke Redis - yang berarti beban di Redis akan lebih rendah dan kinerjanya lebih baik. Mengenai bagaimana melakukannya dengan pustaka klien yang Anda gunakan, saya tidak bisa mengatakannya karena saya tidak begitu akrab dengannya. Tetapi urutan dasarnya harus dapat diterjemahkan karena cukup mendasar dan sederhana.

Apa yang belum Anda tunjukkan, bagaimanapun, adalah apa pun untuk mendukung pernyataan bahwa kedaluwarsa tidak terjadi. Yang Anda lakukan hanyalah menunjukkan bahwa Redis memang diperintahkan dan menetapkan kedaluwarsa. Untuk mendukung klaim Anda, Anda harus menunjukkan bahwa kunci tersebut tidak kedaluwarsa. Yang berarti Anda perlu menunjukkan pengambilan kunci setelah waktu kedaluwarsa, dan penghitung tidak "direset" dengan dibuat ulang setelah kedaluwarsa. Salah satu cara Anda dapat melihat kedaluwarsa sedang terjadi adalah dengan menggunakan notifikasi keyspace. Dengan itu Anda akan dapat melihat Redis mengatakan bahwa kunci telah kedaluwarsa.

Di mana proses ini akan sedikit gagal adalah jika Anda melakukan beberapa jendela untuk membatasi laju, atau jika Anda memiliki jendela yang jauh lebih besar (yaitu 10 menit) dalam hal ini set yang diurutkan mungkin merupakan opsi yang lebih waras untuk mencegah pemuatan permintaan di muka - Jika diinginkan. Tapi seperti contoh Anda ditulis, di atas akan bekerja dengan baik.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Redis hash kecepatan menulis sangat lambat

  2. Mendiagnosis kegagalan redis-server yang tidak terduga

  3. Redis tidak update saat banyak request sekaligus

  4. Bagaimana cara terhubung ke instance cluster Docker Redis menggunakan jedis untuk Java?

  5. tidak dapat terhubung ke penampung redis dari penampung aplikasi