Redis 将值存储在一个键或多个键下


Redis store values under one key or multiple keys

嘿,好吧,所以我在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 服务执行自己的缓存。