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

Objeto Python na memória persistente para servidor nginx/uwsgi


O que você está sugerindo não é diretamente viável. Como novos processos podem ser ativados e desativados fora do seu controle, não há como manter os dados nativos do Python na memória.

No entanto, existem algumas maneiras de contornar isso.

Muitas vezes, um nível de armazenamento de valor-chave é tudo o que você precisa. E às vezes, ter buffers de tamanho fixo para valores (que você pode usar diretamente como str /bytes /bytearray objetos; qualquer outra coisa que você precise struct lá ou serializar) é tudo que você precisa. Nesse caso, a estrutura de cache integrada do uWSGI cuidará de tudo o que você precisa.

Se você precisar de um controle mais preciso, veja como o cache é implementado em SharedArea e fazer algo personalizado. No entanto, eu não recomendaria isso. Ele basicamente oferece o mesmo tipo de API que você obtém com um arquivo, e as únicas vantagens reais sobre apenas usar um arquivo são que o servidor gerenciará a vida útil do arquivo; funciona em todos os idiomas suportados pelo uWSGI, mesmo aqueles que não permitem arquivos; e torna mais fácil migrar seu cache personalizado para um cache distribuído (vários computadores) se você precisar posteriormente. Acho que nenhum deles é relevante para você.

Outra maneira de obter armazenamento de valor-chave simples, mas sem os buffers de tamanho fixo, é com o stdlib anydbm do Python . A pesquisa de valor-chave é tão pythonic quanto possível:parece um dict , exceto que é feito backup em um banco de dados BDB em disco (ou similar), armazenado em cache conforme apropriado na memória, em vez de ser armazenado em uma tabela de hash na memória.

Se você precisar lidar com alguns outros tipos simples, qualquer coisa que seja incrivelmente rápida para descompactar, como int s—você pode querer considerar shelve .

Se sua estrutura for rígida o suficiente, você pode usar o banco de dados de valores-chave para o nível superior, mas acessar os valores por meio de um ctypes.Structure , ou deserialize com struct . Mas geralmente, se você pode fazer isso, você também pode eliminar o nível superior, quando tudo é apenas uma grande Structure ou Array .

Nesse ponto, você pode simplesmente usar um arquivo simples para armazenamento—ou mmap it (para ctypes ), ou apenas open e read ele (para struct ).

Ou use multiprocessing 's compartilhados ctypes Objetos para acessar sua Structure diretamente de uma área de memória compartilhada.

Enquanto isso, se você não precisar de todos os dados de cache o tempo todo, apenas pedaços de vez em quando, é exatamente para isso que servem os bancos de dados. Novamente, anydbm , etc. pode ser tudo o que você precisa, mas se você tiver uma estrutura complexa, desenhe um diagrama ER, transforme-o em um conjunto de tabelas e use algo como o MySQL.