Estou desenvolvendo um projeto baseado no curso para minha faculdade, contudo um dos requisitos é que a API aceite uma grande volume de inclusões no método cadastrar (Exc: 100.000 por segundo), que seria criar um novo item no banco. Gostaria de saber como poderia realizar esta tarefa. Na aula sobre cache é citado usar Redis para melhorar a performance, mas não sei se seria esse o caso. Preciso muito de um direcionamento no que diz respeito a isso. Agradeço a atenção. Espero ter cido claro.
segue o codigo do controller:
package com.bytebank.gestaodegastos.controller;
@RestController
@RequestMapping("/transacoes")
public class TransacoesController {
@Autowired
private TransacaoRepository transacaoRepository;
@GetMapping
@Cacheable(value="listaDeTopicos")
public Page<TransacaoDto> lista(@PageableDefault(sort = "id",
direction = Direction.DESC, page = 0, size = 10) Pageable paginacao) {
Page<Transacao> transacao = transacaoRepository.findAll(paginacao);
return TransacaoDto.converter(transacao);
// if(dataDaTransacao == null) {
// List<Transacao> transacao = transacaoRepository.findAll();
// return TransacaoDto.converter(transacao);
// }else {
// List<Transacao> transacao = transacaoRepository.findAll();
// return TransacaoDto.converter(transacao);
// }
}
@PostMapping
@Transactional
@CacheEvict(value="listaDeTopicos", allEntries=true)
public ResponseEntity<TransacaoDto> cadastrar(@RequestBody @Valid TransacaoForm form,
UriComponentsBuilder uriBuilder) {
Transacao transacao = form.converter();
transacaoRepository.save(transacao);
URI uri = uriBuilder.path("/transacoes/{id}").buildAndExpand(transacao.getId()).toUri();
return ResponseEntity.created(uri).body(new TransacaoDto(transacao));
}
@GetMapping("/{id}")
public ResponseEntity<DetalhesDaTransacaoDto> detalhar(@PathVariable Long id) {
Optional<Transacao> transacao = transacaoRepository.findById(id);
if(transacao.isPresent()) {
return ResponseEntity.ok(new DetalhesDaTransacaoDto(transacao.get()));
}
return ResponseEntity.notFound().build();
}
@PutMapping("/{id}")
@Transactional
@CacheEvict(value="listaDeTopicos", allEntries=true)
public ResponseEntity<TransacaoDto> atualizar(@PathVariable Long id, @RequestBody @Valid AtualizacaoTransacaoForm form){
Optional<Transacao> optional = transacaoRepository.findById(id);
if(optional.isPresent()) {
Transacao transacao = form.atualizar(id, transacaoRepository);
return ResponseEntity.ok(new TransacaoDto(transacao));
}
return ResponseEntity.notFound().build();
}
@DeleteMapping("/{id}")
@Transactional
@CacheEvict(value="listaDeTopicos", allEntries=true)
public ResponseEntity<?> remover(@PathVariable Long id){
Optional<Transacao> optional = transacaoRepository.findById(id);
if(optional.isPresent()) {
transacaoRepository.deleteById(id);
return ResponseEntity.ok().build();
}
return ResponseEntity.notFound().build();
}
}
codigo do modelo a ser cadastrado:
package com.bytebank.gestaodegastos.modelo;
@Entity
public class Transacao {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String descricao;
private double valor;
private LocalDate dataDaTransacao = LocalDate.now();
@ManyToOne
priva