มือใหม่ Redis part 1: with Docker
Redis ชื่อนี้ได้ยินทุกครั้งที่เขาคุยกันเรื่อง read/write ข้อมูลที่ต้องการความเร็วสูง แว่วว่ามันเก็บข้อมูลไว้บน memory แบบว่าใช้ชั่วคราว หากเครื่องที่รันมันเกิดดับขึ้นมาข้อมูลทั้งหมดก็จะหายไป
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker.
Redis บอกว่าตนเป็น in-memory data structure store คือจัดเก็บโครงสร้างข้อมูลในหน่วยความจำ สามารถใช้เป็นฐานข้อมูล เป็นแคช เป็น message broker ได้
ด้วยเหตุนี้ผมจึงย้อนไปอ่านบทความนานปี หลายคนกล่าวว่า Redis ไม่ใช่ฐานข้อมูล (database) โดยหลักการแล้วมันเก็บข้อมูล in-memory คือชั่วคราวเท่านั้น ไม่เหมือนกับ MySQL, MS SQL Server, Oracle หรือ Mongodb ที่สามารถเก็บข้อมูลแบบฐาวรได้ ??? ใช่แล้วครับ ผมกำลังสับสนว่าตกลงคำว่า in-memory data structure store ของมันหมายความยังไงกันแน่ มันมีความสามารถในการบันทึกข้อมูลแบบถาวรเหมือนชาวบ้านได้หรือเปล่า (แต่ไม่ชูโรงไง) ที่แน่ใจคือมัน read/write ได้เร็วมากๆ ชัวร์ 3 ป๊าบ
ป๊าบ ป๊าบ ป๊าบ!
เนื้อหามันส์ๆ
- ติดตั้ง Redis ด้วย Docker
- pull Redis image, run Redis image และ stop Redis container ด้วย Terminal
- re-run Redis container ด้วย Docker Desktop
- รู้จัก Redis Client
- รู้จัก Redis Client GUI เลือก RedisInsight
ติดตั้ง Redis
โอ้ อันนี้มีหลากหลายวิธีมาก ได้หลาย OS ด้วย ถ้าเป็น MS Windows ผมแนะนำว่าใช้ Docker Desktop จัดการ Redis ดีกว่า ดาวน์โหลดที่นี่
มือใหม่ท่านไหนเคยได้ยินว่า Windows 10 Home ต้องเปิดใช้งาน hyper-v ก่อนจึงจะติดตั้ง Docker Toolbox ได้ (เพื่อใช้งาน Docker) document นี้บอกว่าไม่ต้องทำอย่างนั้นแล้ว
Docker Toolbox has been deprecated and is no longer in active development. Please use Docker Desktop instead.
ตอนนี้สามารถใช้ Windows 10 Home รัน Docker Desktop ได้เลย ที่นี่ แต่ช้าก่อน สสารไม่ได้หายไปไหน ความสะดวกนี้ถูกทดแทนด้วยสิ่งที่เรียกว่า WSL 2 backend เห้อ~ปาดเหงื่อ
- ผมใช้เครื่อง Mac รุ่น Pro ปี 2018
- ผมติดตั้ง Docker Desktop เรียบร้อย
ขอ Redis Image
อย่างไรก็ตามผมยังคงชอบ Terminal มาก ดังนั้นขอโชว์การใช้ Terminal ดาวน์โหลด Redis ให้ชมเป็นขวัญตา! ยังไง? ผ่าน Docker อีกที! อ่าวไม่ใช้ Docker Desktop ล่ะ? ไม่ใช้!
docker run redis
เห็น curser นั่นไหม ค้างอยู่อย่างนั้นแสดงว่า Redis กำลังรันอยู่นะจ๊ะ
งั้นให้คำสั่งพื้นฐานที่จำเป็นต่อ Docker command line สักหน่อย
ต้องการหยุด Redis container ที่กำลังรันอยู่
จากขั้นตอนที่แล้วให้กดปุ่ม control + c
ขอดูสถานะ Redis container ที่ถูกหยุด
จากขั้นตอนที่แล้ว พิมพ์
docker container ls --all
คืนชีพ Redis ที่ตายให้ทำงานใหม่
จากขั้นตอนที่แล้ว พิมพ์ docker start <container_id>
ซึ่ง container id ของแต่ละคนจะไม่เหมือนกัน (Docker generate id ให้อัตโนมัติ) จงพิมพ์ container id ไปบางส่วนหรือทั้งหมดก็ได้ ให้มันรู้ว่าเราต้องการคืนชีพ id ไหน ตัวอย่าง
docker start 0ec
ตรวจสอบ docker container ls --all
เอ้~แล้วแบบนี้จะหยุดมันได้ยังไงล่ะ ในเมื่อ curser มันไม่ค้าง ไม่ยาก พิมพ์ docker stop <container_id>
ตัวอย่าง
docker stop 0ec
Docker Desktop
ลองเปิด Docker Desktop กันหน่อย น้อง Redis สบายดีอยู่ไหม
ดูตรง Containers/Apps ถ้าน้องยังไม่พื้นให้ปลุกขึ้นมา กดปุ่ม START
Redis Client
เหมือนกับฐานข้อมูลทั่วไปที่เรารู้จัก เมื่อตัว Redis เป็น server เราก็ต้องใช้โปรแกรมฝั่ง client ไปคุยกับมัน เรียกว่า Redis client ซึ่งก็แถมมาแล้วในกล่อง ชื่อของมันก็คือ redis-cli หาอ่านเพิ่มที่นี่
ตอนนี้ Redis ของผมรันอยู่
เพื่อที่จะเรียก redis-cli ที่อยู่ใน Redis container ผมต้องบอกกับ Docker ว่า docker exec -it <container_id> redis-cli
ตัวอย่าง
docker exec -it 0ec redis-cli
ทดสอบพิมพ์เล่น ping มันต้องตอบ PONG หรือพิมพ์ ping Hello แล้วรอดูมันว่าไง
ผลลัพธ์
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> ping Hello
“Hello”
127.0.0.1:6379>
เยี่ยมมากเจ้าหนู!
และถ้าจะออกจาก redis-cli ก็บอกมันไปว่า exit
แล้ว enter
มือใหม่ถามว่าถ้าเป็น Docker Desktop ล่ะทำไง? คำตอบ กดปุ่มนี้ได้เลย แล้วพิมพ์ redis-cli
Redis Client GUI
มีหลายจ้าวเลยนะเท่าที่มองหา เช่น
RedisInsight
ขอลอง RedisInsight ผ่าน Docker นะครับ พิมพ์
docker run -v redisinsight:/db -p 8001:8001 --name redislnsight redislabs/redisinsight:latest
--name
คือการตั้งชื่อ ในที่นี้ใช้ redislnsight
-v
คือ volume เมื่อด้านซ้ายของเครื่องหมาย : คือที่เครื่องของเรา ส่วนด้านขวาคือที่อยู่ภายใน container
-p
คือ port เมื่อด้านซ้ายของเครื่องหมาย : คือหมายเลข port ที่เราต้องการใช้ ส่วนด้านขวาคือหมายเลข port ที่ container ใช้
จากนั้นเข้าใช้งานที่ http://localhost:8001
ยอมรับข้อตกลง ส่วนข้อมูลการใช้งานแล้วแต่เราจะอนุญาตหรือไม่ บอกมันว่าเรามีฐานข้อมูลอยู่แล้ว จากนั้นเลือก Connect to a Redis Database
แต่เดี๋ยวก่อน!
ตัว Redis ที่รันอยู่ไม่มีการกำหนด port เลยนะ โอ๊ะ! งั้นสร้าง container ตัวใหม่งายกว่า (จะหยุด container ตัวเก่าแล้วลบออกก็ได้ตามใจ)
สมมติอยากใช้ port ภายนอกหมายเลข 6379 ส่วนภายในให้เป็น default คือ 6379 เหมือนกัน จะได้ว่า
docker run -p 6379:6379 --name redis-01 redis
ตามประสา Docker ขณะนี้ container ทั้งสองอยู่บน default network เดียวกันคือ bridge network
ผมจะสร้าง network ใหม่ที่เรียกว่า user-defined bridge เพื่อใช้กับมันทั้งสองโดยเฉพาะ (อ่าน document เขาบอกว่าทำอย่างนี้ดีกว่า)
สร้าง network ใหม่ชื่อ my-redis
docker network create my-redis
ขอดูหน่อย
docker network ls
จากนั้นผูก container ชื่อ redislnsight เข้ากับมัน
docker network connect my-redis redislnsight
จากนั้นผูก container ชื่อ redis-01 เข้ากับมัน
docker network connect my-redis redis-01
กลับไปที่เว็บของเรา RedisInsight ระบุตามนี้
- Host คือ container ชื่อ redis-01
แท้จริงเบื้องหลังคือ IP address ซึ่ง Docker จะดูแลเอง - Port คือหมายเลข port ด้านขวาของเครื่องหมาย : ซึ่งเป็นของ redis-01
- Name คือชื่ออะไรก็ได้
กด ADD REDIS DATABASE
กดดู test-01
ความมันส์นี้ยังไม่จบเพียงเท่านั้น ปรบมือให้กำลังใจเพื่อ part ถัดไปจะได้มาไวขึ้น (ขอบตาฉันดำเป็นหมีแล้วเธอเอ๋ย) นอนแล้ว สวัสดีครับ