2009-07-14 27 views
15

Memcached có giới hạn độ dài cho các khóa (250?) Và các giá trị (khoảng 1MB), cũng như một số (theo kiến ​​thức của tôi) không được xác định rõ ràng về các hạn chế ký tự cho khóa. Cách tốt nhất để làm việc xung quanh những người trong ý kiến ​​của bạn là gì? Tôi sử dụng Perl API Cache :: Memcached.Làm thế nào để bạn làm việc xung quanh các hạn chế về khóa/giá trị của memcached?

Tôi hiện đang lưu chuỗi đặc biệt cho giá trị của khóa chính nếu giá trị ban đầu quá lớn ("phần: < number>") và trong trường hợp đó, tôi lưu trữ < number> các bộ phận có khóa có tên 1+ < phím chính>, 2 + < phím chính> vv .. Điều này có vẻ "OK" (nhưng lộn xộn) đối với một số trường hợp, không tốt cho người khác và có vấn đề nội tại là một số phần có thể bị thiếu bất cứ lúc nào (vì vậy không gian bị lãng phí để giữ cho người khác và thời gian lãng phí khi đọc chúng).

Đối với các giới hạn chính, người ta có thể triển khai băm và lưu trữ khóa đầy đủ (để xử lý xung đột) trong giá trị, nhưng tôi vẫn chưa cần làm điều này.

Có ai đưa ra một cách thanh lịch hơn hoặc thậm chí API Perl xử lý các kích thước dữ liệu tùy ý (và các giá trị khóa) một cách minh bạch không? Có ai đã hack máy chủ memcached để hỗ trợ các khóa/giá trị tùy ý không?

Trả lời

20

Các máy chủ đã cho phép bạn chỉ định bất cứ kích thước bạn muốn:

-I   Override the size of each slab page. Adjusts max item size 
       (default: 1mb, min: 1k, max: 128m) 

Tuy nhiên, hầu hết thời gian, khi mọi người đang muốn bộ nhớ cache đối tượng lớn hơn, họ đang làm gì đó sai. Bạn có thực sự cần nhiều dữ liệu đó trong một khóa bộ nhớ cache không? Không nén?

Nếu bạn có các tác vụ đủ lớn, lợi ích của truy cập độ trễ thấp bị làm giảm thời gian bạn thực sự chuyển dữ liệu. Hoặc bạn thấy rằng tung tất cả mọi thứ trong cùng một khóa có nghĩa là lối vào của bạn kết thúc lên phải làm rất nhiều công việc để deserialize một chút dữ liệu mà họ muốn.

Tùy theo nhu cầu của bạn và tôi không thể cho bạn biết điều gì là tốt nhất cho bạn mà không biết thêm về những gì bạn đang làm. Nếu bạn thực sự cần một cái gì đó lớn hơn 1MB, đó là lý do tại sao chúng tôi thêm -I, mặc dù.

0

Đối với các giá trị quá lớn, thay vì lưu trữ giá trị chuẩn (trong đó, khi được giải mã, luôn là từ điển), chúng tôi đã lưu trữ danh sách các khóa. Sau đó chúng tôi đọc dữ liệu trong mỗi khóa và khôi phục giá trị chính. Tôi nghĩ rằng chúng tôi cũng băm các khóa khi chúng quá dài (mà trong tập dữ liệu của chúng tôi có thể xảy ra, nhưng cực kỳ hiếm khi).

Chúng tôi đã viết tất cả các mã này trực tiếp trên đầu trang của khách hàng memcached (chúng tôi đã sử dụng Python), do đó, ở một mức độ cao hơn nó đã được tất cả minh bạch.

-2
$key=abs(crc32($long_key)) 

Bằng cách này, bạn có được khóa duy nhất cho truy vấn và các khóa dài khác có thể có thay đổi ngoài 250 ký tự ghi nhớ ký tự.

+20

Có thể xảy ra xung đột với bạn. –

+1

Đồng ý. CRC32 sẽ cung cấp cho bạn rất nhiều va chạm, ít nhất là sử dụng một băm MD5. –

9

$ key = abs (crc32 ($ long_key))

Bằng cách này bạn sẽ có được chìa khóa duy nhất cho truy vấn và các phím dài khác có thể có những thay đổi vượt quá 250 ký tự memcache thấy.

Whoa ... cẩn thận. Lời khuyên tốt, nhưng không có một báo trước quan trọng. Điều đó có thể gây ra xung đột.Chắc chắn nó là rất không thể xảy ra, nhưng nó chỉ bao giờ phải xảy ra một lần để gây ra một lỗi đất vỡ vụn. Bạn vẫn có thể muốn lưu trữ khóa dài với memcached và luôn luôn kiểm tra hai lần đối với các va chạm ở khóa. Cách tốt nhất để giải quyết chúng là lưu trữ một danh sách các cặp long_key/value đơn giản.

+0

Trong (hầu hết) các kịch bản mà bạn đang sử dụng memcached vào bộ nhớ cache dữ liệu được lưu giữ ở nơi khác, xác suất của một va chạm phủ nhận mối quan tâm cho chương trình xung quanh này. Đơn giản chỉ cần giám sát memcached cho tỷ lệ va chạm cao sẽ cho bạn biết nếu có một vấn đề, và chỉ sau đó là nó có giá trị nó để dành thời gian tìm kiếm các phím được ghi đè lẫn nhau. Nếu chiến lược bộ nhớ đệm được triển khai chính xác và bạn đang lưu vào bộ nhớ cache dữ liệu đã được lưu giữ lâu bền, sẽ không có lỗi phá vỡ trái đất, chỉ có sự xuống cấp hiệu suất. –

+3

Phụ thuộc vào những gì bạn đang lưu vào bộ nhớ cache. Nếu thông tin được lưu trữ là riêng tư đối với một người dùng, một va chạm băm có thể có nghĩa là rò rỉ dữ liệu riêng tư (mà tôi sẽ gọi là một lỗi phá vỡ trái đất). Cấp có băm mà làm cho xác suất va chạm băm có hiệu quả nil, nhưng crc32 không phải là một trong số chúng. Nó chỉ mất hơn 77000 giá trị cho tỷ lệ cược của một va chạm băm là 1 trong 2 (http://preshing.com/20110504/hash-collision-probabilities). Sử dụng hàm băm tốt hơn cho khóa giúp, nhưng mỗi lần triển khai bảng băm đều biết tài khoản cho các xung đột. Nó không khó; chỉ cần lưu trữ và kiểm tra khóa. – peabody

-1

Không liên quan thực tế đến câu hỏi ban đầu nhưng trong trường hợp bạn nghĩ đến việc chuyển sang APC: CPC tối đa của nó len cho khóa là 9727 ký tự. (được thử nghiệm trên PHP 5.3.2)

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