Dữ liệu Cache là gì? Clear Cache nghĩa là gì và nó làm gì?

Đầu tiên, bộ nhớ cache là gì?

Nói chung, bộ nhớ đệm (phát âm là "tiền mặt") là một loại kho lưu trữ. Bạn có thể coi kho lưu trữ như một kho lưu trữ. Trong quân đội, đây sẽ là nơi chứa vũ khí, thực phẩm và các vật tư khác cần thiết để thực hiện một nhiệm vụ.

Trong khoa học máy tính, những "nguồn cung cấp" này được gọi là tài nguyên, trong đó tài nguyên là tập lệnh, mã và nội dung tài liệu. Loại thứ hai đôi khi được gọi cụ thể hơn là "tài sản" như văn bản, dữ liệu tĩnh, phương tiện và siêu liên kết, nhưng ở đây tôi sẽ chỉ sử dụng một thuật ngữ tài nguyên .

Sự khác biệt giữa bộ nhớ cache và các loại kho lưu trữ khác

Mục đích chính của bộ đệm là tăng tốc độ truy xuất tài nguyên trang web, giảm thời gian tải trang. Một khía cạnh quan trọng khác của bộ nhớ cache là đảm bảo rằng nó chứa dữ liệu tương đối mới.

Bài viết này sẽ đề cập đến hai phương pháp lưu trữ phổ biến: bộ nhớ đệm của trình duyệtMạng phân phối nội dung (CDN).

Bên cạnh bộ nhớ đệm, các kho lưu trữ khác cũng hoạt động trong kiến ​​trúc web; thường những thứ này được thiết kế để chứa một lượng lớn dữ liệu. Tuy nhiên, chúng không tập trung vào hiệu suất truy xuất.

Ví dụ, Amazon Glacier là một kho dữ liệu được thiết kế để lưu trữ dữ liệu với giá rẻ, nhưng không lấy lại nhanh chóng. Mặt khác, cơ sở dữ liệu SQL được thiết kế để linh hoạt, cập nhật và nhanh chóng, nhưng hiếm khi rẻ và thường không nhanh như bộ nhớ cache.

Bộ đệm trình duyệt: bộ nhớ đệm

Bộ nhớ đệm lưu trữ cục bộ tài nguyên trên máy tính mà trình duyệt đang chạy. Trong khi trình duyệt đang hoạt động, các tài nguyên đã truy xuất sẽ được lưu trữ trên bộ nhớ vật lý của máy tính (RAM) và có thể cả trên ổ cứng.

Sau đó, khi cần cùng một tài nguyên chính xác khi truy cập lại một trang web, trình duyệt sẽ lấy những tài nguyên đó từ bộ nhớ cache thay vì máy chủ từ xa. Vì bộ nhớ đệm được lưu trữ cục bộ, trong bộ nhớ nhanh, các tài nguyên đó được tìm nạp nhanh hơn và trang tải nhanh hơn.

Tốc độ truy xuất tài nguyên là bản chất, nhưng điều cần thiết là tài nguyên phải mới. Tài nguyên cũ là tài nguyên đã lỗi thời và có thể không còn hợp lệ.

Một phần công việc của trình duyệt là xác định tài nguyên được lưu trong bộ nhớ cache nào đã cũ và tìm nạp lại những tài nguyên đó. Vì một trang web thường có tài nguyên, nên thường sẽ có sự kết hợp giữa các phiên bản cũ và mới trong bộ nhớ cache.

Làm thế nào để trình duyệt biết được những gì đã cũ trong bộ nhớ cache?

Câu trả lời không đơn giản, nhưng có hai cách tiếp cận chính: chặn bộ nhớ cache và trường tiêu đề HTTP.

chặn bộ nhớ cache

Người Ý

Cache-busting là một kỹ thuật phía máy chủ đảm bảo rằng trình duyệt chỉ tìm nạp các tài nguyên mới. Nó thực hiện điều này một cách gián tiếp.

Mặc dù chặn bộ nhớ cache nghe có vẻ ấn tượng, nhưng nó thực sự không phá vỡ bất cứ điều gì và thậm chí không chạm vào những gì đã được lưu trong bộ nhớ cache trên trình duyệt. Tất cả những gì cache-busting làm là thay đổi URI của tài nguyên gốc theo cách làm cho trình duyệt hiển thị rằng tài nguyên hoàn toàn mới. Vì nó trông mới nên nó sẽ không nằm trong bộ nhớ cache của trình duyệt. Phiên bản cũ của tài nguyên đã lưu trong bộ nhớ cache sẽ vẫn được lưu vào bộ nhớ cache, nhưng cuối cùng sẽ khô héo và chết, không bao giờ được truy cập lại.

Giả sử tôi có một trang web ở www.foobar.com/about.htmlđó nói mọi thứ về foobar.com mà bạn muốn biết. Khi bạn truy cập trang đó, nó và các tài nguyên liên quan đến nó sẽ được trình duyệt lưu vào bộ nhớ đệm.

Sau đó, foobar.com được mua lại bởi tập đoàn Quxbaz và nội dung của trang about sẽ trải qua những thay đổi đáng kể. Bộ nhớ cache của trình duyệt sẽ không có nội dung mới đó, nhưng nó vẫn có thể tin rằng nội dung mà nó có là hiện tại và sẽ không bao giờ cố gắng tìm nạp lại nó.

Bạn, quản trị viên web Quxbaz, làm gì để đảm bảo tất cả nội dung mới được đẩy ra ngoài?

Vì trình duyệt dựa vào URI để tìm các mục trong bộ nhớ cache, nếu URI của một tài nguyên thay đổi thì giống như trình duyệt chưa bao giờ nhìn thấy nó trước khi tìm nạp tài nguyên đó từ máy chủ.

Do đó, bằng cách thay đổi URI tài nguyên từ www.foobar.com/about.htmlthành www.foobar.com/about2.html(hoặc thành www.quxbaz.com/about.html), trình duyệt sẽ không tìm thấy bất kỳ tài nguyên bộ đệm nào được liên kết với URI đó và thực hiện tìm nạp đầy đủ từ máy chủ. Về cơ bản, tài nguyên có thể giống với tài nguyên gốc trong URI cũ, nhưng trình duyệt không biết điều đó.

Tuy nhiên, bạn không cần phải thay đổi tên trang. Kể từ khi URI cũng bao gồm một chuỗi truy vấn theo định nghĩa, bạn có thể thêm một tham số phiên bản để URI: www.foobar.com/about.html?v=2hef9eb1.

Trong trường hợp này, tham số phiên bản v được đặt mới một giá trị băm được tạo mới bất cứ khi nào nội dung thay đổi hoặc được kích hoạt bởi một số quy trình khác, chẳng hạn như khởi động lại máy chủ. Trình duyệt thấy rằng chuỗi truy vấn đã thay đổi và bởi vì chuỗi truy vấn có thể ảnh hưởng đến những gì sẽ được trả về, nó sẽ tìm nạp tài nguyên cập nhật từ máy chủ.

Cả hai kỹ thuật này sẽ không hoạt động nếu URI cũ được truy cập trực tiếp từ một dấu trang. Trừ khi trình duyệt được hướng dẫn xác thực lại URI theo yêu cầu được lưu trong bộ nhớ cache cuối cùng (hoặc tài nguyên được lưu trong bộ nhớ cache đã hết hạn), trình duyệt sẽ không thực hiện tìm nạp đầy đủ để làm mới bộ nhớ cache của mình. Điều này đưa chúng ta đến chủ đề tiếp theo.

Các trường tiêu đề HTTP

Mọi yêu cầu tài nguyên đều đi kèm với một số thông tin meta được gọi là tiêu đề. Ngược lại, mọi phản hồi cũng có thông tin tiêu đề được liên kết với nó.

Trong một số trường hợp, trình duyệt thấy các giá trị tiêu đề phản hồi và thay đổi các giá trị tương ứng trong các tiêu đề yêu cầu tiếp theo. Trong số các giá trị tiêu đề này có những giá trị ảnh hưởng đến cách bộ nhớ đệm tài nguyên được thực hiện trên trình duyệt.

Yêu cầu HEAD và yêu cầu có điều kiện

Yêu cầu HEAD giống như yêu cầu GET hoặc POST bị cắt ngắn. Thay vì yêu cầu tài nguyên đầy đủ, một yêu cầu HEAD chỉ yêu cầu các trường tiêu đề mà nếu không sẽ được trả lại trên một yêu cầu đầy đủ.

Tiêu đề của một tài nguyên nói chung sẽ nhỏ hơn nhiều (tính theo tổng số byte) so với dữ liệu tài nguyên được liên kết với nó ("nội dung" của phản hồi). Thông tin tiêu đề đủ thông tin để cho phép trình duyệt xác định độ mới của tài nguyên trong bộ nhớ cache của nó.

Yêu cầu HEAD thường được sử dụng để xác minh tính hợp lệ của tài nguyên máy chủ (nghĩa là tài nguyên đó có còn tồn tại không và nếu có, nó đã được cập nhật kể từ lần cuối trình duyệt truy cập chưa?). Trình duyệt sẽ sử dụng những gì trong bộ nhớ cache của nó nếu yêu cầu HEAD cho biết tài nguyên hợp lệ, nếu không, nó sẽ thực hiện một yêu cầu GET hoặc POST đầy đủ và làm mới bộ nhớ cache của nó với những gì được trả về.

Với một yêu cầu có điều kiện, trình duyệt sẽ gửi các trường trong tiêu đề mô tả độ mới của tài nguyên được lưu trong bộ nhớ cache của nó. Lần này, máy chủ xác định xem bộ nhớ cache của trình duyệt có còn mới hay không.

Nếu đúng như vậy, máy chủ trả về phản hồi 304 chỉ với thông tin tiêu đề của tài nguyên và không có nội dung tài nguyên (dữ liệu). Nếu bộ nhớ đệm của trình duyệt được xác định là đã lỗi thời, thì máy chủ sẽ trả về phản hồi 200 OK đầy đủ.

Cơ chế này nhanh hơn so với sử dụng yêu cầu HEAD, vì nó loại bỏ khả năng phải đưa ra hai yêu cầu thay vì một.

Phần trên đơn giản hóa những gì có thể là một quá trình khá phức tạp. Có rất nhiều điều chỉnh liên quan đến bộ nhớ đệm, nhưng tất cả đều được kiểm soát thông qua các trường tiêu đề, trong đó quan trọng nhất là kiểm soát bộ đệm.

Kiểm soát bộ nhớ đệm

Khi phản hồi một yêu cầu, máy chủ sẽ gửi các trường tiêu đề đến trình duyệt cho biết hành vi nào sẽ thích ứng khi lưu vào bộ nhớ đệm. Nếu tôi tải trang tại //en.wikipedia.org/wiki/Uniform_Resource_Identifier, phản hồi chứa điều này trong bản ghi tiêu đề của nó:

cache-control: private, s-maxage=0, max-age=0, must-revalidate 

private có nghĩa là chỉ trình duyệt mới nên lưu nội dung tài liệu vào bộ nhớ cache.

s-maxagemax-age được đặt thành 0 . Các s-maxage giá trị cho các máy chủ proxy với cache, trong khi maxage dành cho trình duyệt. Hiệu quả của việc thiết lập max-age mình là tài nguyên được lưu trữ hết hạn ngay lập tức, tuy nhiên nó vẫn có thể được sử dụng (mặc dù cũ) trong trang web load lại trong khi trong phiên cùng một trình duyệt.

Tài nguyên cũ có thể được xác thực lại thông qua yêu cầu HEAD, có thể được theo sau bởi yêu cầu GET hoặc POST, tùy thuộc vào phản hồi. Lệnh phải xác thực lại lệnh cho trình duyệt xác thực lại tài nguyên được lưu trong bộ nhớ cache nếu nó đã cũ.

max-age được đặt thành 0 trong trường hợp này, tài nguyên được lưu trong bộ nhớ cache sẽ ngay lập tức cũ sau khi nhận được. Sự kết hợp của hai chỉ thị tương đương với no-cache chỉ thị duy nhất .

Hai cài đặt đảm bảo rằng trình duyệt luôn xác thực lại tài nguyên được lưu trong bộ nhớ cache, cho dù vẫn trong cùng một phiên hay không.

Các lệnh kiểm soát bộ nhớ cache rất rộng và đôi khi khó hiểu - chúng là một chủ đề theo đúng nghĩa của chúng. Có thể tìm thấy danh sách đầy đủ các chỉ thị được lập thành văn bản tại đây.

Thẻ điện tử

Đây là mã thông báo mà máy chủ gửi và trình duyệt giữ lại cho đến khi có yêu cầu tiếp theo. Điều này chỉ được sử dụng khi trình duyệt biết rằng thời gian tồn tại của bộ nhớ cache của tài nguyên đã hết hạn.

Thẻ điện tử là các giá trị băm do máy chủ tạo, thường sử dụng tên tệp vật lý của tài nguyên và ngày sửa đổi cuối cùng trên máy chủ làm hạt giống. Khi tệp tài nguyên được cập nhật, ngày sửa đổi sẽ thay đổi và giá trị băm mới được tạo và gửi trong tiêu đề phản hồi cho yêu cầu.

Các thẻ tiêu đề khác ảnh hưởng đến bộ nhớ đệm

Các thẻ tiêu đề hết hạnđược sửa đổi lần cuối đều đã lỗi thời, nhưng vẫn được hầu hết các máy chủ gửi để tương thích ngược với các trình duyệt cũ hơn. Một ví dụ:

expires: Thu, 01 Jan 1970 00:00:00 GMT last-modified: Sun, 01 Mar 2020 17:59:02 GMT 

Ở đây, ngày hết hạn được đặt thành ngày thứ 0 (theo lịch sử, từ hệ điều hành UNIX). Điều đó cho thấy rằng tài nguyên sẽ hết hạn ngay lập tức, giống như max-age = 0 . Lần sửa đổi cuối cùng cho trình duyệt biết thời điểm cập nhật mới nhất cho tài nguyên, sau đó nó có thể sử dụng bản cập nhật này để quyết định xem có nên tìm nạp lại tài nguyên hay không thay vì sử dụng giá trị bộ nhớ cache.

Buộc làm mới bộ nhớ cache từ trình duyệt

Tải lại khó là gì?

Tải lại cứng buộc phải tìm nạp lại tất cả các tài nguyên trên một trang, cho dù đó là nội dung, tập lệnh, bảng định kiểu hay phương tiện. Khá nhiều thứ, phải không?

Vâng, một số tài nguyên có thể không được đưa vào một trang rõ ràng. Thay vào đó, chúng có thể được tìm nạp động, thường là sau khi mọi thứ rõ ràng đã được tải.

Trình duyệt không biết trước điều này sẽ xảy ra và khi nó xảy ra, các yêu cầu sau này (thường được khởi tạo bởi các tập lệnh) sẽ vẫn sử dụng các bản sao được lưu trong bộ nhớ cache của các tài nguyên đó nếu có.

Xóa bộ nhớ cache và tải lại cứng là gì?

Thao tác này xóa toàn bộ bộ nhớ cache của trình duyệt, có tác dụng tương tự như tải lại cứng, nhưng cũng khiến các tài nguyên được tải động cũng được tìm nạp - xét cho cùng, không có gì trong bộ nhớ cache, vì vậy không có lựa chọn nào khác!

Mạng phân phối nội dung: bộ nhớ cache được định vị địa lý

CDN không chỉ là một bộ nhớ cache, mà bộ nhớ đệm là một trong những công việc của nó. CDN lưu trữ dữ liệu ở các vị trí được phân phối theo địa lý để giảm thời gian khứ hồi đến và đi từ một trình duyệt cục bộ theo địa lý.

Các yêu cầu trình duyệt được chuyển đến một CDN gần đó, do đó rút ngắn khoảng cách vật lý dữ liệu phản hồi phải di chuyển. CDN cũng có thể xử lý một lượng lớn lưu lượng truy cập và cung cấp bảo mật chống lại một số kiểu tấn công.

CDN nhận tài nguyên của nó thông qua Điểm trao đổi Internet (IXP), các nút là một phần của xương sống của Internet (in mũ). Có các bước cần thực hiện để thiết lập định tuyến yêu cầu đến CDN thay vì máy chủ lưu trữ. Bước tiếp theo là đảm bảo CDN có nội dung hiện tại của trang web của bạn.

Ngày xưa, hầu hết các CDN đều hỗ trợ phương pháp đẩy: một trang web sẽ đẩy nội dung mới đến một trung tâm CDN, sau đó sẽ được phân phối đến các nút phân tán theo địa lý.

Ngày nay, hầu hết các CDN sử dụng các giao thức bộ nhớ đệm được mô tả ở trên (hoặc tương tự) để 1) tải xuống các tài nguyên mới và 2) làm mới các tài nguyên hiện có. Trình duyệt vẫn có bộ nhớ cache và không có gì thay đổi. Tất cả những gì CDN làm là làm cho việc chuyển các tài nguyên mới nhanh hơn.