ในบล็อกโพสต์ก่อนหน้า เราได้ผ่านประโยชน์ของการ caching เทคนิค caching ทั่วไป และวิธี cache ข้อมูล SQL โดยใช้ Upstash Redis ในตัวอย่างโค้ดต่างๆ
เมื่อเราได้ตรวจสอบรายละเอียดและประโยชน์ของการ cache SQL queries ด้วย Upstash Redis แล้ว ตอนนี้เราสามารถก้าวไปข้างหน้าและดูการกระทำจริงได้ เพื่อวัตถุประสงค์นี้ เราสามารถเริ่มต้นด้วย ORM ที่ใช้กันอย่างแพร่หลาย คือ Prisma เพื่อเริ่มดูว่า caching ด้วย Upstash Redis ทำงานอย่างไรสำหรับ database queries
ในบล็อกโพสต์นี้ เราจะสำรวจวิธีผสานรวม Upstash Redis กับ Prisma เพื่อ cache queries โดยใช้เทคนิค cache-aside ลดโหลดฐานข้อมูล และเพิ่มประสิทธิภาพแอปพลิเคชัน
Prisma คืออะไร?
ก่อนตั้งค่า Prisma มาเช็กคำศัพท์บางอย่างและดูว่า Prisma ทำอะไรได้บ้าง
ก่อนอื่น Prisma เป็นเครื่องมือ Object Relational Mapper (ORM) ที่ให้ interface ระหว่างแอปพลิเคชันและฐานข้อมูล
ORM เป็นเทคนิคการเขียนโปรแกรมที่ช่วยให้นักพัฒนาสามารถโต้ตอบกับฐานข้อมูลโดยใช้โค้ดเชิงวัตถุระดับสูง แทนที่จะเขียน raw SQL queries โดยตรง อย่างง่ายๆ มันให้ bridge เชื่อมระหว่าง relational databases และภาษาโปรแกรมมิ่งเชิงวัตถุ
ORM map ตารางฐานข้อมูลเป็น classes หรือ models ในภาษาโปรแกรม แต่ละแถวในตารางตรงกับ instance ของ class นี่คือ data modelling พื้นฐานที่เราทำในแอปพลิเคชันที่เขียนด้วยภาษาเชิงวัตถุ ORM ทำให้เราสะดวกและให้ methods แทนการเขียน SQL queries โปรแกรมเมอร์สามารถเรียก methods บน objects หรือ classes เพื่อดำเนินการ CRUD operations
ตัวอย่าง การ query ตาราง users ใน raw SQL 长得像这样:
SELECT * FROM users WHERE id = 1;
ใช้ ORM query เดียวกันอาจ长得像这样:
const user = await user.findUnique({ where: { id: 1 } });
ดังนั้น ORM ทำงานที่จำเป็นในการโต้ตอบกับฐานข้อมูลและทำให้ข้อมูลที่ดึงมาใช้งานได้ในโค้ด ให้ความสะดวกสบายมากกับนักพัฒนา
Prisma เป็นหนึ่งใน ORMs ที่พบบ่อยและใช้ง่ายที่สุดในแอปพลิเคชันซอฟต์แวร์
นี่คือตัวชี้วัดบางอย่างว่าทำไม Prisma ถึงเป็นตัวเลือก ORM ที่ดี:
Type-Safe Queries: Prisma auto-generates TypeScript client จาก database schema ของคุณ รับรองว่าคุณจับข้อผิดพลาดได้ระหว่างการพัฒนา แทนที่จะเป็น runtime
Simplified Data Modeling: ด้วยไฟล์
schema.prismaคุณสามารถกำหนดโครงสร้างฐานข้อมูลได้ด้วย syntax แบบ declarative ซึ่ง Prisma แปลงเป็น SQL หรือ API calls ที่จำเป็น เราจะดูตัวอย่างการเขียน model ในไฟล์นี้เพื่อสร้างตารางผ่าน PrismaMulti-Database Support: Prisma ทำงานกับฐานข้อมูลยอดนิยมอย่าง PostgreSQL, MySQL, SQLite, MongoDB และอื่นๆ คุณสามารถหาฐานข้อมูลใน Prisma docs ได้
Migration Management: Prisma ให้ระบบ migration ที่ใช้ง่ายสำหรับเก็บ database schema ให้ sync กับ codebase
Prisma ยังให้ CLI และ Studio (web-based database GUI) เพื่อทำให้จัดการฐานข้อมูลง่ายขึ้นอีก
Prisma Setup
ตอนนี้ มาดูว่าติดตั้งและทำงานในแอปพลิเคชันอย่างไร
เนื่องจากโฟกัสหลักของบล็อกโพสต์นี้คือ caching Prisma queries เราสามารถใช้ SQLite database ง่ายๆ ใน local เพื่อทำ Prisma operations บางอย่างเพื่อสาธิตการทำงานของ Prisma กับฐานข้อมูล
เราควรติดตั้ง sqlite3 ก่อนเพื่อให้แอปของเราสามารถเชื่อมต่อและโต้ตอบกับ SQLite database ได้ ตามที่กล่าวไว้ SQLite setup นี้เพื่อสาธิตอย่างเดียว หากคุณมีความชอบอื่น คุณสามารถหาการผสานรวมประเภทฐานข้อมูลของคุณกับ Prisma ใน Prisma docs ได้
ไปที่ไดเรกทอรีโปรเจกต์ในเทอร์มินัลและติดตั้ง SQLite ที่นี่
npm install sqlite3
ตอนนี้เราควรติดตั้ง Prisma CLI เพื่อใช้ Prisma ORM ได้
npm install prisma --save-dev
จากนั้น initialize Prisma การ initialize นี้จะสร้างไดเรกทอรี prisma พร้อมไฟล์ schema.prisma ไฟล์ schema.prisma คือที่ที่คุณกำหนดโครงสร้างฐานข้อมูล (models, fields, ฯลฯ)
npx prisma init
ตอนนี้ เราจะกำหนด Prisma schema มาเปิดไฟล์ prisma/schema.prisma ใน editor
ไฟล์นี้ประกอบด้วย 3 บล็อก บล็อกแรกคือ generator ที่กำหนดค่า Prisma ให้สร้าง client ที่ใช้ใน Node.js application ของคุณ บล็อกที่สองคือ datasource block ในบล็อกนี้ เราจะให้ข้อมูลที่จำเป็นเกี่ยวกับฐานข้อมูลของเราเพื่อให้ Prisma เชื่อมต่อ บล็อกสุดท้ายประกอบด้วย database models ที่เราสามารถกำหนดตารางในฐานข้อมูลและฟิลด์ของมัน รวมถึง data types และ constraints
มาดูตัวอย่างด้านล่าง
generator client { provider = "prisma-client-js" } datasource db { provider = "sqlite" url = env("DATABASE_URL") } model user { id Int @id @default(autoincrement()) name String email String @unique age Int? }
comme on peut le voir, nous donnons l'URL de la base de données, en indiquant son type. Au fait, n'oubliez pas de définir une variable d'environnement DATABASE_URL dans votre projet. Pour connecter d'autres types de bases de données, vous pouvez consulter la documentation de Prisma. Dans notre cas d'exemple, nous pouvons simplement le définir sur file:./dev.db.
En plus de cela, nous définissons la table user en définissant ses colonnes avec leurs types et contraintes. Vous pouvez créer des modèles plus sophistiqués avec différents types de bases de données selon vos besoins. Mais pour cette démo, nous pouvons aller avec cette configuration de base.
Pour synchroniser notre schéma avec la base de données en créant les tables nécessaires, nous devrions exécuter la commande de migration. Le drapeau –name donne un nom à cette migration, ce qui facilite le suivi des changements de schéma.
npx prisma migrate dev --name init
SQLite database ของเราพร้อมกับ Prisma ORM แล้ว
Upstash Redis Setup
นี่คือส่วนที่ทำได้เร็วที่สุด เราทำขั้นตอนนี้พันครั้งแล้ว อย่างไรก็ตาม เราจะผ่านขั้นตอนอย่างรวดเร็วที่นี่อีกครั้งเพื่อให้บล็อกโพสต์นี้เป็นคู่มือสมบูรณ์ตั้งแต่ต้นจนจบ ใครที่ทำขั้นตอนเหล่านี้ไปแล้ว ก็แค่ข้ามไปขั้นตอนที่ต้องการ
เราจะสร้างฐานข้อมูล Redis ผ่าน Upstash console
มาสร้างฐานข้อมูล Redis โดยการคลิกปุ่ม "Create database" และทำตามขั้นตอนใน modal ที่โผล่ขึ้นมา
อย่าลืมเลือก read replicas ของฐานข้อมูล Upstash Redis เมื่อเลือก region ของฐานข้อมูล คุณสามารถหาประโยชน์ของ global Redis ในบล็อกโพสต์ก่อนหน้าของผมได้

ฐานข้อมูล Redis พร้อมแล้ว สิ่งที่เหลือเพียงอย่างเดียวในการตั้งค่า Upstash Redis ของเราคือการ initialize Redis client ในแอปพลิเคชันของเรา สำหรับสิ่งนี้ เราจะต้องติดตั้ง Upstash Redis SDK ก่อน
npm install @upstash/redis
จากนั้นเราควรได้ Redis endpoint และ password จาก Upstash Console แล้ว กำหนดค่า Redis client ในโค้ดที่เราจะเชื่อมต่อกับ Upstash Redis
Caching Prisma Queries ด้วย Upstash Redis
comme mentionné précédemment dans ce blog, nous utiliserons la stratégie cache-aside. Pour ce faire, nous vérifierons d'abord le cache pour voir si les données demandées par la requête donnée existent ou non. S'il existe, nous le récupérerons depuis Upstash Redis et le renverrons. Sinon, nous interrogerons la base de données SQL en utilisant le client Prisma généré dans la section ci-dessus et remplirons le cache avec les données récupérées de la base de données SQL.
import { Redis } from '@upstash/redis'; import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); const redis = new Redis({ url: '<UPSTASH-REDIS-ENDPOINT>', token: '<UPSTASH-REDIS-TOKEN>', }) async function getUser(userId: string) { const cacheKey = `user:${userId}`; // Check cache const cachedUser = await redis.get(cacheKey); if (cachedUser) { console.log("Cache hit"); return JSON.parse(cachedUser); } // Query database console.log("Cache miss"); const user = await prisma.user.findUnique({ where: { id: userId }, }); // Store in cache if (user) { await redis.set(cacheKey, JSON.stringify(user), { ex: 3600 }); // Cache for 1 hour } return user; }
comme on peut le voir dans cet exemple, la méthode prisma.<tableName>.findUnique() avec le paramètre qui définit les conditions de la requête permet aux développeurs d'interroger la base de données SQL dans un format de code.
Juste comme exemple, nous pourrions récupérer tous les utilisateurs dans la table user en utilisant la fonction findMany() comme ci-dessous:
const user = await prisma.user.findMany();
สรุป
ในบล็อกโพสต์นี้ เราได้ผ่านวิธีผสานรวม Prisma กับ Upstash Redis สำหรับ caching Prisma queries
ทั้ง Prisma และ Upstash Redis ใช้งานง่ายและตรงไปตรงมา นอกจากสถาปัตยกรรมที่ developer-friendly แล้ว พวกมันยังมีผลกระทบมาก คุณสามารถประหยัดเวลาพัฒนาหลายสิบชั่วโมงได้ด้วยคุณสมบัติ mapping ของ Prisma ที่ช่วยให้จัดการฐานข้อมูลในรูปแบบโค้ดได้ การ cache Prisma queries ด้วย Upstash Redis ยังสามารถลด latency ของการดึงข้อมูลได้อย่างมีนัยสำคัญ และลดโหลดบน SQL database หลักของแอปพลิเคชัน
หวังว่าบล็อกนี้จะช่วยคุณทุกคน!