Bộ nhớ đệm phía máy khách của API REST bằng Python
Một bộ đệm đơn giản để lưu vào bộ nhớ đệm các phản hồi API REST ở phía máy khách. Điều này làm giảm tải mạng và các lệnh gọi API và tăng hiệu suất.
Chúng ta đang sống trong một thế giới cho phép API. Ngày càng có nhiều ứng dụng được xây dựng trên API (mở) hàng đầu. Đôi khi thường xuyên gọi cùng một API, cùng một điểm cuối với các tham số giống nhau, dẫn đến cùng một phản hồi.
Thực hiện tìm kiếm trên bộ nhớ đệm phía máy khách không mang lại giải pháp tốt phù hợp với cách sử dụng của tôi, vì vậy tôi quyết định xây dựng một giải pháp rất đơn giản của riêng mình. Trong ví dụ này, nó lưu trữ các kết quả JSON từ API REST. Nhưng phần JSON là tùy chọn.
Bộ đệm ẩn được xây dựng trong một hàm python thực hiện cuộc gọi web và dịch nội dung JSON thu được sang từ điển. Chức năng này được sử dụng khi một cuộc gọi REST được yêu cầu ở đâu đó trong mã.
Biểu json_api_call
diễn là một yêu cầu HTTPS tới máy chủ lưu trữ và url cơ sở được chỉ định. Tham params
số phải chứa các tham số được mã hóa URL, ví dụ start=5.110%2C52.088&end=5.113%2C52.088&units=km
:
Phiên bản thứ hai có thêm cơ chế lưu vào bộ nhớ đệm. URL yêu cầu được sử dụng làm khóa và giá trị được giải mã JSON của phản hồi là giá trị. Nếu bộ đệm ẩn trả về Không (dòng 17–18), lệnh gọi API được thực hiện và kết quả được lưu trong bộ đệm (dòng 24). Bằng cách sử dụng tên máy chủ, URL cơ sở và các tham số, chúng tôi có một chuỗi duy nhất. Nếu tiêu đề của lệnh gọi API chứa thông tin liên quan làm cho lệnh gọi là duy nhất, thì nó có thể được thêm vào khóa. Đối với các mục đích hiện tại, điều này là không bắt buộc.
Thực hiện ngây thơ đầu tiên
Cách triển khai ngây thơ đầu tiên của bộ đệm là lưu trữ một cặp [khóa, giá trị] và giữ nó vô thời hạn trong bộ đệm:
Hàm add
thêm cặp [key, value] vào từ điển. Phương get
thức kiểm tra xem khóa có được lưu trong từ điển hay không và nếu có, trả về giá trị được liên kết.
Tối ưu hóa triển khai
Việc triển khai này có hai nhược điểm lớn. Đầu tiên, [khóa, giá trị] được lưu trữ vô hạn vì không có thời gian hết hạn. Thứ hai, nó so sánh các khóa dựa trên các chuỗi (dài) có thể chỉ khác nhau sau khi kết thúc.
Vấn đề đầu tiên có thể được giải quyết bằng cách thêm thời gian hết hạn (giây). Một cặp [khóa, giá trị] trở nên không hợp lệ sau thời gian này và không được get
phương thức trả về mà thay vào đó sẽ bị xóa khỏi từ điển. Cặp [khóa, giá trị] được kéo dài với thời gian hết hạn thành [khóa, hết hạn, giá trị].
Vấn đề thứ hai có thể được giải quyết bằng cách sử dụng hàm băm của chuỗi làm khóa thay vì chính chuỗi đó. Khi một mục được thêm vào, hàm băm được sử dụng làm khóa. Điều này dẫn đến phiên bản sau của Cache
đối tượng:
Trong quá trình xây dựng lớp, một giá trị mặc định cho thời gian hết hạn được chỉ định. Có thể ghi đè giá trị mặc định này khi một mục được thêm vào bộ đệm bằng cách chỉ định timeout
tham số (dòng 14–16). Dòng 28 tạo bộ đệm với thời gian hết hạn mặc định là 60 giây.
Khi một giá trị được truy xuất từ bộ nhớ cache, thời gian hết hạn sẽ được kiểm tra. Nếu giá trị vẫn hợp lệ, nó sẽ được trả về (dòng 20–23). Nếu thời gian hết hạn đã qua, giá trị sẽ bị xóa khỏi từ điển (dòng 25) và None
được trả về.
Từ cuối cùng
Tôi hy vọng bạn thích bài viết này. Để có thêm cảm hứng, hãy kiểm tra một số bài viết khác của tôi:
- Thực hiện một chức năng trên các cột trong tệp CSV
- Tạo bản đồ nhiệt từ nhật ký của trình theo dõi hoạt động của bạn
- Xóa thông tin cá nhân khỏi văn bản bằng Python
- Yêu cầu web song song với Python
- Tất cả các phương tiện giao thông công cộng đều dẫn đến Utrecht, không phải Rome