Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Redis

เร่งประสิทธิภาพของฐานข้อมูลทั่วโลกด้วย Redis Caching

แอปพลิเคชันซอฟต์แวร์จะมีคุณค่าก็ต่อเมื่อสามารถตอบสนองความต้องการของลูกค้าได้เท่านั้น เมื่อเราพิจารณาความต้องการของลูกค้า ความต้องการแรกที่เราพบคือความเร็วของแอปพลิเคชันและความน่าเชื่อถือของข้อมูล อย่างไรก็ตาม เมื่อแอปพลิเคชันเติบโตและขยายไปทั่วโลก ฐานข้อมูล SQL มักจะกลายเป็นคอขวดด้านประสิทธิภาพเนื่องจากปริมาณการสืบค้นที่เพิ่มขึ้น เวลาแฝงที่สูงขึ้น และฐานผู้ใช้ที่กระจายตามพื้นที่ทางภูมิศาสตร์

เพื่อแก้ไขปัญหาเหล่านี้เมื่อแอปพลิเคชันเติบโตขึ้น การแคชเป็นหนึ่งในวิธีแก้ปัญหาแรกในการลดภาระในฐานข้อมูลหลักสำหรับการสืบค้นซ้ำ ๆ และลดเวลาแฝงเมื่อผู้ใช้ส่งการสืบค้น เมื่อเราพูดถึงแคช เครื่องมือเดียวกันนี้ก็เข้ามาในใจเราแต่ละคนใช่ไหม ใช่แล้ว นั่นคือเรดิส Redis เป็นเครื่องมือที่สมบูรณ์แบบสำหรับการแคชข้อมูลเพื่อลดภาระและทำให้แอปพลิเคชันเร็วขึ้น Upstash ยังมีการจำลอง Redis ที่กระจายทั่วโลก ซึ่งจะทำให้แอปพลิเคชันเร็วกว่าแคชปกติมาก

ในบล็อกนี้ เราจะสำรวจข้อดีทางเทคนิคของการผสานรวม Global Redis เข้ากับฐานข้อมูล SQL อภิปรายเกี่ยวกับผลกระทบที่มีต่อเวลาแฝงและความสามารถในการปรับขนาด และให้ตัวอย่างการใช้งานจริงสำหรับการใช้ Global Redis กับ PostgreSQL และ MySQL

ประโยชน์ของการแคช

เรามาตรวจสอบกันก่อนว่าทำไมเราจึงควรใช้แคช

การแคชมีประโยชน์หลักสองประการที่ฉันอยากจะพูดถึงในบล็อกนี้:การลดภาระฐานข้อมูลและลดเวลาแฝงให้กับผู้ใช้

การลดภาระฐานข้อมูล

ฐานข้อมูล SQL เก่งในการจัดการข้อมูลที่มีโครงสร้างและการสืบค้นที่ซับซ้อน แต่ภายใต้ภาระงานหนัก ฐานข้อมูลเหล่านี้อาจกลายเป็นคอขวดได้ การสืบค้นข้อมูลเดียวกันซ้ำๆ ในปริมาณมาก เช่น รายละเอียดผลิตภัณฑ์ โปรไฟล์ผู้ใช้ หรือการตั้งค่าที่เข้าถึงบ่อย จะใช้ทรัพยากร CPU และ I/O จำนวนมาก ด้วยการแคชผลลัพธ์เหล่านี้ จำนวนการสืบค้นที่เข้าสู่ฐานข้อมูลจะลดลงอย่างมาก ช่วยให้ฐานข้อมูลมุ่งเน้นไปที่งานที่สำคัญมากขึ้น เช่น การประมวลผลธุรกรรมและการอัปเดต

ตัวอย่างเช่น:

  • ไม่มีแคช:คุณลักษณะยอดนิยมบนเว็บไซต์สร้างการสืบค้นฐานข้อมูลที่เหมือนกันหลายล้านรายการทุกวัน ส่งผลให้ประสิทธิภาพการทำงานอื่นช้าลง
  • ด้วยการแคช:ผลลัพธ์การสืบค้นที่เข้าถึงบ่อยจะถูกจัดเก็บไว้ในแคชความเร็วสูง เช่น Redis ซึ่งช่วยลดอัตราการสืบค้นฐานข้อมูลได้มากกว่า 90%

การลดความหน่วง

การลดภาระของฐานข้อมูลนั้นเพื่อสุขภาพของระบบเพื่อให้มั่นใจในความน่าเชื่อถือของข้อมูล การแคชยังช่วยปรับปรุงเวลาที่ผู้ใช้ร้องขอและสืบค้น

เมื่อแอปพลิเคชันค้นหาฐานข้อมูลเดียวกันซ้ำๆ การดึงข้อมูลจะใช้เวลานานเสมอ โดยเฉพาะอย่างยิ่งถ้าแบบสอบถามเหล่านี้สร้างภาระงานขนาดใหญ่บนฐานข้อมูล ความล่าช้าเหล่านี้ทั้งหมดอาจเพิ่มขึ้นอีก นี่เป็นปัญหาอย่างยิ่งสำหรับแอปพลิเคชันที่ต้องการการเข้าถึงข้อมูลแบบเรียลไทม์หรือการจัดการปริมาณการสืบค้นที่สูง ซึ่งแม้แต่ความล่าช้าเล็กน้อยก็อาจส่งผลกระทบต่อประสิทธิภาพได้อย่างมาก

การแคชช่วยแก้ปัญหานี้ด้วยการจัดเก็บข้อมูลที่เข้าถึงบ่อยไว้ในหน่วยความจำ ซึ่งสามารถดึงข้อมูลได้เร็วกว่าการสืบค้นฐานข้อมูลมาก ด้วยการลดการพึ่งพาการสืบค้นฐานข้อมูลสำหรับการร้องขอซ้ำ ๆ การแคชจะลดการเดินทางของเครือข่ายให้เหลือน้อยที่สุด และหลีกเลี่ยงค่าใช้จ่ายในการคำนวณในการดำเนินการสืบค้นที่ซับซ้อน ผลที่ได้คือ เวลาตอบสนองได้รับการปรับปรุงอย่างมาก ทำให้แอปพลิเคชันสามารถส่งมอบประสิทธิภาพที่รวดเร็วและสม่ำเสมอยิ่งขึ้น แม้ภายใต้ภาระงานหนักหรือในสภาพแวดล้อมแบบกระจาย

กลยุทธ์การแคชทั่วไป

สิ่งสำคัญคือต้องเข้าใจกลยุทธ์การแคชหลักสองกลยุทธ์ที่ใช้ในการเพิ่มประสิทธิภาพแอปพลิเคชัน:ยกเว้นแคช และ การเขียนผ่าน . แต่ละแนวทางมีกรณีการใช้งานและข้อดีข้อเสีย ขึ้นอยู่กับข้อกำหนดของแอปพลิเคชัน

ยกเว้นแคช เป็นเทคนิคการแคชที่พบบ่อยที่สุด ในเทคนิคนี้ แอปพลิเคชันจะตรวจสอบแคชเพื่อดูข้อมูลก่อน หากข้อมูลไม่อยู่ในแคช (แคชพลาด) จะดึงข้อมูลจากฐานข้อมูลและเขียนลงในแคชเพื่อใช้ในอนาคต

นี่คือแผนภาพง่ายๆ ที่แสดงวิธีการทำงานของการยกเว้นแคช ซึ่งคุณทุกคนอาจเคยเห็นมาแล้วจากที่ใดที่หนึ่งก่อนที่จะมาที่บล็อกนี้

เร่งประสิทธิภาพของฐานข้อมูลทั่วโลกด้วย Redis Caching

ข้อดีของการแคชนี้คือขนาดแคชได้รับการปรับให้เหมาะสม และข้อมูลแคชจะถูกโหลดใหม่เมื่อผู้ใช้ต้องการ ในทางกลับกัน ข้อเสียคือข้อมูลจะไม่สามารถใช้ได้หลังจากที่แคชถูกล้างเมื่อ TTL หมดลง ในเวลานั้น แคชจะถูกโหลดซ้ำเมื่อผู้ใช้ร้องขอข้อมูลนั้น ในกรณีนี้ ผู้ใช้รายนั้นจะต้องรอให้แบบสอบถามเสร็จสิ้น แต่แน่นอนว่าคำขอถัดไปจะสามารถรับข้อมูลจากแคชได้อีกครั้ง

ใน การเขียนผ่าน กลยุทธ์การดำเนินการเขียนทุกครั้งไปยังฐานข้อมูลจะถูกเขียนลงในแคชทันทีเช่นกัน เพื่อให้แน่ใจว่าแคชจะอัปเดตข้อมูลล่าสุดจากฐานข้อมูลอยู่เสมอ

นี่คือไดอะแกรมอย่างง่ายของการแคชการเขียนผ่าน:

เร่งประสิทธิภาพของฐานข้อมูลทั่วโลกด้วย Redis Caching

กลยุทธ์นี้รับประกันความสอดคล้องของข้อมูลระหว่างแคชและฐานข้อมูล และไม่มีคำขอใดพบกับเวลาแฝงที่สูงกว่า เนื่องจากข้อมูลจะพร้อมใช้งานแล้วโดยไม่ต้องรอคำขอจากผู้ใช้ อย่างไรก็ตาม ข้อเสียคือแคชมีข้อมูลทั้งหมด แม้ว่าจะไม่จำเป็นก็ตาม นอกจากนั้น การดำเนินการเขียนทุกครั้งจะได้รับเวลาแฝงเนื่องจากข้อมูลจะถูกเขียนไปยังแคชเช่นกัน

โกลบอล เรดดิสคืออะไร? ประโยชน์ของ Global Redis

ตอนนี้เรามาดูวิธีปรับปรุงประสิทธิภาพของฐานข้อมูล SQL กันดีกว่า

แหล่งที่มาของเวลาแฝงอีกประการหนึ่งคือตำแหน่งของฐานข้อมูล ในกรณีส่วนใหญ่ ฐานข้อมูลหลักจะอยู่ในภูมิภาคเฉพาะ อย่างไรก็ตาม ข้อมูลควรสามารถเข้าถึงได้ในตำแหน่งที่ใกล้ที่สุดเพื่อให้เราสามารถลดความล่าช้าที่เกิดจากระยะทางไปยังที่เก็บข้อมูลได้

ปัญหานี้ป้องกันได้โดยใช้ Redis ที่กระจายทั่วโลกซึ่งจัดทำโดย Upstash

Global Redis เป็นโซลูชันแคชแบบกระจายที่จำลองข้อมูลในตำแหน่งทางภูมิศาสตร์หลายแห่ง เพื่อให้มั่นใจว่ามีการเข้าถึงที่มีความหน่วงต่ำสำหรับแอปพลิเคชันที่กระจายทั่วโลก

มาดูวิธีสร้าง Redis ทั่วโลกกันอย่างรวดเร็ว ขั้นแรก เข้าสู่ระบบคอนโซล Upstash

หลังจากเข้าสู่ระบบแล้ว เราสามารถสร้างฐานข้อมูล Redis ได้ที่นี่ Upstash มีหลายตำแหน่งเพื่อค้นหาแบบจำลองการอ่าน

เร่งประสิทธิภาพของฐานข้อมูลทั่วโลกด้วย Redis Caching

เมื่อเลือกตำแหน่งที่อ่านแล้ว คุณสามารถเลือกแผนและสร้างฐานข้อมูล Redis ของคุณได้ในที่สุด เพียงเท่านี้!

ในคอนโซล คุณสามารถเพิ่ม/ลบขอบเขตหลังจากสร้างฐานข้อมูลได้เช่นกัน

เร่งประสิทธิภาพของฐานข้อมูลทั่วโลกด้วย Redis Caching

ฐานข้อมูล Global Redis ส่วนใหญ่จะใช้โดยแอปพลิเคชันที่กระจายทั่วโลกและแอปพลิเคชันที่ทำงานที่ Edge

เวลาแฝงต่ำสำหรับแอปพลิเคชันที่กระจายทั่วโลก

ในระบบที่กระจายทั่วโลก เวลาแฝงมักจะกลายเป็นคอขวดเนื่องจากระยะห่างทางกายภาพระหว่างผู้ใช้กับฐานข้อมูลกลางหรือแคช Global Redis แก้ไขปัญหานี้ด้วยการจำลองข้อมูลข้ามโหนดที่กระจายตามภูมิศาสตร์หลายแห่ง

เมื่อผู้ใช้ร้องขอข้อมูล โหนดแคชที่ใกล้ที่สุดจะทำหน้าที่ตามคำขอ ซึ่งช่วยลดเวลาการเดินทางของเครือข่ายได้อย่างมาก การเข้าถึงแบบท้องถิ่นนี้รับประกันเวลาตอบสนองที่เร็วขึ้นและประสบการณ์ผู้ใช้ที่สอดคล้องกัน โดยไม่คำนึงถึงตำแหน่งของผู้ใช้

สมมติว่าหากผู้ใช้อยู่ในโตเกียว แต่ฐานข้อมูลอยู่ในดับลิน ระยะทางจะทำให้การตอบสนองต่อผู้ใช้ล่าช้า หากมีแบบจำลองการอ่านของ Upstash Redis ในยุโรป คำขอสามารถกำหนดเส้นทางไปยังแบบจำลองการอ่านที่ใกล้ที่สุด ซึ่งเป็นแบบจำลองในยุโรปในกรณีนี้

ข้อมูลเวลาแฝงต่ำสำหรับ Edge Runtimes (เช่น Cloudflare Workers)

Edge Runtimes คือสภาพแวดล้อมที่ออกแบบมาเพื่อรันโค้ดที่ Edge ของเครือข่ายใกล้กับผู้ใช้ปลายทาง รันไทม์ของ Edge กระจายตรรกะของแอปพลิเคชันไปยังสถานที่ตั้ง Edge หลายแห่งทั่วโลก สถาปัตยกรรมนี้ลดระยะห่างทางกายภาพระหว่างผู้ใช้และการดำเนินการตามคำขอของพวกเขา ซึ่งช่วยลดเวลาแฝงและปรับปรุงประสิทธิภาพได้อย่างมาก

แม้ว่ารันไทม์ Edge จะทำให้ผู้ใช้เข้าใกล้การประมวลผลมากขึ้น แต่พวกเขายังคงต้องการเข้าถึงข้อมูลสำหรับการดำเนินการส่วนใหญ่ เช่น การดึงข้อมูลเฉพาะผู้ใช้ โทเค็นเซสชัน หรือการกำหนดค่า หากไม่มีเลเยอร์การแคช แต่ละคำขอยังคงต้องมีการส่งข้อมูลแบบไปกลับไปยังฐานข้อมูลกลาง ซึ่งจะลบผลประโยชน์ด้านเวลาแฝงไปมาก นี่คือจุดที่ Global Redis มีบทบาทสำคัญ เนื่องจากจะจำลองข้อมูลที่ใช้บ่อยไปยัง Edge เพื่อให้แน่ใจว่ามีการเข้าถึงที่มีเวลาแฝงต่ำ

โค้ดตัวอย่าง 1:PostgreSQL พร้อม Node.js

การแคชด้วย Global Redis นั้นสมบูรณ์แบบ ตอนนี้ เราจะเห็นตัวอย่างโค้ดที่ใช้กลยุทธ์การเก็บแคชกับ Upstash Redis และฐานข้อมูล Postgresql

ก่อนอื่นเราควรติดตั้ง SDK ที่เราจะใช้เชื่อมต่อกับที่เก็บข้อมูล

npm install pg upstash/redis

เมื่อเราติดตั้งการขึ้นต่อกันแล้ว เราก็สามารถเชื่อมต่อกับที่เก็บข้อมูล Upstash Redis และ Postgres ได้

const { Redis } = require('@upstash/redis'); // Upstash Redis SDK
const { Client } = require('pg');
 
const redis = new Redis({
 url: <UPSTASH_REDIS_REST_URL>,
 token: <UPSTASH_REDIS_REST_TOKEN>,
})
 
const client = new Client({
 user: 'username',
 password: 'password',
 host: 'host',
 port: 'port_number',
 database: 'database_name',
});
 
client.connect();

ตอนนี้เรามาเขียนฟังก์ชันในชั้นการเข้าถึงข้อมูลของเรากันดีกว่า ฟังก์ชั่นนี้สามารถแก้ไขได้ตามความต้องการของคุณ

สมมติว่าเราต้องการแสดงข้อมูลผู้ใช้บนเว็บไซต์ของเราตามรหัสผู้ใช้ ในกรณีนี้ เราควรมีฟังก์ชันที่รับ userId เป็นพารามิเตอร์

async function getUserData(userId) {
 // Check cache first
 const cachedData = await redis.get(userId);
 if (cachedData) {
 console.log('Cache hit');
 return JSON.parse(cachedData);
 }
 // Fallback to database
 console.log('Cache miss');
 const query = 'SELECT * FROM users WHERE id = $1';
 const { rows } = await client.query(query, [userId]);
 await redis.set(userId, JSON.stringify(rows), { EX: 300 }); // Cache for 5 minutes
 return rows;
}

นี่ไง! ตอนนี้ฟังก์ชันนี้จะตรวจสอบก่อนว่าข้อมูลผู้ใช้มีอยู่ในฐานข้อมูล Redis ที่ใกล้กับภูมิภาคของผู้ร้องขอมากที่สุดหรือไม่ หากไม่มีให้บริการ ระบบจะสอบถามข้อมูลที่ร้องขอจากฐานข้อมูล Postgresql และเขียนข้อมูลที่ส่งคืนไปยังภูมิภาคหลักของ Upstash Redis ข้อมูลที่เขียนไปยังภูมิภาคหลักจะถูกคัดลอกไปยังแบบจำลองการอ่านทั้งหมดโดยอัตโนมัติ

โค้ดตัวอย่าง 2:MYSQL พร้อม Python

ทีนี้มาดูอีกตัวอย่างหนึ่ง ครั้งนี้ เราจะดำเนินการแคชแบบเดียวกัน แต่คราวนี้ฐานข้อมูลหลักจะเป็น MYSQL นอกจากนี้ เราจะเขียนฟังก์ชันนี้ใน Python เพื่อดูว่ามันทำงานอย่างไรในแอปพลิเคชันที่ใช้ Python

ตามปกติ เราจะดาวน์โหลดการขึ้นต่อกันที่เราจะใช้สำหรับการเชื่อมต่อฐานข้อมูลก่อน

pip install upstash-redis upstash-redis

ตอนนี้ เราสามารถเริ่มต้นไคลเอนต์และเชื่อมต่อพวกเขาได้

import upstash_redis
import mysql.connector
import json
 
# Initialize Upstash Redis client
redis_client = upstash_redis.Redis(
 url='<your-upstash-redis-url>',
 token='<your-upstash-token>'
)
 
# Initialize MySQL client
db = mysql.connector.connect(
 host="<your-mysql-host>",
 user="<your-mysql-user>",
 password="<your-mysql-password>",
 database="<your-database-name>"
)
 
cursor = db.cursor(dictionary=True)

การเชื่อมต่อพร้อมแล้ว ตอนนี้เราจะใช้ฟังก์ชันที่คล้ายกันที่เราใช้งานในส่วนที่แล้ว

def get_user_data(userId):
 # Check the cache for the data
 cache_data = redis_client.get(key)
 if cache_data:
 print("Cache hit")
 return json.loads(cache_data)
 
 # If cache miss, query the MySQL database
 print("Cache miss")
 cursor.execute("SELECT * FROM users WHERE key = %s", (userId))
 result = cursor.fetchone()
 if result:
 # Store the data in the cache with a TTL of 1 hour
 redis_client.set(key, json.dumps(result), ex=3600)
 return result

บทสรุป

ด้วยการรวม Global Redis เข้ากับสถาปัตยกรรมของคุณ คุณจะได้รับประสิทธิภาพที่เพิ่มขึ้นอย่างมากสำหรับแอปพลิเคชันที่ใช้ SQL โดยเฉพาะในสภาพแวดล้อมแบบกระจายทั่วโลก ด้วยการเข้าถึงที่มีเวลาแฝงต่ำ โหลดฐานข้อมูลที่ลดลง และความเข้ากันได้กับรันไทม์ Edge ทำให้ Global Redis สามารถจัดการกับความท้าทายด้านประสิทธิภาพของแอปพลิเคชันด้วยฐานข้อมูล SQL ได้

ในบล็อกโพสต์นี้ เราได้กล่าวถึงคุณประโยชน์ของการแคชด้วย Redis ทั่วโลก และตรวจสอบตัวอย่างบางส่วน นี่เป็นเพียงตัวอย่างพื้นฐานที่สามารถขยายเพิ่มเติมได้ตามความต้องการของคุณ

ฉันหวังว่าบล็อกนี้จะเป็นจุดเริ่มต้นที่ดีสำหรับคุณในการเริ่มใช้ประโยชน์จากพลังของ Redis ระดับโลก