2009-09-13 11 views

Répondre

41

Vous pouvez définir l'expiration de la clé sur une date, en fournissant un horodatage Unix au lieu d'un nombre de jours. Cette date peut être plus de 30 jours dans le futur:

Les durées d'expiration sont spécifiées en secondes entières non signées. Ils peuvent être définis à partir de 0, ce qui signifie "ne jamais expirer", à 30 jours (60 * 60 * 24 * 30). Toute heure supérieure à 30 jours est interprétée comme une date d'horodatage unix. Si vous voulez expirer un objet le 1er janvier de l'année prochaine, voici comment vous faites cela.

https://github.com/memcached/memcached/wiki/Programming#expiration

Mais, as you say, si vous définissez l'expiration clé d'un laps de temps plutôt que d'une date, le maximum est 2,592,000 secondes ou 30 jours.

+2

OMG, Nous avons eu de nombreux cas dans Rails de: expires_in => 1.month. Passez à 1.month.from_now pour utiliser une date. –

+2

Le lien référencé est mort :( – marcgg

+1

@marcgg: aha oui, bien repéré, merci .. –

15

Si vous ne fournissez pas l'expiration et le cache est plein alors les plus anciennes valeurs clés sont expirés première:

La mémoire est également récupéré quand il est temps d'enregistrer un nouvel élément. S'il n'y a pas de segments libres, et pas de pages libres dans la classe de plaque appropriée, memcached considérera la fin de la LRU pour qu'un article soit "récupéré". Il va rechercher les derniers éléments dans la queue pour celui qui a déjà expiré, et est donc libre pour la réutilisation. S'il ne peut pas trouver un objet expiré cependant, il "expulsera" celui qui n'a pas encore expiré. Il est ensuite noté dans plusieurs compteurs statistiques

https://github.com/memcached/memcached/wiki/UserInternals#when-are-items-evicted

+2

Êtes-vous 100% sûr à ce sujet? –

+1

Oui, @DeeJay ', je viens de trouver cet article: http://code.google.com/p/memcached/wiki/NewUserInternals – Brett

+2

'La mémoire est également récupérée quand il est temps de stocker un nouvel élément. S'il n'y a pas de segments libres, et pas de pages libres dans la classe de plaque appropriée, memcached considérera la fin de la LRU pour qu'un article soit "récupéré". Il va rechercher les derniers éléments dans la queue pour celui qui a déjà expiré, et est donc libre pour la réutilisation. S'il ne peut pas trouver un objet expiré cependant, il "expulsera" celui qui n'a pas encore expiré. Ceci est ensuite noté dans plusieurs compteurs statistiques. » – Brett

0

OK, j'ai découvert que le nombre de secondes ne peut dépasser 2592000 (30 jours). Donc, le délai d'expiration maximum est de 30 jours.

+11

Non, ce n'est pas vrai. Le nombre de secondes dans un formulaire * duration * ne doit pas dépasser 30 jours. Vous pouvez spécifier une expiration trois mois si vous le souhaitez en temps absolu. Vous pouvez également spécifier 0 pour ne pas avoir d'expiration. – Dustin

+2

J'ai également découvert que si vous fournissez une durée d'expiration trop longue, la valeur n'est pas stockée du tout. – Datageek

+1

J'ai trouvé que 30 jours ne fonctionne pas (n'écrit pas le cache) mais 29 jours ne fonctionne pas. – Zubin

9

Il n'y a pas de limite. La limite de 30 jours est si vous donnez la quantité de secondes, il devrait rester là, mais si vous donnez un horodatage, il n'y a que la valeur max long ou int sur la machine qui peut être une limite.

->set('key', 'value', time() + 24*60*60*365) fera que la clé restera là pendant un an par exemple, mais oui si le cache est plein ou redémarré entre les deux, cette valeur peut être supprimée.

0

Sur Laravel config.session.lifetime réglage que si réglé pour être un équivalent de 30 jours ci-dessus, sera considéré comme un horodatage (cela donne une erreur de token mismatch à chaque fois en supposant que memcached est utilisé).

Pour répondre, l'expiration de memcached peut être définie à tout moment. (Le paramètre par défaut de Laravel (sur v5.0) vous définira à un horodatage déjà expiré). Si vous ne l'avez pas défini, le defualt sera utilisé.

0

On dirait que certaines réponses ne sont plus valables.

J'ai découvert qu'une clé ne se réglait pas du tout lorsque le TTL est trop élevé. Par exemple 2992553564.

testé avec le code PHP suivant:

var_dump($memcached->set($id, "hello", 2992553564); // true 
var_dump($memcached->get($id));      // empty! 

var_dump($memcached->set($id, "hello", 500); // true 
var_dump($memcached->get($id));    // "hello" 

version est memcached 1.4.14-0ubuntu9.

Questions connexes