对使用 memcache 感到困惑并比较哪种解决方案更好
Confused about using memcache and compare which solution is better
先说明一下我遇到的情况
有一个apigetToken
关于访问第三方资源,
它将生成令牌和令牌的过期时间。
回复如下:
token
expired_time
我们希望通过设置缓存来防止429(请求太多)错误。
我们有两个版本。
版本 1
$cache = $memcache->get($cacheKey);
if ($cache) {
return $cache['token'];
}
// Same as code 2.
$tokenResponse = $this->getToken();
$ttl = strtotime($tokenResponse['expired_time']) - strtotime('now');
if ($ttl > 0) {
$memcache->set($cacheKey, $tokenResponse, $ttl);
} else {
throw new Exception('error');
}
return $httpResponse['token'];
版本 2
$cache = $memcache->get($cacheKey);
if ($cache) {
$ttl = strtotime($cache['expired_time']) - strtotime('now');
if ($ttl > 0) return $cache['token'];
$memcache->delete($cacheKey);
}
// Same as code 1.
$tokenResponse = $this->getToken();
$ttl = strtotime($tokenResponse['expired_time']) - strtotime('now');
if ($ttl > 0) {
$memcache->set($cacheKey, $tokenResponse, $ttl);
} else {
throw new Exception('error');
}
return $httpResponse['token'];
朋友告诉我版本2更好
但我对 $memcache->delete($cacheKeyName);
部分感到困惑。
memcache已经过期key了,为什么还要计算ttl删除key?
如果您在 memchache 中正确设置了 ttl,它不会 return 过期时间后的值。所以,没有必要删除它,因为没有什么可以删除的!我不知道您的代码的确切逻辑,但这应该有效:
$cache = $memcache->get($cacheKey);
if (!$cache) {
$tokenResponse = $this->getToken();
$ttl = strtotime($tokenResponse['expired_time']) - strtotime('now');
$memcache->set($cacheKey, $tokenResponse, $ttl);
return $tokenResponse['token'];
}
return $cache['token'];
先说明一下我遇到的情况
有一个apigetToken
关于访问第三方资源,
它将生成令牌和令牌的过期时间。
回复如下:
token
expired_time
我们希望通过设置缓存来防止429(请求太多)错误。
我们有两个版本。
版本 1
$cache = $memcache->get($cacheKey);
if ($cache) {
return $cache['token'];
}
// Same as code 2.
$tokenResponse = $this->getToken();
$ttl = strtotime($tokenResponse['expired_time']) - strtotime('now');
if ($ttl > 0) {
$memcache->set($cacheKey, $tokenResponse, $ttl);
} else {
throw new Exception('error');
}
return $httpResponse['token'];
版本 2
$cache = $memcache->get($cacheKey);
if ($cache) {
$ttl = strtotime($cache['expired_time']) - strtotime('now');
if ($ttl > 0) return $cache['token'];
$memcache->delete($cacheKey);
}
// Same as code 1.
$tokenResponse = $this->getToken();
$ttl = strtotime($tokenResponse['expired_time']) - strtotime('now');
if ($ttl > 0) {
$memcache->set($cacheKey, $tokenResponse, $ttl);
} else {
throw new Exception('error');
}
return $httpResponse['token'];
朋友告诉我版本2更好
但我对 $memcache->delete($cacheKeyName);
部分感到困惑。
memcache已经过期key了,为什么还要计算ttl删除key?
如果您在 memchache 中正确设置了 ttl,它不会 return 过期时间后的值。所以,没有必要删除它,因为没有什么可以删除的!我不知道您的代码的确切逻辑,但这应该有效:
$cache = $memcache->get($cacheKey);
if (!$cache) {
$tokenResponse = $this->getToken();
$ttl = strtotime($tokenResponse['expired_time']) - strtotime('now');
$memcache->set($cacheKey, $tokenResponse, $ttl);
return $tokenResponse['token'];
}
return $cache['token'];