2009-07-25 29 views
5

Tôi muốn triển khai memcached trên trang mạng xã hội của mình. Là một mạng xã hội, hầu hết dữ liệu thay đổi rất thường xuyên.Làm cách nào để cải thiện hiệu suất của trang web mạng xã hội bằng memcached?

Ví dụ: nếu tôi lưu trữ 10.000 người dùng của người dùng trong bộ nhớ cache, bất cứ khi nào anh ấy thêm một người bạn, bộ nhớ cache sẽ cần được cập nhật. Nó đủ dễ dàng, nhưng nó cũng sẽ cần phải cập nhật bất cứ lúc nào một người nào đó thêm chúng như một người bạn. Đó là rất nhiều cập nhật chỉ trên danh sách bạn bè một mình.

Ngoài ra còn có các blog và bản tin người dùng được đăng không ngừng với những blog mới và bạn chỉ có thể xem những người được tạo bởi người dùng trong danh sách bạn bè của bạn, vì vậy tôi nghĩ điều này rất khó để lưu vào bộ nhớ cache.

Tôi có thể thấy có thể lưu vào bộ nhớ cache một số thông tin hồ sơ chỉ thay đổi khi người dùng cập nhật tiểu sử của họ. Tuy nhiên, điều này sẽ tạo bản ghi bộ nhớ cache cho mọi người dùng, nếu có hơn 100.000 người dùng có nhiều bộ nhớ đệm. Đây có phải là một ý tưởng tốt?

+2

Câu hỏi này thực sự cần tiêu đề tốt hơn. –

Trả lời

2

Tôi có thể nói rằng bạn nên lưu bộ nhớ cache ở nơi có thể .... phần lớn thời gian bạn có thể kéo các mục từ memcached (đặc biệt nếu bạn có kết nối phức tạp và nhanh hơn) so với RDBMS truyền thống. Tôi hiện đang sử dụng một chiến lược như vậy với thành công rực rỡ, và đây là những gì tôi đã học được từ kinh nghiệm:

  1. nếu có thể, bộ nhớ cache vô hạn định, và viết một giá trị mới khi một sự thay đổi được thực hiện. cố gắng không thực hiện xóa rõ ràng, vì bạn có thể gây ra tình trạng cuộc đua với nhiều truy cập đồng thời vào dữ liệu đang cố gắng cập nhật bộ nhớ cache. cũng thực hiện khóa nếu một mục không tồn tại trong bộ nhớ cache để ngăn chặn vấn đề trên (sử dụng memcached "thêm" + thời gian ngủ ngắn trong vòng lặp)

  2. làm mới bộ nhớ cache trong nền nếu có thể, bằng cách sử dụng hàng đợi. Triển khai của tôi hiện đang sử dụng một quy trình perl đa luồng chạy trong background + beanstalkd, do đó ngăn ngừa thời gian trễ trên giao diện người dùng. hầu hết các thay đổi thời gian có thể xảy ra một khoảng thời gian ngắn.

  3. sử dụng memcached getmulti nếu có thể, nhiều cuộc gọi memcached riêng biệt thực sự được bổ sung.

  4. cấp bộ nhớ cache của bạn, khi kiểm tra một mục, kiểm tra mảng cục bộ trước, sau đó ghi nhớ, sau đó là db. kết quả bộ nhớ cache trong mảng cục bộ sau lần truy cập đầu tiên để ngăn chặn việc đánh nhiều lần trong một lần thực thi tập lệnh cho cùng một mục. EDIT: để làm rõ, nếu sử dụng một ngôn ngữ kịch bản như PHP, mảng địa phương sẽ chỉ sống chừng nào thực hiện kịch bản hiện nay :) một ví dụ:

    class Itemcache { 
        private $cached_items = array(); 
        private $memcachedobj; 
    
        public function getitem($memcache_key){ 
         if(isset($this->cached_items[$memcache_key])){ 
          return $this->cached_items[$memcache_key]; 
         }elseif($result = $this->memcachedobj->get($memcache_key)){ 
          $this->cached_items[$memcache_key] = $result; 
          return $result; 
         }else{ 
          // db query here as $dbresult 
          $this->memcachedobj->set($memcache_key,$dbresult,0); 
          $this->cached_items[$memcache_key] = $dbresult; 
          return $dbresult; 
        } 
    } 
    
  5. viết một hàm wrapper mà thực hiện các chiến lược bộ nhớ đệm trên #4.

  6. sử dụng cấu trúc khóa nhất quán trong memcached, ví dụ: 'userinfo_ {user.pk}' trong đó user.pk là khóa chính của người dùng trong rdbms.

  7. nếu dữ liệu của bạn yêu cầu xử lý sau, thực hiện việc xử lý này nếu có thể TRƯỚC KHI đặt trong bộ nhớ cache, sẽ lưu một vài chu kỳ trên mỗi lần truy cập dữ liệu đó.

+0

"kết quả bộ nhớ cache trong mảng cục bộ sau lần truy cập đầu tiên để tránh bị đánh nhiều lần trong một lần thực thi tập lệnh cho cùng một mục". Ý bạn là gì? Bạn có nghĩa là lưu một mảng giống như một phiên hoặc một cái gì đó?Ngoài ra tôi tự hỏi làm thế nào tôi có thể cache một danh sách bạn bè để sử dụng, vấn đề tôi thấy là người dùng cập nhật và thêm bạn bè thường xuyên và cũng là cách khác xung quanh nơi người dùng sẽ thêm người đó làm bạn, bộ nhớ cache sẽ cần phải được cập nhật mọi lúc một người bạn được thêm vào rất thường xuyên, cũng nếu có 50.000 người dùng, bạn có thể nhớ cache danh sách bạn bè cho 50.000 người dùng? .next commet-> – JasonDavis

+0

Một số danh sách có thể có 20.000 ID của bạn bè? – JasonDavis

+0

theo mảng, ý tôi là cục bộ. php ex. bạn có một lớp var gọi là $ array_cache, sau khi lấy kết quả từ memcached lần đầu tiên lưu kết quả của bạn trong mảng với $ this-> array_cache [$ memcache_key] = $ memcache_value; sau đó gọi phương thức tiếp theo nếu (isset ($ this-> array_cache [$ memcache_key])) trả về $ this-> array_cache [$ memcache_key]; để trong khi thực thi tập lệnh CURRENT, nó sẽ không cần phải gọi lại memcached cho cùng một kết quả (nếu bạn kết thúc cuộc gọi cho cùng một mục hai lần trở lên). cuộc gọi tiếp theo của kịch bản dĩ nhiên sẽ gọi lại memcached. -> nhận xét tiếp theo – Jason

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