Redis คือ In-memory Database ที่เป็น NoSQL แบบ Key-Value ซึ่งถูกนำไปใช้ทำ Caching มากที่สุด แต่นอกจากจะใช้เป็น Cache แล้วเรายังสามารถนำ redis ไปประยุกต์ใช้เก็บข้อมูลในรูปแบบอื่นๆได้อีกด้วย เช่น ใช้ RediSQL สำหรับการจัดเก็บข้อมูลแบบ Relational Database หรือใช้ RedisJSON สำหรับการจัดเก็บข้อมูลแบบ JSON
ข้อดีของ Redis
ข้อดีของ Redis มีดังต่อไปนี้
-
Fast ความเร็วถือว่าเป็นจุดเด่นของ Redis ซึ่ง Redis สามารถอ่านข้อมูลได้ 80,000 Operations/Sec และสามารถเขียนข้อมูลได้ 100,000 Operations/Sec
Operations/Sec ตือจำนวนคำสั่งที่ทำได้ใน 1 วินาที
-
No Schema เนื่องจาก Redis เป็น NoSQL เราจึงไม่จำเป็นต้องสร้าง Schema ขึ้นมาก่อน สามารถนำข้อมูลใส่เข้าไปใน Database ได้เลย
-
Replication ใน Redis สามารถทำ Cluster ได้เลยโดยไม่ต้องติดตั้งเครื่องมือใดๆ
-
Sharding ใน Redis สามารถทำ Sharding ได้เหมือนกับ NoSQL อื่นๆ
ถ้าเราต้องการ Duplicate ข้่อมูลออกไป(ทุกๆ Instance จะมีข้อมูลเหมือนกัน) เราจะใช้ Replication แต่ถ้าข้อมูลของเรามีปริมาณมากไม่สามารถ Duplicate ออกไปได้เราจะใช้ Sharding แทน
Redis ใช้ทำอะไร?
Redis เป็น In-Memory Database ที่ถูกนำมาใช้งานเยอะมากซึ่งตัวอย่างของการนำ Redis ไปใช้มีดังนี้
- Distributed Cache ใน Microservices เราสามารถนำ Redis มาเป็น Cache สำหรับเก็บข้อมูลที่ใช้ร่วมกันหลายๆ Services ซึ่งนอกจากจะช่วยเพิ่มความเร็วในการอ่านเขียนข้อมูลแล้วยังช่วยเพิ่ม Resilience ให้กับระบบได้ด้วย(ถ้า Service ต้นทาง Down เรายังสามารถไปดึงข้อมูลจาก cache แทนได้) อ่านบทความเรื่อง Distributed Cache ต่อได้ที่นี่
- Game Online ใน Game Online เราจะต้อง update คะแนนแบบ Realtime ตลอดเวลา ดังนั้นจะมีการอ่านเขียนข้อมูลเยอะมากๆ Redis จึงเป็นทางเลือกแรกๆในการเก็บข้อมูลใน Game Online
- Session Data ใน Microservices หรือระบบที่ต้องการความเป็น Stateless เพื่อให้รองรับการ Scale เราจะต้องแยก Session Data ของ user ออกมาไว้ใน Database ข้างนอก เพื่อให้สามารถเพิ่ม Instance ขึ้นมาใหม่ได้เรื่อยๆ
- Queuing เราสามารถใช้ Redis เป็นตัวจัดการ Queue เพราะ Redis มี Publish และ Subscribe ให้ใช้งาน
- Data Analytics Redis สามารถอ่านเขียนข้อมูลได้อย่างรวดเร็วจึงถูกนำมาใช้เป็น Storage ที่เก็บข้อมูลไว้ก่อนส่งเข้าไปทำการประมวลผล(Analytics) ด้วยเครื่องมืออื่นๆต่อไป
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 ดังนี้
- ข้อมูลจะไม่มีลำดับ ไม่มีการเรียงก่อนหรือหลัง
- ข้อมูลจะต้องไม่ซ้ำกัน(unique) ถ้าซ้ำกันถือว่าเป็นตัวเดียวกัน
5. Sorted Set
เนื่องจากการไม่มีลำดับของ Set ทำให้เราไม่สามารถเรียงลำดับของข้อมูลที่อยู่ใน Set ได้ดังนั้น Redis จึงมี Sorted Set เพื่อให้เราใส่ Score เพิ่มเข้าไปได้ แล้ว Redis จะนำ Score นี้ไปจัดเรียงสมาชิกใน Set ให้เรา
ใน Sorted Set จะยังคงมีความเป็น SET อยู่ ถ้าเราใส่ Value เขาไปเหมือนกันมันจะมองว่าเป็นสมาขิกตัวเดียวกัน ตามหลักการของ SET นั่นเอง
Redis Stack
Redis stack คือ ชุดของเครื่องมือที่ใช้ในการจัดการ Redis Database และ Redis Module ที่จะช่วยเพิ่มความสามารถให้กับ Redis ที่นอกจากจะเป็น in-memory database(Redis Core) แล้วเมื่อเราเพิ่ม Module ต่างๆเข้าไป Redis จะมีความสามารถมากขึ้นซึ่งใน Redis Stack จะประกอบไปด้วยเครื่องมือและ Module ต่างๆดังนี้
เครื่องมือสำหรับจัดการ Redis
- Redis-CLI เป็น Command Line ที่ใช้จัดการ Redis
- RedisInsight เป็น GUI ที่เข้ามาช่วยจัดการ Redis ช่วยเพิ่มความสะดวกในการใช้งาน Redis และนอกจาการเป็น GUI แล้ว RedisInsight ยังมี Profiler สำหรับวิเคราะห์ Traffic บน Redis Server แบบ Real-time ได้ด้วย
Redis Module
- RedisSearch ช่วยเพิ่มความสามารถในการทำ Full-text search เหมือนกับ elastic search
- RedisJSON เก็บและ query ข้อมูลแบบ JSON ได้ง่ายและรวดเร็วมากๆ รองรับการ query และ update ข้อมูลด้วย JsonPath ทำให้เราสามารถดึงข้อมูลและแก้ไขเฉพาะบางส่วนของ Json Object
- RedisGraph เก็บและสร้างความสัมพันธ์(edges)ให้กับแต่ละ nodes เหมือนกับ Neo4J
- RedisTimeSeries เก็บข้อมูลโดยใช้ Index เป็นเวลา เหมือนกับ InfluxDB หรือ Prometheus ทำให้เราสามารถ query ข้อมูลด้วยการกำหนดเวลาเริ่มต้นและสิ้นสุดได้
- RedisBloom คือ Module ที่จะทำให้ Redis สามารถทำงานกับ Probabilistic Data Structure ใช้สำหรับการวิเคราะห์ Streaming Data โดยจะมี Bloom filter ต่างๆเช่น cuckoo filter, count-min sketch, และ top-k
ซึ่งจะเห็นว่าการใช้งาน 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 วิธีด้วยกัน ดังนี้
-
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 วินาที ไล่ตามเงื่อนไขนี้ไปเรื่อยๆจนจบ
-
AOF (Append Only File): AOF persistence จะเป็นการเก็บ logs ของการ write operation ไว้ด้วย format ของ redis เองซึ่งจะสามารถมีนามสกุล .aof เราสามารถเปิด feature นี้ด้วยการ set ใน redis.conf ตามนี้
appendonly yes appendfilename "appendonly.aof"
-
No persistence: ถ้าต้องการให้ redis ทำหน้าที่เป็นแค่ caching เท่านั้นให้ปิด Append Only File(AOF) และ Redis Database(RDB)
-
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 หลักๆ ดังนี้
- สามารถค้นหาและ filter ข้อมูลใน redis ได้
- แสดง keys ต่างๆที่อยู่ใน redis ออกมาให้คุณเห็นได้ง่าย
- ข้อมูลที่ออกมาเป็น JSON จะถูกจัด format ให้สวยงาม
- ใมี tree view เพื่อให้เห็น group ของข้อมูลอย่างชัดเจน
สามารถอ่านวิธีการติดตั้งและใช้งาน RedisInsight ต่อได้ที่นี่