Có nhiều hơn một cách để lưu trữ.
NHẬN có điều kiện
Nếu bạn đang lưu trữ những hình ảnh này trên hệ thống tệp và phục vụ chúng trực tiếp thông qua máy chủ web, có lẽ bạn đã sử dụng get có điều kiện . Máy chủ web sẽ tự động sử dụng siêu dữ liệu của hệ thống tệp để đặt tiêu đề ETAG và sẽ tự động trả lời với "304 Không được sửa đổi" nếu trình duyệt bao gồm If-Modified-Since
hoặc If-Matches
các tiêu đề trong yêu cầu của nó. (Tất cả các trình duyệt sẽ.)
Trong trường hợp này, toàn bộ hình ảnh không được phục vụ, vì vậy bạn có thể tiết kiệm băng thông. Tuy nhiên, yêu cầu GET vẫn sẽ được phát hành, vì vậy bạn vẫn sẽ có chi phí và độ trễ của yêu cầu.
Bạn có thể giảm số lượng yêu cầu một chút với chi phí làm mới bộ đệm bằng cách đặt máy chủ web của bạn đặt Cache-Control
tiêu đề public,max-age=N
cho giá trị cho hình ảnh của bạn. Điều này nói rằng cache có thể giữ tài nguyên trong ít nhất max-age
vài giây trước khi chúng phải kiểm tra xem nó có được cập nhật hay không.
Tuy nhiên, HTTP chỉ xác định một cách để vô hiệu hóa mục nhập bộ đệm, có thể không phù hợp với ngữ nghĩa của ứng dụng của bạn: nếu bạn POST hoặc PUT vào một url cập nhật ảnh hồ sơ, trả lời bằng Location: [url of photo]
tiêu đề và mục nhập bộ đệm cho url đó sẽ bị vô hiệu.
(Đây là cơ chế cho phép bạn cache một trang web với ý kiến, và sau đó có trang buộc nạp lại bởi trình duyệt sau khi bài viết sử dụng một bình luận mới. Trình duyệt sẽ trả lời một POST /comment
với 303 See Other
và Location: /page/with/comment
. Lưu ý rằng điều này đã không được sử dụng để hoạt động trong Firefox do lỗi lâu đời .)
Trừ khi bạn có nhiều lưu lượng, cách tiếp cận bộ nhớ đệm này là tốt.
Thay đổi url
Một url là một đại diện của một tài nguyên, vì vậy một cách khác để quản lý bộ đệm không phải là thay đổi các tham số bộ đệm cho tài nguyên, mà là tạo một tài nguyên hoàn toàn mới bằng một lệnh "cache mãi mãi". Đây là cách tiếp cận mà các "ông lớn" ưa thích, bởi vì nó cho phép họ không tạo thêm yêu cầu, tiết kiệm cho họ rất nhiều băng thông. Nhược điểm là nó đòi hỏi nhiều sổ sách kế toán hơn.
Có hai kỹ thuật chung cho việc này.
Chuỗi truy vấn
Máy chủ web bỏ qua các chuỗi truy vấn khi phục vụ một tệp từ hệ thống tệp. Tuy nhiên, bộ nhớ cache thì không: /1.jpg?t=12345
và /1.jpg?t=67890
là hai tài nguyên hoàn toàn khác nhau, không liên quan đến nhau, mặc dù máy chủ cho rằng chúng giống nhau.
Vì vậy, một điều dễ dàng bạn có thể làm là nối dấu thời gian của hệ thống tệp dưới dạng chuỗi truy vấn bất cứ khi nào bạn tạo tham chiếu đến tài nguyên trong html của mình và đặt Expires
tiêu đề dài . Trình duyệt sau đó sẽ lưu trữ tài nguyên này mãi mãi và không thực hiện bất kỳ GET nào miễn là chuỗi truy vấn không thay đổi.
Một nhược điểm là khó hoặc không thể hướng dẫn máy chủ web về url mới cho một mục nếu bạn muốn vô hiệu hóa bộ đệm. Ví dụ: nếu một trình duyệt có trang HTML được lưu trong bộ nhớ cache có /1.jpg?v=1
tham chiếu, nhưng tình cờ xóa mục nhập cho /1.jpg?v=1
(có thể nó đã hết dung lượng bộ nhớ hoặc bộ nhớ), nó sẽ đưa ra yêu cầu mới /1.jpg?v=1
. Nếu trong lúc đó, hình ảnh đã thay đổi thành /1.jpg?v=2
, phản hồi thích hợp là:
- Phục vụ phiên bản cũ của tập tin. Bạn sẽ làm điều này nếu bạn muốn tất cả các tài nguyên phù hợp với nhau vì chúng ở một thời điểm nhất định. Đây là những gì bạn nên làm với các tệp CSS, ví dụ, vì một tệp css mới với tệp html cũ có thể không hoạt động đúng!
- Chuyển hướng đến phiên bản mới của tệp bằng cách sử dụng
301 Moved Permanently
. Bạn sẽ làm điều này nếu bạn muốn tất cả các tài nguyên càng mới càng tốt.
Cả hai điều này đều khó thực hiện với một máy chủ web, điều đó có nghĩa là bạn cần phải gọi một ứng dụng web ngay cả đối với các yêu cầu hình ảnh, có thể phức tạp hơn và tốn nhiều tài nguyên hơn. Máy chủ web rất nhanh trong việc phục vụ các tệp, do đó, chi phí chung của ứng dụng web có thể sẽ nuốt chửng băng thông và độ trễ của bạn.
Tên tệp
Thay vì thêm một chuỗi truy vấn, bạn thay đổi tên tệp. Điều này có nghĩa là dễ dàng giữ nhiều phiên bản tệp trên hệ thống tệp, nhưng có lẽ bạn sẽ cần lưu trữ siêu dữ liệu tệp và thực hiện lưu giữ sổ sách cơ sở dữ liệu khác để theo dõi tài nguyên và tên của chúng.