Saya perlu menghentikan semua kunci dalam hash redis, yang lebih lama dari 1 bulan.
108
Ini tidak mungkin , demi menjaga kesederhanaan Redis .
Quoth Antirez, pencipta Redis:
Hai, itu tidak mungkin, gunakan kunci tingkat atas yang berbeda untuk bidang spesifik itu, atau simpan bersama dengan bidang lain yang diajukan dengan waktu kedaluwarsa, ambil keduanya, dan biarkan aplikasi memahami apakah itu masih valid atau tidak berdasarkan waktu saat ini.
Redis tidak mendukung memiliki
TTL
hash selain kunci teratas, yang akan menghentikan seluruh hash. Jika Anda menggunakan cluster yang dipecah, ada pendekatan lain yang dapat Anda gunakan. Pendekatan ini tidak dapat berguna di semua skenario dan karakteristik kinerja mungkin berbeda dari yang diharapkan. Masih layak untuk disebutkan:Saat memiliki hash, strukturnya pada dasarnya terlihat seperti:
Karena kami ingin menambahkan
TTL
kunci anak, kami dapat memindahkannya ke kunci atas. Poin utamanya adalah bahwa kuncinya sekarang harus merupakan kombinasi darihash_top_key
dan kunci anak:Kami menggunakan
{}
notasi dengan sengaja. Ini memungkinkan semua kunci tersebut berada di tempat yang samahash slot
. Anda dapat membaca lebih lanjut di sini: https://redis.io/topics/cluster-tutorialSekarang jika kita ingin melakukan operasi hash yang sama, kita dapat melakukan:
Yang menarik di sini adalah
HGETALL
. Pertama kita mendapatkanhash slot
kunci untuk semua anak kita. Kemudian kami mendapatkan kunci untuk ituhash slot
dan akhirnya kami mengambil nilainya. Kita perlu berhati-hati di sini karena mungkin ada lebih darin
kunci untuk ituhash slot
dan juga mungkin ada kunci yang tidak kita minati tetapi memiliki kunci yang samahash slot
. Kami sebenarnya dapat menulisLua
skrip untuk melakukan langkah-langkah tersebut di server dengan menjalankan perintahEVAL
atauEVALSHA
. Sekali lagi, Anda perlu mempertimbangkan kinerja pendekatan ini untuk skenario khusus Anda.Beberapa referensi lagi:
sumber
Ada framework java Redisson yang mengimplementasikan
Map
objek hash dengan dukungan TTL entri. Ia menggunakanhmap
danzset
objek Redis di bawah tenda. Contoh penggunaan:Pendekatan ini cukup berguna.
sumber
Ini dimungkinkan di KeyDB yang merupakan Fork of Redis. Karena ini adalah Fork yang sepenuhnya kompatibel dengan Redis dan berfungsi sebagai pengganti pengganti.
Cukup gunakan perintah EXPIREMEMBER. Ia bekerja dengan set, hashes, dan set yang diurutkan.
Anda juga dapat menggunakan TTL dan PTTL untuk melihat kedaluwarsa
Dokumentasi selengkapnya tersedia di sini: https://docs.keydb.dev/docs/commands/#expiremember
sumber
Mengenai implementasi NodeJS, saya telah menambahkan
expiryTime
bidang kustom di objek yang saya simpan di HASH. Kemudian setelah jangka waktu tertentu, saya menghapus entri HASH yang kadaluwarsa dengan menggunakan kode berikut:sumber
Array.filter
untuk membuat larikkeys
untuk dihapus dari hash lalu meneruskannya keclient.hdel(HASH_NAME, ...keys)
dalam satu panggilan.const keys = Object.keys(reply).filter(key => reply[key] && JSON.parse(reply[key]).expiryTime < Date.now()); client.hdel(HASH_NAME, ...keys);
Kamu bisa. Berikut ini contohnya.
Gunakan perintah EXPIRE atau EXPIREAT .
Jika Anda ingin mengakhiri kunci tertentu di hash lebih lama dari 1 bulan. Ini tidak mungkin. Perintah redis expire adalah untuk semua kunci dalam hash. Jika Anda mengatur kunci hash harian, Anda dapat mengatur waktu kunci untuk hidup.
sumber
Anda dapat menyimpan kunci / nilai di Redis secara berbeda untuk melakukannya, hanya dengan menambahkan awalan atau namespace ke kunci Anda saat Anda menyimpannya, misalnya "hset_"
Dapatkan kunci / nilai
GET hset_key
sama denganHGET hset key
Tambahkan kunci / nilai
SET hset_key value
sama denganHSET hset key
Dapatkan semua kunci
KEYS hset_*
sama denganHGETALL hset
Mendapatkan semua vals harus dilakukan dalam 2 ops, pertama-tama dapatkan semua kunci
KEYS hset_*
lalu dapatkan nilai untuk setiap kunciTambahkan kunci / nilai dengan TTL atau kedaluwarsa yang merupakan topik pertanyaan:
Catatan :
KEYS
akan mencari kunci yang cocok di seluruh database yang dapat mempengaruhi kinerja terutama jika Anda memiliki database besar.catatan:
KEYS
akan mencari untuk mencocokkan kunci di seluruh database yang dapat mempengaruhi kinerja terutama jika Anda memiliki database yang besar. sementaraSCAN 0 MATCH hset_*
mungkin lebih baik selama tidak memblokir server tetapi kinerja masih menjadi masalah jika database besar.Anda dapat membuat database baru untuk menyimpan secara terpisah kunci-kunci ini yang Anda ingin kedaluwarsa terutama jika mereka adalah sekumpulan kecil kunci.
sumber
hashset
.. dapatkan O (1) himpunan O (1) dapatkan semua O (n)O(n)
untuk sejumlah hal di himpunan,KEYS
ke jumlah hal di DB.scan 0 match namespace:*
mungkin lebih baik selama tidak memblokir serverKami memiliki masalah yang sama dibahas di sini.
Kami memiliki hash Redis, kunci entri hash (pasangan nama / nilai), dan kami perlu menahan waktu kedaluwarsa individu pada setiap entri hash.
Kami menerapkan ini dengan menambahkan n byte data awalan yang berisi informasi kedaluwarsa yang dikodekan ketika kami menulis nilai entri hash, kami juga menyetel kunci untuk kedaluwarsa pada waktu yang terdapat dalam nilai yang sedang ditulis.
Kemudian, saat membaca, kami memecahkan kode awalan dan memeriksa kedaluwarsa. Ini adalah overhead tambahan, namun, pembacaannya masih O (n) dan seluruh kunci akan kedaluwarsa ketika entri hash terakhir telah kedaluwarsa.
sumber
Anda dapat menggunakan Redis Keyspace Notifications dengan menggunakan
psubscribe
dan"__keyevent@<DB-INDEX>__:expired"
.Dengan itu, setiap kali kunci itu kedaluwarsa, Anda akan mendapatkan pesan yang diterbitkan pada koneksi redis Anda.
Mengenai pertanyaan Anda pada dasarnya Anda membuat kunci "normal" sementara menggunakan
set
waktu kedaluwarsa dalam s / ms. Ini harus cocok dengan nama kunci yang ingin Anda hapus di set Anda.Karena kunci sementara Anda akan dipublikasikan ke koneksi redis Anda yang menahan
"__keyevent@0__:expired"
ketika kadaluwarsa, Anda dapat dengan mudah menghapus kunci Anda dari set asli Anda karena pesan akan memiliki nama kunci.Contoh sederhana dalam praktiknya di halaman itu: https://medium.com/@micah1powell/using-redis-keyspace-notifications-for-a-reminder-service-with-node-c05047befec3
doc: https://redis.io/topics/notifications (cari bendera xE)
sumber
Anda dapat menggunakan Set yang Diurutkan dalam redis untuk mendapatkan wadah TTL dengan stempel waktu sebagai skor. Misalnya, setiap kali Anda memasukkan string acara ke dalam set, Anda dapat menyetel skornya ke waktu acara. Dengan demikian Anda bisa mendapatkan data jendela waktu kapan saja dengan menelepon
zrangebyscore "your set name" min-time max-time
Selain itu, kami dapat melakukan kedaluwarsa dengan menggunakan
zremrangebyscore "your set name" min-time max-time
untuk menghapus acara lama.Satu-satunya kelemahan di sini adalah Anda harus melakukan pembenahan dari proses orang luar untuk mempertahankan ukuran set.
sumber
Anda dapat berakhir Redis hash dalam kemudahan, Misalnya menggunakan python
Ini akan menghentikan semua kunci anak dalam hash hashed_user setelah 10 detik
sama dari redis-cli,
setelah 10 detik
sumber
hset
anak kadaluarsa bukan seluruhnyahset
.