Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Qual é a maneira mais eficiente de serializar/desserializar um DataTable para/do Redis?


Infelizmente, ao trabalhar com grandes conjuntos de dados, sempre levará tempo para serializar e desserializar a estrutura. DataTable s em particular são objetos bastante complexos, pois possuem linhas e colunas que geralmente têm muitos metadados anexados a eles - mesmo quando parece ser uma tabela básica.

DataTable vs List<POCO> :


Considere se você realmente precisa serializar como um DataTable . Você poderia criar um POCO mais simples e serializar um List<YourRecord> ? Em outras palavras, se você não precisar de atributos extras em campos e colunas e puder serializar para um formato mais simples, provavelmente será mais rápido e mais eficiente em termos de espaço no cache; e, em seguida, restaurar para um DataTable se necessário.

Outra opção é dividir o DataTable em conjuntos menores, que você serializa e armazena em partes menores. Você pode achar isso mais eficiente. Você deve ser capaz de comparar isso.

Referência:


Em última análise, seu cache Redis deve ser uma melhoria em relação ao tempo necessário para consultar novamente a fonte de dados. Você usa o termo takes too much time , mas se levar 2 segundos para sair do cache versus 8 segundos para consultar a fonte de dados, isso será um aumento significativo. Mas a única maneira de ter certeza é fazer benchmark.

  • Configure seu ambiente para que você execute apenas as ferramentas necessárias. Não execute outras tarefas durante a execução dos benchmarks, para não introduzir nenhum viés.

  • Registre o tempo que leva para serializar um DataTable . Execute esta ação muitas vezes e média.
    var start = DateTime.Now;
    // Serialize
    var duration = DateTime.Now - start;
    

  • Experimente diferentes tamanhos de DataTable s e veja se você encontra um tempo aceitável.

  • Experimente uma biblioteca de serialização diferente, como JSON.NET. Embora seja bom manter tudo ServiceStack, isso pode ajudá-lo a determinar se é uma falha do ServiceStack.Text ou apenas um problema com o grande conjunto de dados.

  • Repita o processo para desserialização.

Memória:


Se você estiver trabalhando com grandes conjuntos de dados, seu aplicativo e o cache têm memória suficiente? A memória em seu aplicativo pode ser um gargalo; Você deve observar o monitor de atividade do seu sistema enquanto executa as operações e garantir que não esteja ficando sem memória e que seu sistema execute a paginação. Se você achar que isso está acontecendo, considere aumentar a RAM ou divida o DataTable em conjuntos de dados menores, conforme mencionado anteriormente.

Latência:


Se você estiver se conectando a um servidor Redis em uma rede e não na mesma máquina, você verificou a latência da rede? Você pode querer fazer ping entre o servidor de aplicativos e o servidor de cache e garantir que realmente tenha um ping baixo. Especialmente se você achar que o armazenamento em cache de objetos simples é lento.

Redis?


Se você está descobrindo que não há como melhorar o tempo de cache e restauração, talvez o uso do Redis não seja uma boa opção. Talvez usando um static DataTable dentro da memória do aplicativo seria mais adequado. Em outras palavras, mantendo o cache na memória do aplicativo e não há serialização e desserialização para se preocupar. É claro que você pode precisar ter cuidado para garantir que tenha memória suficiente disponível para seu aplicativo para fazer isso. No entanto, ficaria surpreso se você tivesse que escolher essa opção .

Resumo:


Sem ver seu conjunto de dados ou conhecimento do serviço que você está construindo, em última análise, é apenas um conselho genérico sobre a melhor forma de restringir a causa do seu problema. O conselho principal é não usar um DataTable se uma estrutura mais simples servirá, e compare cada uma das operações para determinar quaisquer gargalos.

Eu espero que isso ajude.