9

Tôi đã lấy một lớp cơ sở dữ liệu trong học kỳ này và chúng tôi đang nghiên cứu về việc duy trì tính nhất quán của bộ đệm giữa RDBMS và một máy chủ cache như memcached. Các vấn đề nhất quán phát sinh khi có điều kiện chủng tộc. Ví dụ:Tính nhất quán của Cache khi sử dụng memcached và rdbms như MySQL

  1. Giả sử tôi làm get(key) từ bộ nhớ cache và thiếu bộ nhớ cache. Bởi vì tôi nhận được một bộ nhớ cache bỏ lỡ, tôi lấy dữ liệu từ cơ sở dữ liệu, và sau đó làm một put(key,value) vào bộ nhớ cache.
  2. Tuy nhiên, điều kiện chủng tộc có thể xảy ra, trong đó một số người dùng khác có thể xóa dữ liệu tôi đã tìm nạp từ cơ sở dữ liệu. Việc xóa này có thể xảy ra trước khi tôi thực hiện put vào bộ nhớ cache.

Do đó, lý tưởng là put vào bộ nhớ cache sẽ không xảy ra vì dữ liệu còn tồn tại trong cơ sở dữ liệu.

Nếu mục nhập bộ nhớ cache có TTL, mục nhập trong bộ nhớ cache có thể hết hạn. Nhưng vẫn còn, có một cửa sổ nơi dữ liệu trong bộ nhớ cache không phù hợp với cơ sở dữ liệu.

Tôi đã tìm kiếm các bài báo/tài liệu nghiên cứu nói về loại vấn đề này. Nhưng, tôi không thể tìm thấy bất kỳ tài nguyên hữu ích nào.

Trả lời

0

Làm thế nào về việc sử dụng biến lưu trong memcache làm tín hiệu khóa?

mỗi lệnh memcache duy nhất là nguyên tử

sau khi bạn lấy dữ liệu từ db, bật tắt khóa trên

sau khi bạn đưa dữ liệu vào memcache, bật tắt khóa tắt

trước khi xóa từ db, kiểm tra trạng thái khóa

-1

Khi bạn đọc, sau đây sẽ xảy ra:

if(Key is not in cache){ 
    fetch data from db 
    put(key,value); 
}else{ 
    return get(key) 
} 

Khi bạn viết, sau đây sẽ xảy ra:

1 delete/update data from db 
2 clear cache 
+0

hãy giải thích cách điều kiện chủng tộc được đề cập trong câu hỏi được khắc phục. câu trả lời của bạn dường như không giải quyết được vấn đề. – Alexey

0

Bài viết này cung cấp cho bạn một lưu ý thú vị về cách Facebook (cố gắng) duy trì bộ nhớ cache nhất quán: http://www.25hoursaday.com/weblog/2008/08/21/HowFacebookKeepsMemcachedConsistentAcrossGeoDistributedDataCenters.aspx

Dưới đây là một ý chính từ bài báo.

  1. tôi cập nhật tên đầu tiên của tôi từ "Jason" thành "khỉ"
  2. Chúng tôi viết "Khỉ" trong cơ sở dữ liệu tổng thể ở California và xóa tên đầu tiên của tôi từ memcache ở California nhưng không Virginia
  3. người đi vào my profile trong Virginia
  4. chúng tôi tìm thấy tên đầu tiên của tôi trong memcache và trở về "Jason"
  5. Replication bắt kịp và chúng tôi cập nhật cơ sở dữ liệu nô lệ với tên đầu tiên của tôi là "khỉ."Chúng tôi cũng xóa tên đầu tiên của tôi từ Virginia memcache vì đó đối tượng bộ nhớ cache xuất hiện trong dòng sao chép
  6. Một người nào khác đi vào my profile trong Virginia
  7. Chúng tôi không tìm thấy tên đầu tiên của tôi trong memcache vì vậy chúng tôi đọc từ nô lệ và nhận được "khỉ"
0

Đoạn code dưới đây đưa ra một số ý tưởng về cách sử dụng các hoạt động memcached của add, getscas để thực hiện khóa lạc quan để đảm bảo tính nhất quán của bộ nhớ cache với cơ sở dữ liệu.
Tuyên bố từ chối trách nhiệm: tôi không đảm bảo rằng nó hoàn toàn chính xác và xử lý mọi điều kiện chủng tộc. Các yêu cầu nhất quán cũng có thể khác nhau giữa các ứng dụng.

def read(k): 
    loop: 
    get(k) 
    if cache_value == 'updating': 
     handle_too_many_retries() 
     sleep() 
     continue 
    if cache_value == None: 
     add(k, 'updating') 
     gets(k) 
     get_from_db(k) 
     if cache_value == 'updating': 
     cas(k, 'value:' + version_index(db_value) + ':' + extract_value(db_value)) 
     return db_value 
    return extract_value(cache_value) 

def write(k, v): 
    set_to_db(k, v) 
    loop: 
    gets(k) 
    if cache_value != 'updated' and cache_value != None and version_index(cache_value) >= version_index(db_value): 
     break 
    if cas(k, v): 
     break 
    handle_too_many_retries() 

# for deleting we can use some 'tumbstone' as a cache value 
Các vấn đề liên quan