ZF2 Redis:如何设置密钥的到期时间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZF2 Redis:如何设置密钥的到期时间相关的知识,希望对你有一定的参考价值。

我必须在服务器上设置一个Redis来存储来自Zend Framework 2的信息。现在,我可以存储信息,但我不能给他们一个到期时间,因为他们会在一段时间后自然更新。

我没有找到关于这一步的一些文件,在我看来相当模糊。

我的代码:

page:config / autoload / cache.global.php

return array(
    'caches' => array(
        'redis' => array (
            'adapter' => array (
                'name' => 'redis',
                'lifetime' => 60, //doesn't work
                'options' => array (
                    'server' => array (
                        'host' => 'x.x.x.x',
                        'port' => x
                    ),
                    'ttl' => 10, // seems to have no effect
                    'namespace' => 'mycache',
                ),
            ),
        )
    )
);

在控制器中:

..
use ZendCacheStorageFactory;
..
        $redis = StorageFactory::factory ($this->getServiceLocator ()
             ->get ('config')['caches']['redis']);

        if ($redis->hasItem ('test')) {
                var_dump($redis->getItem ('test'));
                $redis->removeItem('test');
        } else {
            $redis->addItem('test', 'testtest');
        }
..

我尝试了几种方法,但每次都是相同的,Redis中没有出现过期信息:

127.0.0.1:6379> get mycache:test
"testtest"
127.0.0.1:6379> ttl mycache:test
(integer) -1

谢谢你的帮助!

答案

看看我的redis工厂:

 <?php
 namespace ApplicationServiceFactory;

 use ZendServiceManagerFactoryInterface;
 use ZendServiceManagerServiceLocatorInterface;
 use ZendCacheStorageAdapterRedisOptions;
 use ZendCacheStorageAdapterRedis;

 class RedisCacheFactory implements FactoryInterface
 {
     public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $config = $serviceLocator->get('Config');
        $config = $config['redis'];

        $options = new RedisOptions();
        $options->setServer(
            [
                'host' => $config["host"],
                'port' => $config["port"],
                'timeout' => $config["timeout"]
            ]
        );
        $options->setTtl(60);

        /**
         * This is not required, although it will allow to store anything that can be serialized by PHP in Redis
         */
        $options->setLibOptions(
            [
                Redis::OPT_SERIALIZER => Redis::SERIALIZER_PHP
            ]
         );

        $redis = new Redis($options);

        return $redis;
    }
}

从示例中可以看出,TTL设置为60秒,并且按预期工作。

另一答案

Predis Client为setEx提供了一个“魔术调用”方法命令执行程序:

$redis->setEx($key, $expireTTL, $value);
  • 如果自定义到期时间的传递值不存在,则设置密钥。
  • 这将更新现有密钥,重置到期时间。

如上所述仔细检查,看看一切是否按预期工作:

127.0.0.1:6379>dump your_key 127.0.0.1:6379>ttl your_key

希望能帮助到你 :) !

另一答案

你也可以试试这个:

$redis = $this->getServiceLocator()->get('CacheRedisFactory');
$redis->getOptions()->setTtl(10);
$redis->setItem('test', 'Custom Value');

所以没有必要在工厂全局设置它。这项工作对我来说:)

另一答案
return array(
    'caches' => array(
        'redis' => array (
            'adapter' => array (
                'name' => 'redis',
                'options' => array (
                    'server' => array (
                        'host' => 'x.x.x.x',
                        'port' => x
                    ),
                    'Ttl' => 10, // Starting with capital letter
                    'namespace' => 'mycache',
                ),
            ),
        )
    )
);

以上是关于ZF2 Redis:如何设置密钥的到期时间的主要内容,如果未能解决你的问题,请参考以下文章

redis 能不能给列表或者合集里边的元素设置到期时间

Redis的键过期策略

电脑的产品密钥到期怎么办

ZF2 - 如何正确设置标题?

Redis - 如何每天使密钥过期

spring redis运行脚本:如何传递到期时间值