Coding Gun

Redis คืออะไร?

Redis คือ In-memory Database ที่เป็น NoSQL แบบ Key-Value ซึ่งถูกนำไปใช้ทำ Caching มากที่สุด แต่นอกจากจะใช้เป็น Cache แล้วเรายังสามารถนำ redis ไปประยุกต์ใช้เก็บข้อมูลในรูปแบบอื่นๆได้อีกด้วย เช่น ใช้ RediSQL สำหรับการจัดเก็บข้อมูลแบบ Relational Database หรือใช้ RedisJSON สำหรับการจัดเก็บข้อมูลแบบ JSON

ข้อดีของ Redis

ข้อดีของ Redis มีดังต่อไปนี้

  1. Fast ความเร็วถือว่าเป็นจุดเด่นของ Redis ซึ่ง Redis สามารถอ่านข้อมูลได้ 80,000 Operations/Sec และสามารถเขียนข้อมูลได้ 100,000 Operations/Sec

    Operations/Sec ตือจำนวนคำสั่งที่ทำได้ใน 1 วินาที

  2. No Schema เนื่องจาก Redis เป็น NoSQL เราจึงไม่จำเป็นต้องสร้าง Schema ขึ้นมาก่อน สามารถนำข้อมูลใส่เข้าไปใน Database ได้เลย

  3. Replication ใน Redis สามารถทำ Cluster ได้เลยโดยไม่ต้องติดตั้งเครื่องมือใดๆ

  4. Sharding ใน Redis สามารถทำ Sharding ได้เหมือนกับ NoSQL อื่นๆ

ถ้าเราต้องการ Duplicate ข้่อมูลออกไป(ทุกๆ Instance จะมีข้อมูลเหมือนกัน) เราจะใช้ Replication แต่ถ้าข้อมูลของเรามีปริมาณมากไม่สามารถ Duplicate ออกไปได้เราจะใช้ Sharding แทน

Redis ใช้ทำอะไร?

Redis เป็น In-Memory Database ที่ถูกนำมาใช้งานเยอะมากซึ่งตัวอย่างของการนำ Redis ไปใช้มีดังนี้

Redis Datatype

Redis มี Datatype หลายแบบซึ่งจะตอบโจทย์การใช้งานไม่เหมือนกันซึ่ง Datatype หลักๆที่เราต้องรู้จักมีดังนี้

1. Strings หรือ Numbers

เป็น Datatype พื้นฐานเพราะ Redis เป็น Key-Value Database ซึ่งส่วนใหญ่ Value จะต้องเก็บเป็น String ซึ่งต่าสูงสุดของของ String ที่ใส่ได้มีค่าถึง 512 MB

2. Hash

นอกจาก string แล้วเรายังสามารถเก็บเป็น Hash ได้ด้วย ซึ่งการเก็บข้อมูลเป็น Hash จะเป็นการเก็บ Object ให้นึกถึง Dictionary ใน Programming Language ทั่วไป หรือ Json ใน Javascript

3. List

การเก็บข้อมูลแบบ List จะเป็นการเก็บข้อมูลลงใน Array ซึ่งการเก็บจะเป็นการเก็บข้อมูลแบบมีลำดับในการเข้า

4. Set

การเก็บข้อมูลแบบ Set จะเป็นข้อมูลที่เหมือน Array แต่จะมีลักษณะที่แตกต่างจาก Array ดังนี้

  1. ข้อมูลจะไม่มีลำดับ ไม่มีการเรียงก่อนหรือหลัง
  2. ข้อมูลจะต้องไม่ซ้ำกัน(unique) ถ้าซ้ำกันถือว่าเป็นตัวเดียวกัน

5. Sorted Set

เนื่องจากการไม่มีลำดับของ Set ทำให้เราไม่สามารถเรียงลำดับของข้อมูลที่อยู่ใน Set ได้ดังนั้น Redis จึงมี Sorted Set เพื่อให้เราใส่ Score เพิ่มเข้าไปได้ แล้ว Redis จะนำ Score นี้ไปจัดเรียงสมาชิกใน Set ให้เรา

ใน Sorted Set จะยังคงมีความเป็น SET อยู่ ถ้าเราใส่ Value เขาไปเหมือนกันมันจะมองว่าเป็นสมาขิกตัวเดียวกัน ตามหลักการของ SET นั่นเอง

6. Stream

Stream เป็น Datatypes ที่เหมือนกับ Log คือเราสามารถเพิ่มข้อมูล(Append)เข้าไปใน Field เดียวกันไปเรื่อยๆได้ โดยใช้ Timestamp หรือตัวเลข เป็น Primary key

Redis Stack

Redis stack คือ ชุดของเครื่องมือที่ใช้ในการจัดการ Redis Database และ Redis Module ที่จะช่วยเพิ่มความสามารถให้กับ Redis ที่นอกจากจะเป็น in-memory database(Redis Core) แล้วเมื่อเราเพิ่ม Module ต่างๆเข้าไป Redis จะมีความสามารถมากขึ้นซึ่งใน Redis Stack จะประกอบไปด้วยเครื่องมือและ Module ต่างๆดังนี้

เครื่องมือสำหรับจัดการ Redis

Redis Module

ซึ่งจะเห็นว่าการใช้งาน Redis Stack นั้นช่วยเพิ่มความสะดวกให้กับ Redis ทั้งในแง่ของเครื่องมือที่ใช้ในการจัดการ Redis และ Redis Module ต่างๆที่จะช่วยให้ Redis เป็นมากกว่า In-Memory Database แบบ Key-Value

Redis Persistence

In-Memory Database จะทำการเก็บข้อมูลไว้ใน Memory เพื่อให้ดึงข้อมูลออกมาได้อย่างรวดเร็วแต่ถ้าเกิดมีการ Restart Redis Server ข้อมูลทุกอย่างที่อยู่ใน Memory นั้นจะหายไปทันที ซึ่ง Redis จะมีการ Backup ข้อมูลลง Disk ซึ่งจะทำให้ข้อมูลนั้นมี Durability(ความคงทนถาวร) มากขึ้น ซึ่งเราสามารถกำหนดวิธีการ Backup ใน redis config(ไฟล์ redis.conf) โดยจะมีทางเลือกในการเก็บข้อมูลลง disk ได้ 4 วิธีด้วยกัน ดังนี้

  1. RDB (Redis Database): RDB persistence จะทำการ snapshots เหมือนกับใน database ทั่วไปแต่จะสามารถกำหนดเป็นจำนวน operation ได้ เช่น

    save 3600 1 300 100 60 10000 10 100000
    

    ในตัวอย่างนี้จะเป็นกำหนดว่า ถ้ามี key changes(ข้อมูลมีการเปลี่ยนแปลง) มากกว่า 100,000 ให้ snapshort ทุกๆ 10 วินาที แต่ถ้ามี key changes น้อยกว่า 100,000 แต่มากกว่า 10,000 ให้ snapshort ทุกๆ 60 วินาที ไล่ตามเงื่อนไขนี้ไปเรื่อยๆจนจบ

  2. AOF (Append Only File): AOF persistence จะเป็นการเก็บ logs ของการ write operation ไว้ด้วย format ของ redis เองซึ่งจะสามารถมีนามสกุล .aof เราสามารถเปิด feature นี้ด้วยการ set ใน redis.conf ตามนี้

    appendonly yes
    appendfilename "appendonly.aof"
    
  3. No persistence: ถ้าต้องการให้ redis ทำหน้าที่เป็นแค่ caching เท่านั้นให้ปิด Append Only File(AOF) และ Redis Database(RDB)

  4. RDB + AOF: คุณสามารถเลือกเปิดทั้ง Append Only File(AOF) และ Redis Database(RDB) พร้อมกันได้เลย redis จะเก็บ Logs ลงใน AOF แค่ Operation ที่ยังไม่ได้ถูก Snapshort ไว้เท่านั้น

การติดตั้ง Redis Server ด้วย docker

เราสามารถนำ redis มาใช้งานในเครื่องได้ด้วยคำสั่งนี้

docker run -p 6379:6379 --rm redis redis-server

คำสั่งนี้จะเป็นการตั้ง redis server ขึ่้นมา โดย redis จะใช้ port 6379 ในการสื่อสาร

จัดการ Redis ผ่านทาง Command Line

การเชื่อมต่อกับ redis server เราจะใช้ redis cli ซึ่งจะใช้วิธีการ Download จากที่นี่ได้เลย ซึ่งการใข้งานบน Windows นั้นต้องใช้ run redis-cli ผ่านทาง WSL เท่านั้น จึงทำให้การใช้งานไม่ค่อยสะดวกเท่าไหร่นักในบมความนี้ ผมเลยเลือกใช้ redis-cli ผ่านทาง docker ซึ่งจะง่ายกว่ามาก

docker run -it --rm redis redis-cli -h host.docker.internal

เนื่องจาก container 2 ตัวนี้่ไม่ได้สร้างบน network เดียวกัน ทำให้เราต้อง connect เข้าไปที่ redis server โดยใช้ host.docker.internal แต่ถ้าคุณนำไปสร้างด้วย docker-compose ก็จะต้องอ้าง host ด้วยชื่อ service ใน docker-compose แทน

หลังจากนั้น เราจะเข้าสู่ shell ของ redis ซึ่งเราจะทำการ check ก่อนว่า redis-server นั้นพร้อมใช้งานหรือไม่ด้วยคำสั่ง PING ถ้า redis server ตอบ PONG กลับมาแสดงว่าใช้ได้

redis host.local.internal:6379> ping
PONG

หรือจะเรียกผ่าน redis-cli ตรงๆ แบบนี้ก็ได้

$ redis-cli ping
PONG

จัดการ Redis ผ่าน GUI ด้วย RedisInsight

เราสามารถเลือกจัดการกับ Redis server ผ่านทาง UI ด้วย RedisInsight โดยที่ RedisInsight จะมี feature หลักๆ ดังนี้

สามารถอ่านวิธีการติดตั้งและใช้งาน RedisInsight ต่อได้ที่นี่

อ่านข้อมูลเพิ่มเติมได้ที่

Phanupong Permpimol
Follow me