Skip to content

ทดลองใช้ Redis cache ข้อความยาวๆ เพื่อดูการใช้ memory

Update: หลังจากตามอ่านเรื่อง memory optimization ของ Redis แล้วพบว่า default config <datatype>-max-ziplist-entries และ <datatype>-max-ziplist-value ซึ่งในกรณีนี้คือ hash-max-ziplist-entries และ hash-max-ziplist-value ไม่เหมาะสมกับข้อความที่ใช้ในการทดลอง เพราะ Redis จะ encode ข้อมูลก็ต่อเมื่อขนาดหรือจำนวนข้อมูลน้อยกว่า hash-max-ziplist-entries และ hash-max-ziplist-value ที่ เรา set ไว้ โดย default จะเป็น 512 และ 64 ตามลำดับ

Redis เป็น in-memory key-value storage ที่นิยมใส่เข้ามาใน software stack เพื่อ cache ข้อมูล ในเว็บ official ของ Redis เองแนะนำว่ากรณีที่เราใช้ set เก็บข้อมูลจะใช้ memory เยอะ ยิ่งขนาดข้อมูลยาวก็ยิ่งใช้เยอะ เลยแนะนำให้ใช้ hset จะดีกว่าเพราะข้อมูลจะถูก encode ใน memory ดีกว่า ทำให้ใช้ memory น้อยกว่า โดย time complexity ยังเป็น O(1) เท่าเดิม

จากบล็อกของ Instagram Engineering – Storing hundreds of millions of simple key-value pairs in Redis เขาบอกว่าการใช้ hset แทน set นั้นใช้ memory น้อยลงมากจริงๆ แต่ข้อมูลที่ cache ไว้เป็นเพียง string ของ id สั้นๆ แล้วถ้าเป็นข้อมูลยาวๆ ล่ะ การใช้ memory จะยังน้อยลงหรือเปล่า?

ผมเลยทำแล็บง่ายๆ โดย insert ข้อความยาวๆ 1,000,000 ข้อความโดยใช้ set และ hset ข้อความที่ใช้ทดสอบคือ

ผลปรากฎว่า ถ้าใช้ default config การใช้ memory ไม่ต่างกันเลยในกรณีข้อความยาวๆ ต้องปรับ config ให้เหมาะสมก่อน

สรุปว่ากรณีที่เรา cache ข้อความยาวๆ และต้องการใช้ memory น้อยๆ Redis นั้นไม่เหมาะครับ ควรจะหา solution อื่นมาทดแทน ซึ่งตอนนี้ผมก็พยายามหา solution ที่ดีกว่าอยู่

สรุปว่าถ้าต้องการ cache ข้อมูลยาวๆ ต้องแก้ไข config hash-max-ziplist-entries และ hash-max-ziplist-value ให้เหมาะสมก่อน Redis ถึงจะ encode ข้อมูลและใช้ memory น้อยลง แต่ก็ต้องแลกกับใช้ CPU เพิ่มขึ้นเป็น trade-off ที่เราต้องตัดสินใจเลือกใช้เอาเอง

โค้ดและผลการทดลองทั้งหมดอยู่บน Github ครับ

https://github.com/khasathan/redis-long-text-mem-usage

Be First to Comment

Leave a Reply

Your email address will not be published.