Ygor Postado Setembro 10, 2018 Denunciar Compartilhar Postado Setembro 10, 2018 (editado) Olá, Eu desenvolvi um sistema de cash (entre outros) que enviam os dados para o MySQL armazenar, até aí tudo certo. Mas quero fazer o "cacheamento" de uma maneira bem eficiente, então gostaria de saber como fazer isto. Pensei em trazer todos os dados do MySQL e armazenar em uma HashMap toda vez que o servidor iniciar, aí quando for modificar algum dado, modifico diretamente no MySQL e na HashMap para não haver risco de perder dados. Mas não sei se é muito eficiente. Aguardo sua resposta; grato desde já. Editado Setembro 10, 2018 por Ygor Link para o comentário Compartilhar em outros sites More sharing options...
zenKurpfy Postado Setembro 10, 2018 Denunciar Compartilhar Postado Setembro 10, 2018 recomendo você colocar na hashmap e fazer um scheduler salvando no mysql de tempo em tempo... caso crashar não vai perder tantos dados ? 1 Link para o comentário Compartilhar em outros sites More sharing options...
LuizB Postado Setembro 10, 2018 Denunciar Compartilhar Postado Setembro 10, 2018 2 minutos atrás, Kurpfyyyyy disse: recomendo você colocar na hashmap e fazer um scheduler salvando no mysql de tempo em tempo... caso crashar não vai perder tantos dados ? Não pode ocorrer perca de dados. 1 Link para o comentário Compartilhar em outros sites More sharing options...
Ygor Postado Setembro 10, 2018 Autor Denunciar Compartilhar Postado Setembro 10, 2018 (editado) 4 minutos atrás, Kurpfyyyyy disse: recomendo você colocar na hashmap e fazer um scheduler salvando no mysql de tempo em tempo... caso crashar não vai perder tantos dados ? Interessante, no caso eu não modificaria no MySQL, mas sim na HashMap, certo? Aí o Scheduler ficaria responsável por colocar os dados da HashMap no MySQL, é isto? Outra coisa, se eu usar HashMap apenas para consultar e inserir os dados diretamente no MySQL - modificando a HashMap também - seria menos eficiente? Editado Setembro 10, 2018 por Ygor Link para o comentário Compartilhar em outros sites More sharing options...
zenKurpfy Postado Setembro 10, 2018 Denunciar Compartilhar Postado Setembro 10, 2018 1 minuto atrás, Cuthmf disse: Não pode ocorrer perca de dados. como assim? ele não quer que perda nenhum dado? mas ai no que adianta fazer o cache? ocupar espaço? ... 1 Link para o comentário Compartilhar em outros sites More sharing options...
LuizB Postado Setembro 10, 2018 Denunciar Compartilhar Postado Setembro 10, 2018 1 minuto atrás, Kurpfyyyyy disse: como assim? ele não quer que perda nenhum dado? mas ai no que adianta fazer o cache? ocupar espaço? ... Se por exemplo ele colocar pra salvar a cada 5 minutos e algum jogador ativar o cash e o servidor desligar? 1 Link para o comentário Compartilhar em outros sites More sharing options...
zenKurpfy Postado Setembro 10, 2018 Denunciar Compartilhar Postado Setembro 10, 2018 3 minutos atrás, Ygor disse: Interessante, no caso eu não modificaria no MySQL, mas sim na HashMap, certo? Aí o Scheduler ficaria responsável por colocar os dados da HashMap no MySQL, é isto? Outra coisa, se eu usar HashMap apenas para consultar e inserir os dados diretamente no MySQL - modificando a HashMap também - seria menos eficiente? 1) Sim, exatamente 2) Não entendi, você pegaria os dados na hashmap e pra modificar no MySQL? Mas ai ia ter que ficar dando load toda hora? Sim, seria menos Eficiente! 1 Link para o comentário Compartilhar em outros sites More sharing options...
Ygor Postado Setembro 10, 2018 Autor Denunciar Compartilhar Postado Setembro 10, 2018 1 minuto atrás, Kurpfyyyyy disse: 1) Sim, exatamente 2) Não entendi, você pegaria os dados na hashmap e pra modificar no MySQL? Mas ai ia ter que ficar dando load toda hora? Sim, seria menos Eficiente! Quando um jogador ativasse cash, modificaria o MySQL e a HashMap. No caso, a HashMap ficaria apenas para consulta Link para o comentário Compartilhar em outros sites More sharing options...
zenKurpfy Postado Setembro 10, 2018 Denunciar Compartilhar Postado Setembro 10, 2018 1 minuto atrás, Ygor disse: Quando um jogador ativasse cash, modificaria o MySQL e a HashMap. No caso, a HashMap ficaria apenas para consulta mas ai nem compensa fazer a HashMap, faz uma scheduler de 15 em 15min. , é melhor 1 Link para o comentário Compartilhar em outros sites More sharing options...
bieel1503 Postado Setembro 10, 2018 Denunciar Compartilhar Postado Setembro 10, 2018 Faz uma "HashMap" para o "cache". Ah, e também, você tem um objeto para guardar as informações de cada jogador? Se tiver, você pode apenas adicionar uma variável para checar se já foi salvo e se precisa salvar, não? E não tem problema salvar as informações async se for tipo na hora de "/setcash". E você pode apenas pegar as informações de cada jogador no evento "AsyncLoginEvent". Ah, e não se esqueça de remover do "Map" quando o jogador sair do servidor. 1 Link para o comentário Compartilhar em outros sites More sharing options...
TequilAxBr Postado Setembro 11, 2018 Denunciar Compartilhar Postado Setembro 11, 2018 Carregar tudo do MySQL na HashMap quando o servidor iniciar uma hora vai usar uma memória absurda... pra que fazer isso? Carrega os dados dos jogadores quando eles entrarem no servidor e quando saírem você remove da HashMap. Bom, eu geralmente faço isso. 2 Link para o comentário Compartilhar em outros sites More sharing options...
RUSHyoutuber Postado Setembro 11, 2018 Denunciar Compartilhar Postado Setembro 11, 2018 29 minutos atrás, TequilAxBr disse: Carregar tudo do MySQL na HashMap quando o servidor iniciar uma hora vai usar uma memória absurda... pra que fazer isso? Carrega os dados dos jogadores quando eles entrarem no servidor e quando saírem você remove da HashMap. Bom, eu geralmente faço isso. ******** eu ia comentar isso agora seu **** Igual o Tequila falou... Uma hora você vai ter 60 mil pessoas no seu banco de dados, já pensou colocar tudo isso na hashmap? O interessante seria colocar na HashMap apenas os jogadores que logarem no servidor, porque o sevidor vai pegar no máximo 350 players online e esse número é bem menor que 60 mil. Você poderia fazer aquele sistema pra manter a conexão aberta também ai seria mais rapido pra ir até o mysql, quando voce quer verificar o cash de um jogador então primeiro vc verificar se ele ta na lista caso contrario vc iria até o banco buscar, ai quando ouver transferencia de cash vc atualizar a hash e o mysql já que você quer garantir que não haja perda de dados. 2 Link para o comentário Compartilhar em outros sites More sharing options...
Manolo8 Postado Setembro 11, 2018 Denunciar Compartilhar Postado Setembro 11, 2018 pesquisa sobre WeakReference, SoftReference que você vai ter a capacidade de criar um sistema bem foda ? 1 Link para o comentário Compartilhar em outros sites More sharing options...
zenKurpfy Postado Setembro 12, 2018 Denunciar Compartilhar Postado Setembro 12, 2018 e se o servidor cair (crashar) com os players online? 1 Link para o comentário Compartilhar em outros sites More sharing options...
leonardosc Postado Setembro 12, 2018 Denunciar Compartilhar Postado Setembro 12, 2018 Quer um cache bem simples? Para leitura: Pega o dado do jogador do banco de dados quando ele entrar no servidor e salva na memoria. Geralmente, é usado uma HashMap, tendo como chave o identificador do jogador (idealmente é o UUID) e como valor o dado que você deseja 'cachear', pois ela tem um tempo de leitura/escrita, na maioria das vezes, constante (fora que é o que você geralmente precisa em um cache: uma estrutura de dados que mapeie um determinado valor a uma chave.) Para escrita: Você pode simplesmente atualizar o dado no cache (de leitura) e depois executar uma query assincronamente (ou seja, fora da thread principal do servidor) para atualizar o dado no banco de dados. 1 Link para o comentário Compartilhar em outros sites More sharing options...
Ygor Postado Setembro 12, 2018 Autor Denunciar Compartilhar Postado Setembro 12, 2018 22 horas atrás, RUSHyoutuber disse: ******** eu ia comentar isso agora seu **** Igual o Tequila falou... Uma hora você vai ter 60 mil pessoas no seu banco de dados, já pensou colocar tudo isso na hashmap? O interessante seria colocar na HashMap apenas os jogadores que logarem no servidor, porque o sevidor vai pegar no máximo 350 players online e esse número é bem menor que 60 mil. Você poderia fazer aquele sistema pra manter a conexão aberta também ai seria mais rapido pra ir até o mysql, quando voce quer verificar o cash de um jogador então primeiro vc verificar se ele ta na lista caso contrario vc iria até o banco buscar, ai quando ouver transferencia de cash vc atualizar a hash e o mysql já que você quer garantir que não haja perda de dados. E com relação a salvar as alterações feitas nos valores do cash? Fazer um task ou salvar diretamente? Desculpem, mas esta questão ainda não ficou clara. Link para o comentário Compartilhar em outros sites More sharing options...
RUSHyoutuber Postado Setembro 12, 2018 Denunciar Compartilhar Postado Setembro 12, 2018 15 minutos atrás, Ygor disse: E com relação a salvar as alterações feitas nos valores do cash? Fazer um task ou salvar diretamente? Desculpem, mas esta questão ainda não ficou clara. Eu acho que tudo depende do caso... Eu tenho um sistema de Warps e de Kits que é cacheado, toda vez que uma Warp ou um Kit é setada ou modificado as informações são alteradas tanto na HASH quanto no FILE, geralmente os KITS e WARPS são criados ou alterados em quanto você esta criando o servidor ou montando ele em fim, então esse recurso de editar ou criar kits e warps é pouco usado então não ha necessidade de criar uma Task pra isso na minha opinião pois vai chegar um momento onde o servidor já esta com os kits e warps prontos então a Task ficaria rodando atoa... Como você esta trabalhando com um PL de cash eu acho que a Task seria mais adequada... é claro que você corre o risco do servidor crashar e as alterações nesse meio tempo serem perdidas, mas eu acho que nesse caso a Task compensa muito mais. 1 Link para o comentário Compartilhar em outros sites More sharing options...
TequilAxBr Postado Setembro 12, 2018 Denunciar Compartilhar Postado Setembro 12, 2018 1 hora atrás, Ygor disse: E com relação a salvar as alterações feitas nos valores do cash? Fazer um task ou salvar diretamente? Desculpem, mas esta questão ainda não ficou clara. Eu botaria em uma outra HashMap, ou até na mesma e criaria uma task para de tempo em tempo percorrer a HashMap e adiciona-la ao banco de dados. 1 Link para o comentário Compartilhar em outros sites More sharing options...
Manolo8 Postado Setembro 14, 2018 Denunciar Compartilhar Postado Setembro 14, 2018 Um exemplo do que eu uso: https://gist.github.com/Manolo8/76b105b649a0c79175ed123fde50d31a Uso um MAP para mapear o ID, uso SoftReference para manter na memória quando está sendo utilizado, e faço um LOOP pelas entities para checar se há modificações (cade e entity tem um boolean avisando se foi modificado) Se foi modificado, adiciono em uma Queue, para ir salvando aos poucos, tudo safe-thread para acessar pela thread principal (do mine) e para ser salvo Um exemplo usando agora NamedCache https://gist.github.com/Manolo8/b690c41f15c450f244183a4abb435f87 Uso TABCOMPLETE com as entidades, por tanto, uso um TreeMap para salvar os nomes (e posteriormente, pegar com muita eficiência os nomes para TABCOMPLETE) -> Não tanto, pelo fato de se, não houver no mínimo 20 nomes, uma query é feita no banco de dados... Um sistema de Grupos em funcionamento: https://gist.github.com/Manolo8/7bb46c14bd65ba647bd222bd89528955 Basicamente, você não precisa se preocupar com o banco de dados... https://gist.github.com/Manolo8/7bb46c14bd65ba647bd222bd89528955#file-group_groupservice-java-L53 -> Como os comandos são mapeados... 1 Link para o comentário Compartilhar em outros sites More sharing options...
Reset Postado Dezembro 18, 2018 Denunciar Compartilhar Postado Dezembro 18, 2018 Seu tópico foi marcado como Inativo. Para reverter está ação, entre em contato com a equipe de Moderação. Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados