2012-01-19 24 views
8

Tôi tạo khóa bộ nhớ cache với nginx dựa trên URI yêu cầu và tham số truy vấn kiểm tra memcache trực tiếp và sau đó phục vụ trang từ PHP-FPM nếu không tìm thấy khóa bộ nhớ cache. Vấn đề của tôi là nhiều URL có các tùy chọn chuỗi truy vấn đi kèm trong các đơn đặt hàng khác nhau và do đó tạo ra hai hoặc nhiều khóa bộ nhớ cache riêng biệt cho mỗi phản hồi.Nginx caching với thứ tự biến số

thiết lập bộ nhớ cache của tôi là một cái gì đó như:

set $cache_key "$uri?$args"; 

Vì vậy, các URL mà đi theo như thế này với params chuỗi truy vấn trong đơn đặt hàng khác nhau kết thúc tổng hợp nhiều phím bộ nhớ cache có thể cho cùng loại:

http://example.com/api/2.2/events.json?id=53&type=wedding&sort=title&limit=10 
http://example.com/api/2.2/events.json?id=53&limit=10&type=wedding&sort=title 
http://example.com/api/2.2/events.json?id=53&limit=10&sort=title&type=wedding 

Quảng cáo nauseum cho n! khả năng ...

Kết quả cuối cùng là memcache thường lấp đầy nhanh hơn rất nhiều vì tôi có tiềm năng n! -1 bản sao nội dung được lưu trong bộ nhớ cache đơn giản vì các tham số chuỗi truy vấn đến theo thứ tự khác. Có cách nào tôi có thể đặt hàng chúng theo thứ tự bảng chữ cái trước khi thiết lập khóa bộ nhớ cache để tránh điều này? Có cách nào khác để giải quyết vấn đề này một cách thanh lịch không?

Trả lời

2

nếu bạn biết thông số nào quan trọng đối với việc tạo khóa bộ nhớ cache thì bạn có thể chỉ định thủ công chúng. Dựa trên ví dụ của bạn tôi đã viết ví dụ tiếp theo:

set $cache_key "$uri?id=$arg_id&type=$arg_type&sort=$arg_sort&limit=$arg_limit"; 

Hoặc bạn có thể sử dụng perl nhúng và viết chức năng của riêng bạn mà sẽ tạo ra chìa khóa bộ nhớ cache, vui lòng xem ví dụ ở đây http://wiki.nginx.org/Configuration#Embedded_Perl_examples

+0

Vấn đề là có nhiều, nhiều cuộc gọi API có thể có với các tập hợp tham số riêng của họ. Một số người trong số họ là toàn cầu hơn như 'giới hạn', nhưng hầu hết trong số họ là phụ thuộc vào cuộc gọi API. Cảm ơn bạn đã nhúng liên kết Perl - Tôi sẽ kiểm tra điều đó trong khi chờ đợi các giải pháp khác. –

0

Có lẽ bạn đang tạo ra các liên kết bản thân , thay vì cố gắng sắp xếp lại chúng trong nginx, bạn có thể sử dụng công cụ viết lại đầu ra để đảm bảo chúng theo thứ tự nhất quán khi tạo trang không?

+0

Có thể, nhưng API cụ thể này được nhiều ứng dụng dành cho thiết bị di động và các tiện ích JS sử dụng, một số trong đó là bên thứ 3, do đó rất khó thực thi ở mọi nơi. –

+0

Điều này hút một phần, nhưng bạn có thể nhận được chi tiết hơn với các biến. và đặt khóa bộ nhớ cache thành $ uri? type = $ arg [type] & sort = $ arg [sắp xếp] & giới hạn = $ arg [giới hạn] v.v. với tất cả các khóa có thể? – preinheimer

+0

Điều gì xảy ra nếu '$ arg [somekey]' cụ thể không tồn tại trong yêu cầu hiện tại? Cách tiếp cận đó sẽ chỉ hoạt động nếu nginx không ném bất kỳ loại lỗi nào về các khóa tham số truy vấn không tồn tại. –

Các vấn đề liên quan