php - symfony2中使用redis缓存重复请求

标签 php symfony caching redis

这是我当前的设置:

snc_redis:
    clients:
        default:
            type: predis
            alias: cache
            dsn: "redis://127.0.0.1"
    doctrine:
            metadata_cache:
                client: cache
                entity_manager: default
                document_manager: default
            result_cache:
                client: cache
                entity_manager: [bo, aff, fs]
            query_cache:
                client: cache
                entity_manager: default

我有一个 API,它可以获取多个重复请求(通常是快速连续的),我可以使用此设置来发回重复请求的缓存响应吗?还可以设置缓存过期吗?

最佳答案

根据您提供的配置示例,我猜测您想要缓存 Doctrine 结果而不是完整的 HTTP 响应(尽管后者是可能的,请参见下文)。

如果是这样,最简单的方法是,每当您创建 Doctrine 查询时,将其设置为使用 result cache您在上面已设置为使用 redis。

$qb = $em->createQueryBuilder();
// do query things
$query = $qb->getQuery();
$query->useResultCache(true, 3600, 'my_cache_id');

这将使用您的缓存 ID 将该查询的结果缓存一小时。清理缓存有点麻烦:

$cache = $em->getConfiguration()->getResultCacheImpl();
$cache->delete('my_cache_id');

如果您想缓存完整响应 - 即您在应用程序内进行一些需要很长时间的处理 - 那么有多种方法可以做到这一点。可以将其序列化并弹出到 redis 中:

$myResults = $service->getLongRunningResults();
$serialized = serialize($myResults);
$redisClient = $container->get('snc_redis.default');
$redisClient->setex('my_id', $serialized, 3600);

或者研究专用的 HTTP 缓存解决方案,例如 varnish或查看Symfony documentation on HTTP caching .

编辑: SncRedisBundle 提供了它自己版本的 Doctrine CacheProvider。因此,虽然在你的答案中你创建了自己的类,但你也可以这样做:

my_cache_service:
    class: Snc\RedixBundle\Doctrine\Cache\RedisCache
    calls:
        - [ setRedis, [ @snc_redis.default ] ]

这几乎完全符合你的类(class)正在做的事情。因此,您可以使用 $app_cache->fetch('id'),而不是 $app_cache->get('id')。这样您就可以切换缓存的后端,而无需更改应用程序类,只需更改服务描述即可。

关于php - symfony2中使用redis缓存重复请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32176436/

相关文章:

javascript - Symfony FOSJsRoutingBundle 如何设置/检测主机?

php - Symfony 多对多表单

node.js - 在 memcached 持久连接或每个请求中

PHP/SQL : searching against html entities stored in database

php - 无法将值插入数据库表

php - 使用 socket.io 和 redis 进行实时通知

javascript - 清除 JavaScript 中的缓存

java - 如何为 Java 应用程序创建一个简单的分布式 map ?

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

php - 从服务器上的数据库加载列表中的图像