Redis คืออะไร ..???

Ratapong Ruksasuk
Scale360 Engineering
4 min readJan 30, 2019
หรือมันคือ Lay’s ที่หลายๆคนกินหรือปล่าวน้าาาาา ….

เนื่องจากทางคุณหลีดให้ผมได้ลอง Knowlegde Sharing มาสักหัวข้อ ก่อนหน้านี้ทีมของผมเคยได้ทำ Idempotent ใน service บางตัวทำให้รู้จัก Tools ตัวหนึ่งที่มีชื่อว่า Redis ก่อนหน้านี้ผมก็ยังไม่ค่อยได้รู้อะไรมากมายเพราะคนที่ทำตอนนั้นเป็นพี่ๆในทีมผมก็ยังไม่ได้ลองอ่านรายละเอียดลึกๆ จนกระทั้งมี Knowlegde Sharing ขึ้นมาแล้วทีมเก่าผมก็แยกย้ายกันไปแล้ว ก็เลยต้องมาลองศึกษาแล้วอยากแชร์ในมุมมองของตัวเองที่เข้าใจจากการอ่านมา

เริ่มเข้าเรื่องเลยละกัน Redis คืออะไร ???

Redis เป็น in-memory data structure store ที่สามารถใช้เป็น database , cache หรือ message broker โดยการที่เป็น in-memory มันจะเก็บหน่วยความจำไว้ที่แรมทำให้การทำงานของมันค่อนข้างรวดเร็วมากๆ (ส่วนตัวถ้าใช้ข้อมูลสำเร็จแล้ว อย่าลืม Clear ออกด้วยนะครับอาจจะทำให้กินแรมได้)

ภาษาที่ขึ้น Redis ขึ้นมาถูกเขียนด้วยภาษาซี (C Programming Languague) ตัวภาษามันอยู่ใน Low Level ทำให้เชื่อมต่อได้รวดเร็ว
โดยการใช้งานส่วนใหญ่เก็บข้อมูลที่ไม่ได้จำเป็นมาก จะเก็บข้อมูลที่ช่วยทำให้ระบบทำงานได้ดีขึ้นเช่น Full web-page , Session data , etc.

อีกอย่างหนึ่ง Redis เป็น Open-source ทำให้ developer สามารถนำไปสร้างเป็น Library ใช้ในแต่ละภาษาได้หรือสามารถทำให้ตัว Redis เพิ่ม performance หรือสามารถนำไปใช้งานได้ง่ายขึ้นอีกด้วย แต่ก็อยู่กับ developer หรือผู้ใช้งานด้วยนะครับผม

ถ้า Developer สามารถนำประโยชน์ของ Redis ไปใช้ในการใช้งานจริงและดึง Performance ช่วยลดค่าใช้จ่ายต่อ Request ได้เลย…

Data type ของ Redis มีอะไรบ้าง ???

หลักที่ผมจะมาอธิบายคร่าวๆให้ได้อ่านมี Type : String , Lists, Hashes , Sets , Sort Sets โดยจริงๆ Redis มี type ให้ได้ใช้มากกว่านี้ ซึ่งผมจะมาอธิบายให้ฟัง 5 ตัวที่ได้ยกตัวอย่างขึ้นมาเป็นดังนี้

String

Reference : https://redislabs.com/ebook/part-1-getting-started/chapter-1-getting-to-know-redis/1-2-what-redis-data-structures-look-like/1-2-1-strings-in-redis/

การเก็บค่าข้อมูลของ Type : String จะเป็นในรูปแบบตามภาพด้านบนเลยครับ จะมี Key ที่ใช้ชื่อว่า Hello , Type เป็น String , ค่าที่เก็บไว้ข้างในก็จะเป็น “world” สรุปง่ายได้ดังนี้ ข้อมูลที่เหมาะกับเก็บในรูปแบบ String อาจจะเป็น Response หรือไม่ก็ Session ข้อมูลบางอย่างที่เก็บไว้

Key : Hello , Value : World , Type: String

Lists

https://redislabs.com/ebook/part-1-getting-started/chapter-1-getting-to-know-redis/1-2-what-redis-data-structures-look-like/1-2-2-lists-in-redis/

การเก็บข้อมูลประเภท List ก็จะเป็น List เหมือนทั่วๆไปโดย 1 Key ข้อมูลข้างในสามารถมีได้หลายข้อมูลโดยมี index ที่เก็บไว้ให้ List ตามภาพด้านล่างเลยครับ

ข้อมูลที่เพิ่มลงใน Redis

Sets

https://redislabs.com/ebook/part-1-getting-started/chapter-1-getting-to-know-redis/1-2-what-redis-data-structures-look-like/1-2-3-sets-in-redis/

โดย Sets นั้นจะมีลักษณะการเก็บค่าคล้ายกับ List แต่ Sets ไม่มีเลข order หรือ index เหมือน List โดยการทำมาใช้งานนั้นอาจจะให้ Key 1 ตัวเก็บค่าสักอย่างหลายๆจำนวนโดยไม่ได้สนใจเรื่องการจัดการ Queue หรือลำดับของข้อมูล (ความคิดเห็นส่วนตัว)

Hashes

https://redislabs.com/ebook/part-1-getting-started/chapter-1-getting-to-know-redis/1-2-what-redis-data-structures-look-like/1-2-4-hashes-in-redis/

มาถึงข้อมูลในรูปแบบของ Hashes ในข้อมูลของ Hashes จะมี sub-key และใน sub-key นั้นก็จะเป็น value ตัวอย่างตามภาพดังนี้

โดยตามตัวอย่างที่ผมได้ลอง User_data ก็จะเป็น Key หลัก โดยจะมี sub-key ย่อยๆอีกเช่น name , age , position โดยจะมี value ข้างในของแต่ละ key ในนั้น คาดว่าเหมาะสำหรับเก็บข้อมูล User ชั่วคราวเพื่อนำไปใช้ต่อทันที หรืออื่นๆที่สามารถทำได้มากกว่านี้

Sorted sets

https://redislabs.com/ebook/part-1-getting-started/chapter-1-getting-to-know-redis/1-2-what-redis-data-structures-look-like/1-2-5-sorted-sets-in-redis/

การเก็บข้อมูล Sorted sets จะคล้ายๆกับ Sets + Hash รวมกัน โดยข้อมูลของ Sort sets จะเป็นกับค่ากับ Key เป็นค่าเดียวกันและในแต่ละค่านั้นมี score ที่เราสามารถกำหนดได้เพื่อกำหนดค่าให้กับข้อมูลใน Sets ได้ เหมาะกับทำพวก Scoreboard , Leaderboard หรืออื่นๆ

Real-world with Redis … ใช้ทำอะไรบ้างล่ะ ???

จากที่ผมได้ไปอ่านบทความของเว็บอื่นๆมาว่าในโลกความเป็นจริงนั้น Redis เขาเอามาใช้ทำอะไรบ้าง อ่านมาคร่าวๆเจอดังนี้

  1. Full web-page cache
  2. Leaderboard
  3. Session Storage
  4. Queue
  5. Publish / Subscribe

1. Full web-page cache

จะเป็นการเก็บข้อมูลเว็บไซด์ที่เราเคยเข้ามาแล้ว เพื่อเวลาที่เราจะเข้าไปใหม่อีกรอบโดยจะไม่ต้องโหลดใหม่ ทำให้เราสามารถเข้าถึงได้เว็บได้ทันทีเลยเช่น เราเข้าเว็บ A ใช้เวลา 5 วินาที หลังจากนั้นถ้าเรามาเข้าใช้ใหม่ตัวเว็บที่ถูกเก็บไว้ใน Redis เป็น Cache ที่ได้เซฟไว้อาจจะทำให้เวลาลดลงมาเหลือ 1 วินาที โดยการเก็บค่าใน Redis อาจจะเป็นเก็บค่า String ของ html ไว้ใน Redis ตามภาพข้างล่าง

2. Leaderboard หรือ Scoreboard

ใช้สำหรับการนับคะแนนหรือเป็นกระดานคะแนนแบบ Realtime อย่างเช่นเว็บ Livescore เป็นต้น(แต่เว็บเขาอาจจะไม่ได้ใช้ Redis ก็ได้นะ) โดยใช้ sortset ในสร้างข้อมูลในการทำ Score ขึ้นมา

3. Session Storage

เป็นการ set activity หรือการทำ transaction ของ user โดยเราสามารถบอกได้ว่าในการกระทำส่วนนี้ User คนนี้ได้ทำอะไรไป หรือทำเป็นในรูปแบบ Idempotent เพื่อเก็บ Session Key ตัวหนึ่งว่าใน session นี้เกิดผลลัพธ์อะไรขึ้นและ User ทำอะไรลงไปโดยเราก็สามารถใช้ Redis เข้ามาช่วยได้นะ …

4. Queue

หลักการทำงานก็ใช้ตามชื่อครับระบบ Queue เหมือนเราจะซื้อตั๋วคอนเสริตสักใบเราก็ต้องแย่งกันทำให้อาจเกิด Internal Server Error ขึ้นมาได้โดยวิถีอาจจะช่วยแก้ไขจัดการปัญหานี้ได้ก็เป็นการจัดการ Queue โดย Developer เราสามารถ Set ได้ว่าจะเพิ่มคิวเมื่อไหร่และคนที่อยู่ในคิวนี้เป็น User เราก็สามารถใช้ Redis มาช่วยจัดการตรงนี้ได้

5. Publish / Subscribe

ตัวนี้คล้ายๆ Socket เลยครับโดย Publish จะทำหน้าที่ส่ง Message ไปยัง Channel ที่ต้องการส่ง ส่วน Subscribe ก็จะเป็นตัวรับว่าเราจะรับ Message ใน Channel ที่ได้รับไว้ว่าทาง Publish ส่งอะไรมา ในการทำไปใช้จริงก็จะเป็น Realtime response, Chat หรืออื่นๆ ครับ

สรุปว่า …

Redis จัดเป็น in-memory data ตัวนึงที่เหมาะสมกับการที่จะเก็บข้อมูลชั่วคราวเพื่อลดค่าใช้จ่ายของ Request หรือ ช่วยเพิ่ม Performance ของ app ให้ดีขึ้นยิ่งสามารถทำเป็น Database , Cache , Message queue ทำให้สามารถทำงานได้หลากหลายรูปแบบ

ส่วนที่อยากให้ระวังในความคิดผมเอง ไม่ควรเก็บข้อมูลถาวรลงในนี้เพราะ มันเก็บข้อมูลบน RAM และควรจัดการข้อมูลให้ดีๆ ถ้าเกิดว่าเราไม่มีการ Clear ข้อมูลใน Redis บางทีอาจจะทำให้เครื่องช้าลงได้เพราะมันฝากไว้ที่ RAM (หรือว่า Google Chorme ใช้ Redis หว่า … เอาจริงๆก็มีนะของ Google ทำเอง แต่ไม่รู้ชื่ออะไร)

เปรียบเทียบกับ Tools ที่การทำงานคล้ายๆ Redis เช่น Memcache (cache), RabbitMQ(message queue) หรือ อื่นๆ ขึ้นอยู่กับความพอใจของผู้ใช้ว่าอยากใช้ตัวไหน

ถ้าใครอยากติดตามเกี่ยวกับ Redis เพิ่มเติมได้ทาง Scale360 ก็มี คนที่เคยเขียนอยู่แล้วสามารถไปอ่านติดตามเพิ่มได้ครับผม

Reference

--

--