嘿,好吧,所以我在Symfony2框架中编写了一个API,为了增强我的API,我安装并配置了Redis捆绑包Redis。
config.yml:
# Doctrine Configuration
doctrine:
dbal:
driver: pdo_mysql
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
orm:
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
# enable metadata caching
metadata_cache_driver: redis
# enable query caching
query_cache_driver: redis
snc_redis:
# configure predis as client
clients:
default:
type: predis
alias: default
dsn: redis://localhost
doctrine:
type: predis
alias: doctrine
dsn: redis://localhost
# configure doctrine caching
doctrine:
metadata_cache:
client: doctrine
entity_manager: default
document_manager: default
result_cache:
client: doctrine
entity_manager: [default]
query_cache:
client: doctrine
entity_manager: default
在我的存储库中阅读了一些 Redis 和 Doctrine 文档后,我想出了以下代码:
<?php
namespace BooksApi'BookBundle'Repositories;
use Doctrine'ORM'EntityManager;
use Doctrine'ORM'Query'QueryException;
use Snc'RedisBundle'Doctrine'Cache'RedisCache;
use Predis'Client;
class FetchBookRepository
{
/**
* @var EntityManager
*/
public $em;
/**
* @param EntityManager $entityManager
*/
public function __construct(
EntityManager $entityManager
){
$this->em = $entityManager;
}
/**
* @param $id
* @return null|object
* @throws QueryException
*/
public function fetchBook($id)
{
$predis = new RedisCache();
$predis->setRedis(new Client);
$cacheId = 'FetchBook' . '-' . $id;
$cacheLifetime = 3600;
$book = $this->em->getRepository('BooksApiBookBundle:BooksEntity')
->createQueryBuilder('book')
->where('book.id = :id')
->setParameter('id', $id)
->getQuery()
->setResultCacheDriver($predis)
->setResultCacheLifetime($cacheLifetime)
->setResultCacheId($cacheId);
$result = $book->getSingleResult();
return $result;
}
}
现在我从数据库中获取的每个书籍实体都得到了唯一的 Key $ cacheId = 'FetchBook' . '-' . $id;
,所以如果 ie 有 1000+ 本书,每个书都会有一个键 => 值条目,但是如果允许 redis 将所有书籍值存储在一个键下$cacheId = 'FetchBook'
这有什么影响...?
你们对我的设置查询有什么看法,有没有更好的做事方法......?
Redis-Cli 输出:
1) "[b1f50028ac0187db185a0f52f654e555][1]"
2) "[FetchBook][1]"
3) "[BooksApi''BookBundle''Entity''BooksEntity$CLASSMETADATA][1
您要查找的内容称为二级缓存。这是实验性功能,还不稳定,所以如果您决定使用它,请谨慎使用它。
从文档:
二级缓存旨在减少必要的数据库访问量。它位于应用程序和数据库之间,以尽可能避免数据库命中次数。
启用后,将首先在缓存中搜索实体,如果未找到实体,将触发数据库查询,然后将实体结果存储在缓存提供程序中。
顺便说一句,你不需要为每个查询定义全新的缓存对象,只需使用
->useQueryCache(true);
->useResultCache(true);
方法。您还可以通过 redis 服务执行自己的缓存。