2011-05-20 127 views
8

比方說,我有以下代碼:設置已存在的memcached密鑰是否刷新過期時間?

Memcached->set('key', 'value', 60); (expire in one minute) 

while (1) { 
    sleep 1 second; 
    data = Memcached->get('key'); 
    // update data 
    Memcached->set('key', data, 60); 
} 

60後反覆循環,將許可證過期和閱讀時,我會得到一個NULL?或者,連續設置是否將每次到期時間推到最後一組後的1分鐘?

該文檔提到了這一點,我已經在不同的環境中測試了這一點,我很確定我得到了不同的結果。

+0

從[這個問題](http://programmingbulls.com/php-memcache-key-expire)我猜「是」。但這不是權威性的,也不會使用memcached。快樂的編碼。 – 2011-05-20 04:48:32

回答

6

好吧,發現最終的實驗我的答案...

原來的「設置」 延長到期,它基本上是相同的,與新的到期再刪除該項目,並設置它。

但是,增量不會延長到期的。如果您增加一個密鑰,它將保持原先的設置時的初始到期時間。

+1

你有答案的來源嗎? – KyleWpppd 2012-04-16 22:28:15

+0

如果您附加更新後的來源,情況會更好。 – Harshit 2015-08-26 16:45:01

0

該集並不關心可能存在的內容,也不能認爲它甚至來自同一個應用程序。

你測試了什麼,獲得了哪些結果? Memcached從不保證返回一個值,所以如果你看到它丟失了,就很有可能構造一個測試,無論過期如何,這個測試都會丟失。

+0

...假設價值只在到期時被驅逐(設想這是爲了問題而嚴格執行的),並且總是以其他方式返回... – 2011-05-20 04:39:13

+0

我不確定我是否理解......您是說到期續約該集? – 2011-05-20 08:42:27

+0

我在說這是一個完全不同的項目。在那裏和你所設定的之間沒有任何關係。它不會更新它,它會創造新的東西。 – Dustin 2011-05-22 23:52:02

3

如果你只是想,而不是延長每次基本重置數據的到期時間爲一個特定的鍵,你可以只使用Memcached::touch

這樣,您必須根據啓用二進制協議的警告評論上述頁面。

$memcached = new Memcached(); 
$memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, true); 
$memcached->touch('key', 120); 
+0

ascii協議還支持更新版本的php-memcached和memcached。您不再僅限於二進制協議。 – 2016-09-01 14:12:32

0

最佳文檔源是Memcached protocol description

First, the client sends a command line which looks like this: 

<command name> <key> <flags> <exptime> <bytes> [noreply]\r\n 

- <command name> is "set", "add", "replace", "append" or "prepend" 

您可能看到,每個命令的上述具有exptime字段是強制性的。

因此, - 它會更新到期時間。此外,memcached使用自己的鍵/標誌/過期/值創建新項目,並用它替換舊項目。

0

如果您的目標是簡單地延長到期時間,請使用命令touch,該命令用於爲密鑰設置新的過期時間。

參見https://manned.org/memctouchhttp://docs.libmemcached.org/bin/memtouch.html

Debian軟件包:libmemcached工具

從貝:man memctouch

其他發行用 「memtouch」 作爲命令行工具的名稱

+ 1從memcached協議鏈接,作爲手動參考: https://github.com/memcached/memcached/blob/master/doc/protocol.txt#L318

舉例:

memctouch --servers=localhost --expire=60 $key 

其中$關鍵是你的「鑰匙」,這將設置過期時間爲60秒,在你的榜樣,但無需作出的「get」重新設置鍵。如果你的'鑰匙'還沒有設置,你的'get'沒有返回一些數據怎麼辦?

相關問題