เรารู้จัก Redis กันเถอะ ( ภาค 1 )
พูดถึงเรื่อง Redis เราจะอยากรู้อะไรบ้างนะ
Redis คืออะไร
เราจะใช้ Redis ทำอะไร
ขอดู sample ซักหน่อยเพื่อความเห็นภาพ
บทความนี้เราจะโฟกัสกันเท่านี้ก่อนครับ
ไปต่ออย่างไว
Redis คืออะไร
Redis คือ open source (BSD licensed) เพื่อทำ ฐานข้อมูลที่มีโครงสร้างแบบ key-value ที่เป็น multi-structure และเป็น nosql ( ก็คือไม่มี schema column name ไว้ join กันน่ะ ) ลงใน memory โดยนิยมใช้เก็บข้อมูลที่เรียกดูแบบด่วนๆและบ่อยๆ
โดย Redis สามารถจัดกลุ่มของข้อมูลได้หลายชนิด
strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes with radius queries and streams
พอเดาๆจากชื่อว่าเกี่ยวกับอะไรก็ดูจะนำไปประยุกต์ใช้ได้หลายด้าน แต่ว่าสำหรับงานเล็ก งานใหญ่ทั่วๆไป น่าจะได้จับต้องกันในส่วนที่ ตัวหนา ไว้นั่นหละครับท่านผู้ชม
ประโยชน์ของ Redis
ว่ากันถึงประโยชน์ที่เราจะได้ใช้งานกัน Redis ใช้เก็บข้อมูลที่เราต้องการในระบบ เหมือนกับ MS Access, MySQL, Postgresql, MogoDB, Memcached ที่น่าคุ้นๆตา และอื่นๆอีกมากมาย
โดยแต่ละเจ้าก็มีจุดขายในความสามารถของตัวเองต่างกันไป โดยจุดขาย Radis จะใกล้เคียงกับ Memcached สุด คือเป็นฐานข้อมูล in-memory แบบ key-value และนิยมมาใช้ทำ ตัว cache ข้อมูล ดังนั้นเพื่อความไม่ทับไลน์จนสับสน เราจึงไม่เห็นทั้ง Redis และ Memcached ทำงานร่วมกันในระบบหนึ่งๆ
ทำไมต้อง เก็บข้อมูลไว้ที่ memory กันล่ะ เพราะมันทำให้เราเข้าถึงได้อย่างรวดเร็วทั้งการเก็บค่าและเรียกดู โดยในเว็บของ redis เองก็มีผล benchmark กับหลากหลาย environment -> How fast is Redis? แต่นั่นก็แลกกับการเสียพื้นที่ใน memory ที่ราคาสูงกว่า harddisk แบบหลายเท่าตัว เราจึงไม่แนะนำให้เก็บข้อมูลที่มีขนาดใหญ่และหรือต้องการเก็บยาวๆก็ทำได้เช่นกัน
พูดเกี่ยวกับ key-value ซักนิดพอเห็นภาพ เช่น
home={“owner”: “me”, “person1”: “sister”, “person1”: “brother”}
Key คือ home และ Value คือ Object ทั้งหมด
พูดเกี่ยวกับ cache อีกหน่อย cache คือการทำ สำเนาข้อมูลจากที่ต่างๆที่เราต้องการไว้ในที่ที่ตัวจัดการ cache รู้ เพื่อความสะดวกและประหยัดในการเรียกข้อมูลครั้งต่อๆไป และถ้าต้องการข้อมูลที่สดใหม่ก็ควร update cache พร้อมๆข้อมูลต้นฉบับเสมอ
สุดท้าย…
มาลองใช้ Redis คำสั่งพื้นฐานกันครับ
ต่อไปจะอธิบายการใช้งาน คำสั่งพื้นฐานมากๆ ที่เรียกว่าถ้ามีโอกาสได้ใช้ Redis จะต้องเคยผ่านคำสั่งเหล่านี้แน่ๆนอนๆ แต่ทั้งนี้สามารถเข้าไปดู รายการคำสั่งทั้งหมดของ Redis เพิ่มเติมเองได้ครับ ก็จะแอดแว้นส์ กันไปอีกขั้น
เริ่มจากแรกเราก็ต้องมี redis ก่อน ผมแนะนำให้ใช้ docker ไปก่อนครับ เนื่องจากสะดวกและรวดเร็ว
เมื่อติดตั้ง docker แล้ว เปิด command tool ขึ้นมาพิมพ์ตามผมไปเลย อันนี้เป็นเรื่องของ docker ไม่ใช่ redis
run และ access redis ด้วยคำสั่งตามลำดับ
docker run --name myredis -d redis:5.0.3
เมื่อสำเร็จ docker จะ run redis version 5.0.3 ชื่อ container ว่า myredis สามารถ check ได้ด้วยคำสั่ง
docker ps
จากนั้นให้เราเข้าไปใน container myredis ด้วยคำสั่ง
docker exec -it myredis redis-cli
เมื่อเข้ามาสำเร็จจะสามารถใช้ redis-cli ได้
ทดสอบ ตอบ PONG คือใช้ได้
> PING
PONG
- SET ใช้กำหนดค่าหรือแก้ไขค่าใน key ที่กำหนดไว้แล้ว
ดู parameter ทั้งหมดได้ตามนี้ https://redis.io/commands/set
ต้องการเก็บค่า location1 = emmanuelle , location2 = ramaresort
OK คือ return ซึ่งจะมีหลายๆแบบ ขึ้นกับเจตนาของคำสั่งนั้นๆ
> SET location1 emmanuelle
OK
- GET เรียกดุค่าด้วย key ที่กำหนดไว้ โดยในตัวอย่างคือ name ดู parameter ทั้งหมดได้ตามนี้ https://redis.io/commands/get
return เป็น value ของ name
> GET location1
"emmanuelle"
- INCR เพิ่มค่าด้วย key ของ string ที่ค่าเป็นเลขฐาน 10 ขนาด 64 bit https://redis.io/commands/incr
> SET jan 1
OK
> INCR jan
(integer) 2
> GET jan
"2"
- DECR ลดค่าด้วย key ของ string ที่ค่าเป็นฐาน 10 ขนาด 64 bit https://redis.io/commands/decr
> DECR jan
(integer) 1
> GET jan
"1"
- DEL ลบค่าด้วย key จะ return 1 คือลบไป 1 ตัว เนื่องจากคำสั้งนี้สามารถใส่ key ต่อไปเพื่อลบพร้อมกันได้ดังตัวอย่าง https://redis.io/commands/del
> DEL jan
(integer) 1
> GET jan
(nil)
> SET jan 1
OK
> SET feb 2
OK
> DEL jan feb
(integer) 2
- SETEX กำหนดค่าพร้อมอายุขัยเป็น วินาที ที่จะลบค่าไปเอง https://redis.io/commands/setex
> SETEX say 10 yep
OK
> GET say
“yep”
… 10 วิจาก SETEX เจ้า say ก็สลายไป
> GET say
(nil)
- TTL ขอดูอายุขัยด้วย key https://redis.io/commands/ttl
> SET say yep
OK
> TTL say
(integer) -1
return -1 แปลว่าไม่ได้กำหนดอายุขัย
> SETEX say 10 yap
OK
> TTL say
(integer) 9
> TTL say
(integer) 8
… 10 วิจาก SETEX เจ้า say ก็สลายไปและเมื่อลอง TTL return -2 คือไม่มี say แล้ว
> TTL say
(integer) -2
- PERSIST ยกเลิกการกำหนดอายุขัย https://redis.io/commands/persist
> SETEX say 10 yap
OK
> TTL say
(integer) 9
รีบ PERSIST ก่อน
> PERSIST say
(integer) 1
> TTL say
(integer) -1
แต่ถ้า PERSIST ไม่ทันล่ะก็
> PERSIST say
(integer) 0
return 0 หมายความว่า ไม่มีค่าอยู่แล้วหรือค่านั้นๆไม่มีการกำหนดอายุขัย
เท่านี้ก็พอจะรู้จักกับ redis และพอประยุกต์ ใช้กับงานด้วยคำสั่งพื้นฐาน
และภาคต่อไปเราจะมาแนะนำการใช้งานที่เกี่ยวกับจัดการ sessions ในระบบ จอ บอ จ้า