Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

Tăng tốc hiệu suất cơ sở dữ liệu toàn cầu với Redis Caching

Một ứng dụng phần mềm chỉ có giá trị khi nó có thể đáp ứng được nhu cầu của khách hàng. Khi xem xét nhu cầu của khách hàng, nhu cầu đầu tiên chúng tôi gặp phải là tốc độ ứng dụng và độ tin cậy của dữ liệu. Tuy nhiên, khi các ứng dụng phát triển và mở rộng trên toàn cầu, cơ sở dữ liệu SQL thường trở thành nút thắt cổ chai về hiệu suất do khối lượng truy vấn tăng lên, độ trễ cao hơn và cơ sở người dùng trải rộng về mặt địa lý.

Để giải quyết những vấn đề này khi ứng dụng phát triển, bộ nhớ đệm là một trong những giải pháp đầu tiên giúp giảm tải cho cơ sở dữ liệu chính đối với các truy vấn lặp lại và giảm độ trễ khi người dùng gửi truy vấn. Khi chúng ta nói về bộ nhớ đệm, mỗi người chúng ta đều nghĩ đến cùng một công cụ, phải không? Vâng, đó là Redis. Redis là một công cụ hoàn hảo để lưu trữ dữ liệu vào bộ nhớ đệm nhằm giảm tải và giúp ứng dụng chạy nhanh hơn. Upstash cũng cung cấp bản sao Redis được phân phối trên toàn cầu, điều này sẽ giúp ứng dụng nhanh hơn nhiều so với bộ nhớ đệm thông thường.

Trong blog này, chúng ta sẽ khám phá những lợi thế kỹ thuật của việc tích hợp Global Redis với cơ sở dữ liệu SQL, thảo luận về tác động của nó đối với độ trễ và khả năng mở rộng, đồng thời cung cấp các ví dụ thực hành về cách sử dụng Global Redis với PostgreSQL và MySQL.

Lợi ích của bộ nhớ đệm

Trước tiên hãy xem lý do tại sao chúng ta nên sử dụng bộ nhớ đệm.

Có hai lợi ích chính của bộ nhớ đệm mà tôi muốn đề cập trong blog này:giảm tải cơ sở dữ liệu và giảm độ trễ cho người dùng.

Giảm tải cơ sở dữ liệu

Cơ sở dữ liệu SQL vượt trội trong việc quản lý dữ liệu có cấu trúc và các truy vấn phức tạp, nhưng khi chịu tải nặng, chúng có thể trở thành nút cổ chai. Khối lượng lớn truy vấn lặp lại cho cùng một dữ liệu—chẳng hạn như chi tiết sản phẩm, hồ sơ người dùng hoặc cài đặt được truy cập thường xuyên—tiêu tốn đáng kể tài nguyên CPU và I/O. Bằng cách lưu vào bộ nhớ đệm những kết quả này, số lượng truy vấn truy cập vào cơ sở dữ liệu sẽ giảm đáng kể, cho phép cơ sở dữ liệu tập trung vào các tác vụ quan trọng hơn như xử lý và cập nhật giao dịch.

Ví dụ:

  • Không có bộ nhớ đệm:Một tính năng phổ biến trên trang web tạo ra hàng triệu truy vấn cơ sở dữ liệu giống hệt nhau hàng ngày, làm chậm hiệu suất cho các hoạt động khác.
  • Với bộ nhớ đệm:Các kết quả truy vấn được truy cập thường xuyên được lưu trữ trong bộ nhớ đệm tốc độ cao như Redis, giảm hơn 90% tỷ lệ truy vấn cơ sở dữ liệu.

Giảm độ trễ

Việc giảm tải cơ sở dữ liệu là để đảm bảo độ tin cậy của dữ liệu. Bộ nhớ đệm cũng cải thiện thời gian mà người dùng yêu cầu và truy vấn.

Khi các ứng dụng liên tục truy vấn cơ sở dữ liệu để tìm cùng một dữ liệu, việc truy xuất dữ liệu sẽ luôn mất nhiều thời gian. Đặc biệt nếu những truy vấn này tạo ra tải trọng lớn cho cơ sở dữ liệu thì tất cả độ trễ này có thể tăng thêm. Điều này đặc biệt có vấn đề đối với các ứng dụng yêu cầu truy cập dữ liệu theo thời gian thực hoặc xử lý khối lượng truy vấn lớn, trong đó ngay cả độ trễ nhỏ cũng có thể ảnh hưởng đáng kể đến hiệu suất.

Bộ nhớ đệm giải quyết vấn đề này bằng cách lưu trữ dữ liệu được truy cập thường xuyên trong bộ nhớ, việc truy xuất này nhanh hơn nhiều so với truy vấn cơ sở dữ liệu. Bằng cách giảm sự phụ thuộc vào các truy vấn cơ sở dữ liệu đối với các yêu cầu lặp lại, bộ nhớ đệm sẽ giảm thiểu việc di chuyển mạng và tránh chi phí tính toán khi thực hiện các truy vấn phức tạp. Kết quả là thời gian phản hồi được cải thiện đáng kể, cho phép các ứng dụng mang lại hiệu suất nhanh hơn, ổn định hơn ngay cả khi tải nặng hoặc trong môi trường phân tán.

Chiến lược bộ nhớ đệm phổ biến

Điều quan trọng nữa là phải hiểu hai chiến lược bộ nhớ đệm chính được sử dụng trong tối ưu hóa hiệu suất ứng dụng:cache-asideviết qua . Mỗi phương pháp đều có trường hợp sử dụng và sự đánh đổi riêng, tùy thuộc vào yêu cầu của ứng dụng.

Bỏ bộ nhớ đệm là kỹ thuật bộ nhớ đệm phổ biến nhất. Trong kỹ thuật này, ứng dụng sẽ kiểm tra bộ đệm để tìm dữ liệu trước. Nếu dữ liệu không có trong bộ đệm (cache miss), nó sẽ lấy dữ liệu từ cơ sở dữ liệu và ghi vào bộ đệm để sử dụng trong tương lai.

Đây là một sơ đồ đơn giản cho thấy cách hoạt động của tính năng dành riêng cho bộ nhớ đệm, có thể các bạn đã thấy nó ở đâu đó trước khi đến với blog này.

Tăng tốc hiệu suất cơ sở dữ liệu toàn cầu với Redis Caching

Ưu điểm của bộ đệm này là kích thước bộ đệm được tối ưu hóa và dữ liệu bộ đệm được tải lại khi người dùng cần. Mặt khác, nhược điểm là dữ liệu sẽ không có sẵn sau khi bộ đệm được xóa khi TTL của nó kết thúc. Khi đó, bộ đệm sẽ được tải lại khi người dùng yêu cầu dữ liệu đó. Trong trường hợp này, người dùng đó sẽ phải đợi truy vấn được thực hiện. Nhưng tất nhiên, các yêu cầu tiếp theo sẽ có thể lấy lại dữ liệu từ bộ đệm.

Trong viết qua chiến lược, mọi thao tác ghi vào cơ sở dữ liệu cũng được ghi ngay vào bộ đệm. Điều này đảm bảo rằng bộ nhớ đệm luôn cập nhật dữ liệu mới nhất từ cơ sở dữ liệu.

Đây là sơ đồ đơn giản về bộ nhớ đệm ghi qua:

Tăng tốc hiệu suất cơ sở dữ liệu toàn cầu với Redis Caching

Chiến lược này đảm bảo tính nhất quán của dữ liệu giữa bộ đệm và cơ sở dữ liệu và không có yêu cầu nào có độ trễ cao hơn vì dữ liệu sẽ có sẵn mà không cần chờ yêu cầu từ người dùng. Tuy nhiên, nhược điểm là bộ đệm chứa tất cả dữ liệu, ngay cả khi không cần thiết. Ngoài ra, mọi thao tác ghi sẽ có độ trễ do dữ liệu cũng sẽ được ghi vào bộ đệm.

Redis toàn cầu là gì? Lợi ích của Global Redis

Bây giờ hãy cùng tìm hiểu cách cải thiện hiệu suất của cơ sở dữ liệu SQL hơn nữa.

Một nguyên nhân khác gây ra độ trễ là vị trí của cơ sở dữ liệu. Trong hầu hết các trường hợp, cơ sở dữ liệu chính nằm ở các vùng cụ thể. Tuy nhiên, dữ liệu phải có thể truy cập được ở vị trí gần nhất để chúng tôi có thể giảm thiểu độ trễ do khoảng cách đến kho lưu trữ dữ liệu gây ra.

Vấn đề này có thể được ngăn chặn bằng cách sử dụng Redis được phân phối toàn cầu do Upstash cung cấp.

Global Redis là giải pháp bộ nhớ đệm phân tán giúp sao chép dữ liệu trên nhiều vị trí địa lý, đảm bảo khả năng truy cập có độ trễ thấp cho các ứng dụng được phân phối trên toàn cầu.

Hãy nhanh chóng xem cách tạo Redis toàn cầu. Đầu tiên, đăng nhập vào bảng điều khiển Upstash.

Sau khi đăng nhập, chúng ta có thể tạo cơ sở dữ liệu Redis tại đây. Upstash cung cấp nhiều vị trí để định vị các bản sao đã đọc.

Tăng tốc hiệu suất cơ sở dữ liệu toàn cầu với Redis Caching

Sau khi chọn vị trí đọc, bạn có thể chọn gói của mình và cuối cùng tạo cơ sở dữ liệu Redis. Thế thôi!

Trong bảng điều khiển, bạn cũng có thể thêm/xóa các vùng sau khi tạo cơ sở dữ liệu.

Tăng tốc hiệu suất cơ sở dữ liệu toàn cầu với Redis Caching

Cơ sở dữ liệu Global Redis chủ yếu được sử dụng bởi các ứng dụng được phân phối toàn cầu và các ứng dụng chạy ở biên.

Độ trễ thấp cho các ứng dụng được phân phối trên toàn cầu

Trong các hệ thống phân tán toàn cầu, độ trễ thường trở thành nút thắt cổ chai do khoảng cách vật lý giữa người dùng và cơ sở dữ liệu trung tâm hoặc bộ đệm. Global Redis giải quyết vấn đề này bằng cách sao chép dữ liệu trên nhiều nút được phân bổ theo địa lý.

Khi người dùng yêu cầu dữ liệu, nút bộ đệm gần nhất sẽ phục vụ yêu cầu, giảm đáng kể thời gian di chuyển mạng. Quyền truy cập được bản địa hóa này đảm bảo thời gian phản hồi nhanh hơn và trải nghiệm người dùng nhất quán, bất kể vị trí của người dùng.

Giả sử, nếu người dùng ở Tokyo nhưng cơ sở dữ liệu ở Dublin thì khoảng cách sẽ làm chậm phản hồi cho người dùng. Nếu có một bản sao chỉ có quyền đọc của Upstash Redis ở Châu Âu thì yêu cầu có thể được chuyển đến bản sao có quyền đọc gần nhất, đó là bản sao ở Châu Âu trong trường hợp này.

Dữ liệu có độ trễ thấp cho thời gian chạy biên (ví dụ:Cloudflare Workers)

Thời gian chạy biên là môi trường được thiết kế để thực thi mã ở biên mạng, gần với người dùng cuối. Thời gian chạy biên phân phối logic ứng dụng trên nhiều vị trí biên trên toàn thế giới. Kiến trúc này giảm thiểu khoảng cách vật lý giữa người dùng và việc thực hiện các yêu cầu của họ, giảm đáng kể độ trễ và cải thiện hiệu suất.

Mặc dù thời gian chạy biên mang khả năng tính toán đến gần hơn với người dùng nhưng chúng vẫn cần quyền truy cập vào dữ liệu cho hầu hết các hoạt động, chẳng hạn như truy xuất thông tin cụ thể của người dùng, mã thông báo phiên hoặc cấu hình. Nếu không có lớp bộ đệm, mỗi yêu cầu vẫn sẽ yêu cầu một chuyến đi khứ hồi đến cơ sở dữ liệu trung tâm, làm mất đi phần lớn lợi ích về độ trễ. Đây là lúc Global Redis đóng vai trò quan trọng vì chúng sao chép dữ liệu được sử dụng thường xuyên sang biên, đảm bảo khả năng truy cập có độ trễ thấp.

Mã ví dụ 1:PostgreSQL với Node.js

Bộ nhớ đệm với Redis toàn cầu là hoàn hảo. Bây giờ, chúng ta sẽ thấy một mẫu mã triển khai chiến lược dành riêng bộ đệm với Upstash Redis và cơ sở dữ liệu Postgresql.

Trước tiên, chúng ta nên cài đặt SDK mà chúng ta sẽ sử dụng để kết nối với kho dữ liệu.

npm install pg upstash/redis

Sau khi cài đặt xong các phần phụ thuộc, chúng ta có thể kết nối với kho dữ liệu, Upstash Redis và 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();

Bây giờ hãy viết hàm trong lớp truy cập dữ liệu của chúng ta. Chức năng này có thể được sửa đổi theo nhu cầu của bạn.

Giả sử chúng ta muốn hiển thị thông tin người dùng trên trang web của mình theo userId. Trong trường hợp này, chúng ta nên có một hàm lấy userId làm tham số

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;
}

Đây rồi! Bây giờ, chức năng này trước tiên sẽ kiểm tra xem thông tin người dùng có sẵn trong cơ sở dữ liệu Redis gần nhất với khu vực của người yêu cầu hay không. Nếu không có sẵn, nó sẽ truy vấn dữ liệu được yêu cầu từ cơ sở dữ liệu Postgresql và ghi dữ liệu trả về vào vùng chính Upstash Redis. Dữ liệu được ghi vào vùng chính sẽ được sao chép tự động sang tất cả các bản sao chỉ có quyền đọc.

Mã ví dụ 2:MYSQL với Python

Bây giờ, hãy xem một ví dụ khác. Lần này, chúng tôi sẽ thực hiện triển khai bộ đệm tương tự, nhưng lần này cơ sở dữ liệu chính sẽ là MYSQL. Ngoài ra, chúng ta sẽ viết hàm này bằng Python để xem nó hoạt động như thế nào trong các ứng dụng dựa trên Python.

Như thường lệ, trước tiên chúng tôi sẽ tải xuống các phần phụ thuộc mà chúng tôi sẽ sử dụng để kết nối cơ sở dữ liệu.

pip install upstash-redis upstash-redis

Bây giờ, chúng ta có thể khởi tạo ứng dụng khách và kết nối chúng.

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)

Kết nối đã sẵn sàng. Bây giờ chúng ta sẽ triển khai chức năng tương tự mà chúng ta đã triển khai trong phần trước.

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

Kết luận

Bằng cách tích hợp Global Redis vào kiến trúc của mình, bạn có thể đạt được mức tăng hiệu suất đáng kể cho các ứng dụng dựa trên SQL, đặc biệt là trong các môi trường phân tán toàn cầu. Với khả năng truy cập có độ trễ thấp, giảm tải cơ sở dữ liệu và khả năng tương thích với thời gian chạy biên, Global Redis có thể giải quyết các thách thức về hiệu suất của các ứng dụng có cơ sở dữ liệu SQL.

Trong bài đăng trên blog này, chúng tôi đã tìm hiểu các lợi ích của bộ nhớ đệm với Redis toàn cầu và xem xét một số ví dụ. Đây chỉ là những ví dụ cơ bản, có thể mở rộng thêm tùy theo nhu cầu của bạn.

Tôi hy vọng blog này có thể là một khởi đầu tốt để bạn bắt đầu tận dụng sức mạnh của Redis toàn cầu.