Làm cách nào để lưu trữ kết quả của db_query ()?


9

Tôi đã từng views_get_view_result()nhận được kết quả từ một lượt xem vì nó thuận tiện vào thời điểm đó. Kết quả truy vấn hiếm khi thay đổi; Tôi có thể sử dụng bộ nhớ đệm xem trong 6 ngày.

Nếu tôi muốn chuyển đổi nó thành một cuộc gọi để db_query()làm cách nào tôi có thể kích hoạt bộ đệm ẩn?

Câu trả lời:


9

Không làm mờ bộ nhớ đệm nếu bạn sử dụng chế độ xem hoặc db_query (). Bộ nhớ đệm hoạt động luôn giống nhau, cách dữ liệu được tìm nạp khi bộ nhớ cache hoàn toàn phụ thuộc vào bạn.

  1. Xây dựng ID bộ đệm để xác định mục bộ nhớ cache của bạn. Có thể là một chuỗi đơn giản, mã hóa cứng hoặc một cái gì đó phức tạp dựa trên các đối số, v.v.
  2. Kiểm tra nếu có thể tải từ bộ đệm.
  3. Nếu không, xây dựng lại dữ liệu và đưa nó vào bộ đệm với thời gian hết hạn mong muốn.

Để xem một số ví dụ, bạn có thể xem các hàm sử dụng cache_get () , ví dụ biến_initialize () .

Nếu hàm của bạn được gọi nhiều lần thì có lẽ bạn muốn kết hợp nó với bộ đệm tĩnh, xem ví dụ archiver_get_info () . Và nếu việc xây dựng lại dữ liệu thực sự chậm, bạn có thể ngăn nó xảy ra nhiều lần bằng cách sử dụng khung khóa như biến_initialize ().

Lưu ý rằng lưu trữ một truy vấn duy nhất chỉ có ý nghĩa nếu đó là một truy vấn chậm, bởi vì cache_get () cũng là một truy vấn db trừ khi bạn sử dụng một phụ trợ bộ đệm thay thế như Memcache.

Và cuối cùng, Chế độ xem có bộ nhớ đệm đã được tích hợp sẵn và có thể được định cấu hình trong chế độ xem của bạn. Vì vậy, đó có thể là một lựa chọn là tốt.


Hãy đánh bại tôi;) Tôi sẽ để lại câu trả lời của mình dưới dạng ví dụ mã nhưng đây là cách thông tin hữu ích hơn
Clive

Tôi nghĩ rằng các trường hợp PDO không được tuần tự hóa?
mpdon Arena

1
Không, họ không, nhưng điều đó không liên quan. Bạn không lưu trữ tài nguyên kết quả pdo, bạn lưu trữ bất kỳ cấu trúc dữ liệu nào bạn thực sự tìm nạp từ truy vấn đó.
Berdir

Tôi sẽ nói rằng nó rất có liên quan. @MotoTribe đã hỏi về kết quả bộ đệm từ db_query()và phải lưu bộ đệm giá trị từ $results->fetchAll()và không phải $resultslà chìa khóa để thực sự làm cho nó hoạt động.
mpdon Arena

7

Tôi không nghĩ rằng lớp DB có bất kỳ cơ chế lưu trữ được tích hợp sẵn nào (mặc dù tôi có thể sai), nhưng bạn có thể sử dụng API bộ đệm mặc định.

Đây chỉ là một ví dụ cơ bản sẽ lưu trữ kết quả của truy vấn để nhận các nút thuộc một loại nhất định:

function MYMODULE_get_nodes_by_type($type) {
  // Setup a cache ID
  $cid = 'MYMODULE:node_types:' . $type;

  // If a cached entry exists, return it
  if ($cached = cache_get($cid)) {
    return $cached->data;
  }

  // Otherwise load the data
  $data = db_query('SELECT * FROM {node} WHERE type = :type', array(':type' => $type))->fetchAll();

  // And cache it
  cache_set($cid, $data, 'cache', strtotime('+6 days'));
}

3

Ngoài cơ chế cache_set / cache_get tiêu chuẩn mà Drupal cung cấp, nếu bạn đang sử dụng MySQL làm cơ sở dữ liệu của mình, thì bạn có thể bật bộ đệm truy vấn , có thể lưu trữ kết quả của các khung nhìn hoặc bất kỳ truy vấn cơ sở dữ liệu nào khác. mysqltuner có thể hỗ trợ trong việc tìm ra các giá trị tốt cho kích thước bộ đệm.

Chỉ cần lưu ý rằng nếu bạn đang viết nhiều vào cơ sở dữ liệu, thì bộ đệm truy vấn sẽ trở nên kém hiệu quả hơn do cách thức hoạt động của chiến lược vô hiệu hóa bộ đệm (ghi vào bảng làm mất hiệu lực tất cả các mục CHỌN TỪ hoặc THAM GIA bảng đó).

Ngoài ra còn có một cơ chế lưu trữ cho PostgreSQL , nhưng tôi không có kinh nghiệm trực tiếp với nó.


3

Gần đây tôi đã phát hiện ra mô-đun Hành động Cache . Với mô-đun này, bạn có thể đặt bộ đệm ẩn chế độ xem thành Bộ đệm được kích hoạt theo quy tắc và tạo quy tắc để vô hiệu hóa bộ đệm trên các chế độ xem và chế độ xem cụ thể.

Ví dụ: bộ đệm cho chế độ xem liệt kê các nút của một loại nội dung cụ thể có thể được làm trống khi một nút mới được tạo của loại nội dung đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.