Ini mungkin pertanyaan yang mudah tetapi saya kesulitan menemukan jawabannya. Bagaimana Redis 2.0 menangani kehabisan memori yang dialokasikan maksimum? Bagaimana cara memutuskan data mana yang akan dihapus atau data mana yang disimpan dalam memori?
111
Jawaban:
Jika Anda mengaktifkan fungsi memori virtual (baru di versi 2.0 atau 2.2, menurut saya), maka Redis mulai menyimpan data yang "tidak terlalu sering digunakan" ke disk saat memori habis.
Jika memori virtual di Redis dinonaktifkan, tampaknya memori virtual sistem operasi mulai digunakan (yaitu swap), dan kinerja turun drastis.
Sekarang, Anda juga dapat mengkonfigurasi Redis dengan parameter maxmemory, yang mencegah Redis menggunakan lebih banyak memori (default).
Versi Redis yang lebih baru memiliki berbagai kebijakan saat memori maksimum tercapai:
Jika Anda memilih kebijakan yang hanya menghapus kunci dengan set EXPIRE, maka saat Redis kehabisan memori, sepertinya program baru saja membatalkan operasi malloc (). Artinya, jika Anda mencoba menyimpan lebih banyak data, operasi itu gagal total.
Beberapa tautan untuk info lebih lanjut (karena Anda seharusnya tidak hanya mengambil kata-kata saya):
sumber
Dari redis.conf , versi 2.8
sumber
maxmemory-policy
di Redis 3.2 sekarangnoeviction
: raw.githubusercontent.com/antirez/redis/3.2/redis.confPerbarui redis 4.0
sumber
Saya baru saja mulai membaca tentang Redis, jadi saya tidak yakin. Tapi, saya menemukan beberapa informasi yang mungkin berguna.
Berikut cuplikan dari http://antirez.com/post/redis-as-LRU-cache.html :
Selain itu, Redis 2.0 memiliki mode VM di mana semua kunci harus masuk ke dalam memori, tetapi nilai untuk kunci yang jarang digunakan dapat berada di disk:
sumber
Jika Anda bertanya-tanya apa yang sebenarnya ditanggapi oleh Redis (2.8) ketika mencapai maksimum yang ditentukan oleh konfigurasinya, tampilannya seperti ini:
sumber
Saya baru-baru ini mengalami situasi tanpa memori bebas dan aplikasi saya terhenti (penulisan tidak mungkin, pembacaan dimungkinkan), menjalankan skrip PHP berhenti mati di jalurnya di tengah jalan dan harus dilakukan
kill -9
secara manual (bahkan setelah memori tersedia).Saya berasumsi kehilangan data (atau ketidakkonsistenan data) telah terjadi, jadi saya melakukan
flushdb
dan memulihkan dari cadangan. Pelajaran yang dipelajari? Cadangan adalah teman Anda.sumber
Redis bukanlah cache seperti memcache, secara default (
maxmemory-policy
parameter disetel kenoeviction
) semua data yang Anda masukkan ke redis tidak akan dihapus, satu-satunya pengecualian adalah menggunakan EXPIRE.sumber