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

String redis vs hash Redis untuk mewakili JSON:efisiensi?

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):

  1. 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.

  2. 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.

  3. 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".

  4. 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! :)



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Apakah pengaturan slave-read-only no akan membuat slave mengkonfirmasi setiap pencarian hash dengan master?

  2. Redis — cara terbaik untuk menyimpan peta besar (kamus)

  3. Jedis - Kapan menggunakan returnBrokenResource()

  4. Redis - Pertimbangkan untuk mengganti nama salah satu kacang atau mengaktifkan overriding dengan mengatur spring.main.allow-bean-definition-overriding=true

  5. Bagaimana cara membuat serial peta di Jawa untuk disimpan di Redis?