- Redka มีเป้าหมายในการสร้างข้อดีของ Redis ขึ้นใหม่บน SQLite พร้อมทำให้เข้ากันได้กับ Redis API
- คุณสมบัติหลัก:
- ข้อมูลไม่จำเป็นต้องพอดีกับขนาด RAM
- รองรับทรานแซกชันแบบ ACID
- เพิ่มความสามารถในการสืบค้นข้อมูลและการทำรายงานผ่าน SQL view
- รองรับทั้งเซิร์ฟเวอร์แบบ in-process (Go API) และแบบ standalone (RESP)
- รองรับคำสั่งและโปรโตคอลที่เข้ากันได้กับ Redis
- ขณะนี้ยังอยู่ระหว่างการพัฒนา และสามารถดูสถานะการรองรับกับโรดแมปได้ในเอกสารด้านล่าง
คำสั่งที่รองรับ
- Redka ตั้งเป้ารองรับชนิดข้อมูลหลัก 5 แบบของ Redis ได้แก่ String, List, Set, Hash และ Sorted Set
- ขณะนี้รองรับ String, Hash, การจัดการ Key และคำสั่งทรานแซกชันแล้ว ส่วน List, Set และ Sorted Set ยังอยู่ระหว่างพัฒนา
- รายการคำสั่งโดยละเอียดดูได้จากต้นฉบับ
วิธีติดตั้ง
เซิร์ฟเวอร์แบบสแตนด์อโลน
- ดาวน์โหลดไฟล์ไบนารีตามระบบปฏิบัติการจากหน้า Release แล้วรัน
- หากใช้ Docker ให้ดาวน์โหลดอิมเมจด้วย
docker pull nalgeon/redka
Go module
- ติดตั้งโมดูลด้วย
go get github.com/nalgeon/redka
- ใช้
github.com/mattn/go-sqlite3 หรือ modernc.org/sqlite เป็น SQLite driver
วิธีใช้งาน
เซิร์ฟเวอร์แบบสแตนด์อโลน
- รันไฟล์ไบนารีที่ดาวน์โหลดมาในรูปแบบ
redka [-h host] [-p port] [db-path]
- ค่าเริ่มต้นคือ host
localhost, port 6379 และไม่มีเส้นทาง DB (เก็บในหน่วยความจำ)
- หากใช้ Docker ให้รันด้วยคำสั่ง
docker run รายละเอียดออปชันเพิ่มเติมดูจากต้นฉบับ
- หลังจากรันเซิร์ฟเวอร์แล้ว สามารถเชื่อมต่อด้วยไคลเอนต์ที่เข้ากันได้กับ Redis เช่น
redis-cli, redis-py, go-redis
เซิร์ฟเวอร์แบบ in-process
- สร้างอ็อบเจ็กต์ DB ด้วยฟังก์ชัน
redka.Open() โดยต้อง import driver ด้วย
- เรียกใช้คำสั่งต่าง ๆ ผ่านเมธอดของอ็อบเจ็กต์
redka.DB
- จัดการทรานแซกชันด้วยเมธอด
View (อ่านอย่างเดียว) และ Update (เขียนได้)
การทำงานแบบคงอยู่ถาวร
- Redka จัดเก็บข้อมูลโดยใช้ตาราง rkey, rstring, rhash ในฐานข้อมูล SQLite
- สามารถสืบค้นข้อมูลด้วย SQL ผ่าน view ของแต่ละชนิดข้อมูล เช่น vstring, vhash
ประสิทธิภาพ
- เปรียบเทียบประสิทธิภาพของ Redis และ Redka ด้วยเครื่องมือ redis-benchmark
- Redka ช้ากว่า Redis ราว 6 เท่าใน SET และราว 2 เท่าใน GET
- ถึงอย่างนั้นก็ยังทำได้ประมาณ 23K writes/วินาที และ 57K reads/วินาที
- หากรันในคอนเทนเนอร์ อาจมีประสิทธิภาพลดลง
โรดแมป
- ในรีลีส 1.0 มีแผนจะเน้นฟังก์ชันหลักของ Redis ยุค 2.x
- รองรับ String, Hash, การจัดการ Key และทรานแซกชันแล้ว
- Sorted Set อยู่ระหว่างพัฒนา
- List และ Set มีแผนจะพัฒนา
- ในเวอร์ชันถัดไปมีแผนเพิ่มชนิดข้อมูลอย่าง Stream, HyperLogLog, Geo และฟังก์ชัน Pub/Sub
- ไม่มีแผนรองรับ Lua scripting, การยืนยันตัวตน/ACL, multi DB, Watch/Unwatch
- และไม่มีแผนทำฟังก์ชัน cluster กับ sentinel เช่นกัน
ความเห็นของ GN⁺
- แนวทางของ Redka ที่เข้ากันได้กับ Redis เป็นส่วนใหญ่พร้อมให้ persistence นั้นน่าสนใจมาก การรองรับทรานแซกชันแบบ ACID ก็ดูจะเป็นข้อดีเช่นกัน
- แม้ด้านประสิทธิภาพจะยังสู้ Redis ไม่ได้ แต่ถ้าต้องการ persistence ก็ถือเป็นทางเลือกที่น่าพิจารณาเพียงพอ
- อย่างไรก็ตาม โครงการยังอยู่ในช่วงเริ่มต้น จึงคงต้องติดตามเรื่องเสถียรภาพต่อไป อีกทั้งยังมีฟังก์ชันหลายอย่างที่ไม่ได้อยู่ในโรดแมป ซึ่งควรพิจารณาเมื่อจะนำไปใช้งานจริง
- สำหรับงาน in-memory คงยากที่จะเอาชนะ Redis ได้อยู่แล้ว แต่ในฐานะ persistence layer ที่อิงกับ SQLite ก็ดูน่าจะใช้งานได้ดี
- ช่วงนี้ในสภาพแวดล้อม edge computing ความต้องการสแตกที่มีน้ำหนักเบากำลังสูงขึ้น และในงานลักษณะนั้นก็อาจลองใช้ Redka แทน Redis ได้
2 ความคิดเห็น
น่าจะมีประโยชน์เวลาอยากให้ scheduler ต่อกับ Redis นะครับ 555
ความคิดเห็นจาก Hacker News
SetMaxConnections(1)อยู่ แม้ SQLite ในโหมด WAL (ซึ่งกำลังใช้อยู่) จะรองรับการเขียนที่ไม่บล็อกการอ่าน ดังนั้นการเปิดให้มี read concurrency ก็อาจมีประโยชน์