Apakah Redis mempertahankan data?

122

Saya memahami bahwa Redis menyajikan semua data dari memori, tetapi apakah itu tetap ada di seluruh booting ulang server sehingga ketika server melakukan boot ulang, ia membaca ke dalam memori semua data dari disk. Atau apakah itu selalu merupakan penyimpanan kosong yang hanya untuk menyimpan data saat aplikasi berjalan tanpa ketekunan?

Zuriar
sumber
1
Saya tidak yakin apakah saya memahami pertanyaan Anda dengan benar. Anda dapat menyimpan snapshot ke disk dan membaca dari file itu, jika Anda tidak melakukannya database redis Anda akan kosong saat reboot.
Sefa

Jawaban:

82

Saya sarankan Anda membaca tentang ini di http://redis.io/topics/persistence . Pada dasarnya Anda kehilangan persistensi terjamin saat Anda meningkatkan kinerja dengan hanya menggunakan penyimpanan dalam memori. Bayangkan sebuah skenario di mana Anda INSERT ke dalam memori, tetapi sebelum terus berlanjut ke disk kehilangan daya. Akan ada kehilangan data.

Redis mendukung apa yang disebut "snapshot". Ini berarti bahwa ia akan melakukan salinan lengkap dari apa yang ada di memori pada beberapa titik waktu (misalnya setiap jam penuh). Saat Anda kehilangan daya di antara dua snapshot, Anda akan kehilangan data dari waktu antara snapshot terakhir dan kerusakan (tidak harus pemadaman listrik ..). Redis memperdagangkan keamanan data versus kinerja, seperti yang dilakukan kebanyakan NoSQL-DB.

Kebanyakan database NoSQL mengikuti konsep replikasi di antara beberapa node untuk meminimalkan risiko ini. Redis dianggap lebih sebagai cache cepat daripada database yang menjamin konsistensi data. Oleh karena itu, kasus penggunaannya biasanya berbeda dari database sebenarnya: Anda dapat, misalnya, menyimpan sesi, penghitung kinerja, atau apa pun di dalamnya dengan kinerja yang tidak tertandingi dan tidak ada kerugian nyata jika terjadi kerusakan. Tetapi memproses pesanan / riwayat pembelian dan seterusnya dianggap sebagai pekerjaan untuk database tradisional.

Manuel Arwed Schmidt
sumber
1
Akan sangat bagus jika Anda dapat menambahkan perilaku persistensi default. Suka jawaban @Leonid Beschastny.
yeya
40

Server Redis menyimpan semua datanya ke HDD dari waktu ke waktu, sehingga memberikan beberapa tingkat persistensi.

Ini menyimpan data dalam salah satu kasus berikut:

  • secara otomatis dari waktu ke waktu
  • ketika Anda memanggil perintah secara manualBGSAVE
  • saat redis dimatikan

Tetapi data di redis tidak benar-benar persisten, karena:

  • crash proses redis berarti kehilangan semua perubahan sejak penyimpanan terakhir
  • BGSAVE Operasi hanya dapat dilakukan jika Anda memiliki RAM kosong yang cukup (jumlah RAM ekstra sama dengan ukuran redis DB)

NB: BGSAVE Persyaratan RAM adalah masalah yang nyata, karena redis terus bekerja hingga tidak ada lagi RAM untuk dijalankan, tetapi berhenti menyimpan data ke HDD lebih awal (sekitar 50% dari RAM).

Untuk informasi lebih lanjut, lihat Redis Persistence .

Leonid Beschastny
sumber
1
Sejak jawaban ini ditulis, redis memperkenalkan model persistensi alternatif yang disebut AOF yang memberikan persistensi yang jauh lebih tinggi, tetapi memiliki beberapa kelemahan lain seperti pemanfaatan disk yang lebih tinggi dan startup server yang lebih lambat.
Leonid Beschastny
15

Ini masalah konfigurasi. Anda tidak dapat memiliki data Anda, sebagian atau seluruhnya di Redis. Keputusan terbaik akan ditentukan oleh kebutuhan teknis dan bisnis proyek.

Menurut dokumentasi Redis tentang persistensi, Anda dapat mengatur instans Anda untuk menyimpan data ke dalam disk dari waktu ke waktu atau pada setiap kueri, secara singkat. Mereka menyediakan dua strategi / metode AOF dan RDB (baca dokumentasi untuk melihat detailnya), Anda dapat menggunakan masing-masing sendiri atau bersama-sama.

Jika Anda menginginkan "SQL like persistence", mereka mengatakan:

Indikasi umumnya adalah Anda harus menggunakan kedua metode persistensi jika Anda menginginkan tingkat keamanan data yang sebanding dengan apa yang dapat disediakan PostgreSQL untuk Anda.

Adailson De Castro
sumber
7

Jawabannya umumnya ya , namun jawaban yang lebih lengkap sangat bergantung pada jenis data yang Anda coba simpan. Secara umum, jawaban singkat yang lebih lengkap adalah:

  • Redis bukan yang paling cocok untuk penyimpanan persisten karena ini terutama berfokus pada kinerja
  • Redis benar-benar lebih cocok untuk penyimpanan dalam memori / cacheing data keadaan saat ini yang andal , terutama untuk memungkinkan skalabilitas dengan menyediakan sumber pusat untuk data yang digunakan di banyak klien / server

Karena itu, secara default Redis akan mempertahankan snapshot data pada interval periodik (tampaknya ini setiap 1 menit, tetapi saya belum memverifikasi ini - ini dijelaskan oleh artikel di bawah ini, yang merupakan intro dasar yang baik):

http://qnimate.com/redis-permanent-storage/


TL; DR

Dari dokumen resmi :

  • Persistensi RDB [default] melakukan snapshot point-in-time dari dataset Anda pada interval yang ditentukan.
  • Persistensi AOF [perlu dikonfigurasi secara eksplisit] mencatat setiap operasi tulis yang diterima oleh server, yang akan diputar lagi saat startup server, merekonstruksi set data asli.

Redis harus dikonfigurasi secara eksplisit untuk persistensi AOF, jika diperlukan, dan ini akan mengakibatkan penalti performa serta log yang bertambah. Ini mungkin cukup untuk persistensi yang relatif andal dari aliran data dalam jumlah terbatas.

Chris Halcrow
sumber
5

Anda tidak dapat memilih ketekunan sama sekali. Performa yang lebih baik tetapi semua data hilang saat Redis dimatikan.

Redis memiliki dua mekanisme persistensi: RDB dan AOF.RDB menggunakan snapshooting global penjadwal dan AOF menulis pembaruan ke file log khusus aplikasi yang mirip dengan MySql.

Anda dapat menggunakan salah satunya atau keduanya. Saat Redis melakukan boot ulang, ia membuat data dari membaca file RDB atau file AOF.

songxin
sumber