My code
use Phalcon\Mvc\View\Simple as SimpleView;
use Phalcon\Cache\Frontend\Json as CacheFrontend;
use Phalcon\Cache\Backend\Redis as CacheBackend;
$di->setShared('view', function () use ($config) {
    $view = new SimpleView();
    $view->setViewsDir($config->application->viewsDir);
    return $view;
});
$di->set('viewCache', function () use ($config) {
    $frontCache = new CacheFrontend(["lifetime" => 86400]);
    $cache = new CacheBackend(
        $frontCache,
        $config->redis->toArray()
    );
    return $cache;
});
$vars = ['foo' => 'bar'];
$this->view->cache([
"lifetime" => 86400,
"key"      => "prefix:key"
]);
echo $this->view->render("materials/templates/xyz.phtml", $vars);
Redis monitor
1448949074.138914 [0 127.0.0.1:39714] "SELECT" "0"
1448949074.139034 [0 127.0.0.1:39714] "GET" "_PHCRprefix:key"
1448949074.141211 [0 127.0.0.1:39714] "SET" "_PHCRprefix:key" "null"
1448949074.141335 [0 127.0.0.1:39714] "EXPIRE" "_PHCRprefix:key" "86400"
1448949074.141455 [0 127.0.0.1:39714] "SADD" "_PHCR" "prefix:key"The content set into redis is always "null", why?
I tried to find reason in Phalcon source code.
phalcon/mvc/view/simple.zep
    public function render(string! path, params = null)
    {
        ...
        if typeof cache == "object" {
            if cache->isStarted() === true {
                if cache->isFresh() === true {
                    cache->save();
                } else {
                    cache->stop();
                }
            } else {
                cache->stop();
            }
        }
        ...
    }phalcon/cache/backend/redis.zep
public function save(keyName = null, content = null, lifetime = null, boolean stopBuffer = true)
{
...
        if !content {
            let cachedContent = frontend->getContent();
        } else {
            let cachedContent = content;
        }
        /**
         * Prepare the content in the frontend
         */
        if !is_numeric(cachedContent) {
            let preparedContent = frontend->beforeStore(cachedContent);
        }
...
        if is_numeric(cachedContent) {
            let success = redis->set(lastKey, cachedContent);
        } else {
            let success = redis->set(lastKey, preparedContent);
        }
phalcon/cache/frontend/json.zep
class Json implements FrontendInterface
{
...
    public function getContent()
    {
        return null;
    }
...
}Em......
Always return null... why?