如何使用Symfony和RedisAdapter在缓存中存储和读取值?

时间:2017-03-06 16:53:48

标签: php caching redis symfony

我第一次加载页面时试图在缓存上存储一些值。这是我正在使用的代码:

$cached_items = [
    'main_nav'   => $main_nav,
    'sub_nav'    => $sub_nav,
    'footer_nav' => $footer_nav,
    'view_as'    => $view_as,
];

$redisConnection = new Client('tcp://redis:6379');
$cache           = new RedisAdapter($redisConnection);
$menu            = $cache->getItem('mmi_menus');

if ($menu->isHit()) {
    return $menu->get();
} else {
    $menu->set($cached_items);
    $cache->save($menu);
}

这个缓存是从一个非Symfony控制器完成的 - 让我们说它是一个独立的文件。

上面代码的第一个问题,

  • else条件一直在伸出,我认为不应该存储值。 (查看here

第二个问题,在Symfony控制器中具有此功能:

public function GenerateMenuItemsAction()
{
    $redisConnection = new Client('tcp://redis:6379');
    $cache           = new RedisAdapter($redisConnection);
    $menu            = $cache->getItem('mmi_menus');

    if ($menu->isHit()) {
        return $this->render(
            'CommonBundle:Layout:menu.html.twig',
            ['menu' => $menu->get()]
        );
    }
}

$menu->isHit()为空,所以我一直从Symfony获得此异常:

  

在渲染模板期间抛出异常(“The   controller必须返回一个响应(给定null)。你忘了添加吗?   在控制器的某处返回声明?“)。

更新

我没有使用任何TTL afaik可能以某种方式设置了默认值,但这就是config.yml上该部分的样子:

framework:
    cache:
        app: cache.adapter.redis
        default_redis_provider: "redis://%redis_host%"
        pools:
            cache.pool1:
                public: true

我在这里缺少什么?有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我的config.yml看起来像那样:

framework:
  cache:
    system: cache.adapter.apcu
    default_redis_provider: redis://%redis_password%@%redis_host%:%redis_port%
    pools:
        redis_pool:
            adapter: cache.adapter.redis
            public: true
            default_lifetime: 0
            provider: cache.default_redis_provider

所以我可以很容易地(在我的控制器中)做类似的事情:

$this->get('redis_pool')->getItem('myitem');

或者您可以将'redis_pool'作为参数注入服务。

我不需要任何“新的”或额外的连接信息/配置 - 任何事情都在config.yml中完成,并在整个应用程序中作为服务提供。