Artikel ini dapat memberikan banyak wawasan di sini:http://redis.io/topics/memory-optimization
Ada banyak cara untuk menyimpan larik Objek di Redis (spoiler :Saya suka opsi 1 untuk sebagian besar kasus penggunaan):
-
Simpan seluruh objek sebagai string yang disandikan JSON dalam satu kunci dan lacak semua Objek menggunakan satu set (atau daftar, jika lebih sesuai). Misalnya:
INCR id:users SET user:{id} '{"name":"Fred","age":25}' SADD users {id}
Secara umum, ini mungkin metode terbaik dalam banyak kasus. Jika ada banyak bidang dalam Objek, Objek Anda tidak bersarang dengan Objek lain, dan Anda cenderung hanya mengakses sebagian kecil bidang pada satu waktu, mungkin lebih baik menggunakan opsi 2.
Keuntungan :dianggap sebagai "praktik yang baik." Setiap Objek adalah kunci Redis yang lengkap. Penguraian JSON cepat, terutama ketika Anda perlu mengakses banyak bidang untuk Objek ini sekaligus. Kekurangan :lebih lambat saat Anda hanya perlu mengakses satu bidang.
-
Simpan setiap properti Objek dalam hash Redis.
INCR id:users HMSET user:{id} name "Fred" age 25 SADD users {id}
Keuntungan :dianggap sebagai "praktik yang baik." Setiap Objek adalah kunci Redis yang lengkap. Tidak perlu mengurai string JSON. Kekurangan :mungkin lebih lambat ketika Anda perlu mengakses semua/sebagian besar bidang dalam Object. Juga, Objek bersarang (Objek dalam Objek) tidak dapat disimpan dengan mudah.
-
Simpan setiap Objek sebagai string JSON dalam hash Redis.
INCR id:users HMSET users {id} '{"name":"Fred","age":25}'
Ini memungkinkan Anda untuk mengkonsolidasikan sedikit dan hanya menggunakan dua kunci, bukan banyak kunci. Kerugian yang jelas adalah bahwa Anda tidak dapat mengatur TTL (dan hal-hal lain) pada setiap Objek pengguna, karena itu hanyalah bidang dalam hash Redis dan bukan kunci Redis yang lengkap.
Keuntungan :Penguraian JSON cepat, terutama ketika Anda perlu mengakses banyak bidang untuk Objek ini sekaligus. Lebih sedikit "polusi" dari namespace kunci utama. Kekurangan :Tentang penggunaan memori yang sama dengan #1 ketika Anda memiliki banyak Objek. Lebih lambat dari #2 ketika Anda hanya perlu mengakses satu bidang. Mungkin tidak dianggap sebagai "praktik yang baik".
-
Simpan setiap properti dari setiap Obyek dalam kunci khusus.
INCR id:users SET user:{id}:name "Fred" SET user:{id}:age 25 SADD users {id}
Menurut artikel di atas, opsi ini hampir tidak pernah disukai (kecuali properti Objek perlu memiliki TTL tertentu atau semacamnya).
Keuntungan :Properti objek adalah kunci Redis lengkap, yang mungkin tidak berlebihan untuk aplikasi Anda. Kekurangan :lambat, menggunakan lebih banyak memori, dan tidak dianggap sebagai "praktik terbaik". Banyak polusi dari namespace kunci utama.
Ringkasan Keseluruhan
Opsi 4 umumnya tidak disukai. Opsi 1 dan 2 sangat mirip, dan keduanya cukup umum. Saya lebih suka opsi 1 (secara umum) karena memungkinkan Anda untuk menyimpan Objek yang lebih rumit (dengan banyak lapisan bersarang, dll.) Opsi 3 digunakan ketika Anda sangat peduli tentang tidak mencemari namespace kunci utama (yaitu Anda tidak ingin ada banyak kunci dalam database Anda dan Anda tidak peduli tentang hal-hal seperti TTL, sharding kunci, atau apa pun).
Jika saya memiliki sesuatu yang salah di sini, harap pertimbangkan untuk meninggalkan komentar dan izinkan saya untuk merevisi jawabannya sebelum downvoting. Terima kasih! :)