it-swarm-vi.com

Có cách nào để vô hiệu hóa tất cả các mục nhập memcache bắt đầu bằng "Người dùng *" không?

Gần đây tôi đã thực hiện một thay đổi cho lớp Người dùng của mình (được ghi nhớ); Có cách nào để tôi có thể làm mất hiệu lực tất cả các mục có khóa bắt đầu bằng User mà không làm mất hiệu lực toàn bộ bộ đệm không?

Nếu không có cách giải quyết? Tôi thà không xóa mọi thứ.

2
Thomas Bonini

Trong Câu hỏi thường gặp về memcached , Xóa theo không gian tên :

Mặc dù memcached không hỗ trợ bất kỳ loại ký tự đại diện nào xóa hoặc xóa theo không gian tên (vì không có không gian tên), có một số thủ thuật có thể được sử dụng để mô phỏng điều này. Tuy nhiên, họ yêu cầu thêm các chuyến đi đến các máy chủ memcached.

Ví dụ, trong PHP, để sử dụng một không gian tên gọi là foo:

$ns_key = $memcache->get("foo_namespace_key");
// if not set, initialize it
if($ns_key===false) $memcache->set("foo_namespace_key", Rand(1, 10000));
// cleverly use the ns_key
$my_key = "foo_".$ns_key."_12345";
$my_val = $memcache->get($my_key);

//To clear the namespace do:
$memcache->increment("foo_namespace_key");

Nếu bạn đang dự định làm một cái mền chỉ một phần của bộ đệm, bạn có thể cân nhắc đặt thời hạn sử dụng thành một khoảng thời gian ngắn hơn.

3
artlung

Vì memcached không có không gian tên hoặc một cái gì đó như xóa/truy vấn bằng ký tự đại diện, bạn có thể thực hiện thủ thuật này: lưu tất cả các khóa bắt đầu bằng không gian tên "user_" trong một khóa.

Ví dụ

$keys = array('user_1', 'user_2', 'user_3');
$memcache->set('user_', $keys);

Bây giờ khi bạn muốn xóa tất cả các khóa bắt đầu bằng "user_", trước tiên hãy lấy khóa "user_". Bằng cách đó, bạn có tất cả các khóa bạn muốn xóa

$all_keys = $memcache->get('user_');
if($all_keys){
    foreach($all_keys as $key){
        $memcache->delete($key);
    }
}
2
Ha Doan Ngoc