มือใหม่ Redis part 1: with Docker

Phai Panda
4 min readMar 16, 2021

--

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
คุณพระ! Docker ดาวน์โหลด Redis image จากนั้นรันมันเป็น container พร้อมทำงาน

เห็น curser นั่นไหม ค้างอยู่อย่างนั้นแสดงว่า Redis กำลังรันอยู่นะจ๊ะ

งั้นให้คำสั่งพื้นฐานที่จำเป็นต่อ Docker command line สักหน่อย

ต้องการหยุด Redis container ที่กำลังรันอยู่

จากขั้นตอนที่แล้วให้กดปุ่ม control + c

ขอดูสถานะ Redis container ที่ถูกหยุด

จากขั้นตอนที่แล้ว พิมพ์

docker container ls --all
คุณเจ้าขา! ดูตรง STATUS, Redis ได้ตายจากไปแล้วเป็นเวลา 3 นาที

คืนชีพ Redis ที่ตายให้ทำงานใหม่

จากขั้นตอนที่แล้ว พิมพ์ docker start <container_id> ซึ่ง container id ของแต่ละคนจะไม่เหมือนกัน (Docker generate id ให้อัตโนมัติ) จงพิมพ์ container id ไปบางส่วนหรือทั้งหมดก็ได้ ให้มันรู้ว่าเราต้องการคืนชีพ id ไหน ตัวอย่าง

docker start 0ec
ขณะนี้ Redis ที่มี container id เป็น 0ecaed8bec1a ของผมได้กลับมาทำงานแล้ว

ตรวจสอบ docker container ls --all

ดูตรง STATUS, Redis กลับมาเป็น Up ถือว่ากำลังทำงานเป็นปกติ

เอ้~แล้วแบบนี้จะหยุดมันได้ยังไงล่ะ ในเมื่อ 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

เรามี GUI พร้อมเครื่องมือสังเกตการณ์!

ความมันส์นี้ยังไม่จบเพียงเท่านั้น ปรบมือให้กำลังใจเพื่อ part ถัดไปจะได้มาไวขึ้น (ขอบตาฉันดำเป็นหมีแล้วเธอเอ๋ย) นอนแล้ว สวัสดีครับ

--

--

No responses yet