Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách tốt nhất để xử lý các vấn đề đồng thời

Câu trả lời của Donnie (thăm dò ý kiến) có lẽ là lựa chọn tốt nhất của bạn - đơn giản và hiệu quả. Nó sẽ bao gồm hầu hết mọi trường hợp (việc tra cứu PK đơn giản không chắc sẽ ảnh hưởng đến hiệu suất, ngay cả trên một trang web rất phổ biến).

Để hoàn thiện và nếu bạn muốn tránh bỏ phiếu, bạn có thể sử dụng mô hình đẩy . Có nhiều cách khác nhau được mô tả trong bài viết Wikipedia. Nếu bạn có thể duy trì một bộ nhớ cache ghi qua (mỗi khi bạn cập nhật bản ghi, bạn cập nhật bộ nhớ cache), thì bạn gần như có thể loại bỏ hoàn toàn việc tải cơ sở dữ liệu.

Tuy nhiên, không sử dụng cột dấu thời gian "last_updated". Chỉnh sửa trong cùng một giây không phải là chưa từng thấy. Bạn có thể bỏ qua nó nếu bạn thêm thông tin bổ sung (máy chủ đã cập nhật, địa chỉ từ xa, cổng, v.v.) để đảm bảo rằng, nếu hai yêu cầu đến cùng một giây, đến cùng một máy chủ, bạn có thể phát hiện ra sự khác biệt. Tuy nhiên, nếu bạn cần độ chính xác đó, bạn cũng có thể sử dụng trường sửa đổi duy nhất (nó không nhất thiết phải là một số nguyên tăng dần, chỉ là duy nhất trong vòng đời của bản ghi đó).

Ai đó đã đề cập đến các kết nối liên tục - điều này sẽ làm giảm chi phí thiết lập của các truy vấn thăm dò (mọi kết nối đều tiêu tốn tài nguyên trên cơ sở dữ liệu và máy chủ, đương nhiên). Bạn sẽ giữ một kết nối duy nhất (hoặc càng ít càng tốt) mở mọi lúc (hoặc càng lâu càng tốt) và sử dụng kết nối đó (kết hợp với bộ nhớ đệm và ghi nhớ, nếu muốn).

Cuối cùng, có các câu lệnh SQL cho phép bạn thêm một điều kiện vào UPDATE hoặc INSERT. SQl của tôi thực sự bị gỉ, nhưng tôi nghĩ nó giống như UPDATE ... WHERE ... . Để phù hợp với mức độ bảo vệ này, bạn sẽ phải thực hiện khóa hàng của riêng mình trước khi gửi bản cập nhật (và tất cả việc xử lý và dọn dẹp lỗi có thể gặp phải). Nó không chắc bạn cần điều này; Tôi chỉ đề cập đến nó để hoàn thiện.

Chỉnh sửa:

Giải pháp của bạn có vẻ ổn (dấu thời gian trong bộ nhớ cache, yêu cầu thăm dò proxy đến một máy chủ khác). Thay đổi duy nhất tôi muốn thực hiện là cập nhật dấu thời gian được lưu trong bộ nhớ cache mỗi lần lưu. Điều này sẽ giữ cho bộ nhớ cache mới hơn. Tôi cũng sẽ kiểm tra dấu thời gian trực tiếp từ db khi lưu để ngăn việc lưu bị lén do dữ liệu bộ nhớ cache cũ.

Nếu bạn sử dụng APC để lưu vào bộ nhớ đệm, thì máy chủ HTTP thứ hai không có ý nghĩa gì - bạn phải chạy nó trên cùng một máy (APC sử dụng bộ nhớ được chia sẻ). Cùng một máy vật lý sẽ thực hiện công việc, nhưng với chi phí bổ sung của máy chủ HTTP thứ hai. Nếu bạn muốn tắt tải các yêu cầu thăm dò đến máy chủ thứ hai (trong trường hợp của bạn là lighttpd), thì tốt hơn là nên thiết lập lightttpd trước Apache trên một máy vật lý thứ hai và sử dụng máy chủ lưu trữ chia sẻ (memcache) để Máy chủ lighttpd có thể đọc dấu thời gian đã lưu trong bộ nhớ cache và Apache có thể cập nhật dấu thời gian đã lưu trong bộ nhớ cache. Lý do để đặt lighttpd trước Apache là, nếu hầu hết các yêu cầu là yêu cầu thăm dò, để tránh việc sử dụng quy trình Apache nặng hơn.

Bạn có thể không cần một máy chủ thứ hai, thực sự. Apache sẽ có thể xử lý các yêu cầu bổ sung. Nếu không được, thì tôi sẽ truy cập lại cấu hình của bạn (cụ thể là các lệnh kiểm soát số lượng quy trình worker mà bạn chạy và bao nhiêu yêu cầu chúng được phép xử lý trước khi bị hủy).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Những sai lầm hàng đầu cần tránh trong MySQL Replication

  2. Tại sao kết quả từ một truy vấn SQL không trở lại theo thứ tự tôi mong đợi?

  3. Truy vấn MySQL cơ bản

  4. Lỗi PDO:SQLSTATE [HY000]:Lỗi chung:2031

  5. Trình cài đặt MySql Workbench yêu cầu cài đặt Gói Visual C ++ 2015 Redistributable nhưng nó đã được cài đặt