<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<version>2.5.0</version>
</dependency>
- Caching
- Spring Boot 2.7.1
- Spring Boot Validation
- Lombok
- H2 DB
- Spring Boot Logging
- Spring Boot MapStruct
- Spring Boot Caching
- Spring Boot AOP
- Spring Boot Jpa
http://localhost:8080/h2-console
- Cache , uygulamamızın performansını artırmak için kullandığımız yöntemlerdir .
- Örneğin , veri tabanına bir sorgu atıyoruz . Gelene verileri ilk olarak önbelleğe yazıyoruz . Daha sonra kullanıcıya gösteriyoruz . Eğer kullanıcı daha sonra aynı sorguyu çalıştırırsa veri tabanına gitmek yerine verileri önbellekten alıyoruz .
- Önbelek kullanmanın birinci nedeni , veri erişimini daha hızlı hale getirmek .
- Çok istenen kaynak birden çok kez istendiğinde geliştiricinin hızlı bir şekilde cevap verebilmesi için önbelleğe alması genellikle yararlıdır.
- Bellekten veri erişimi , veri tabanından veri almaya kıyasla her zaman daha hızlıdır.
- Bu özelliği aktif etmek için Main metoduna @EnableCaching anotasyonu eklenir .
@SpringBootApplication
@EnableCaching
public class SpringBootCachingApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootCachingApplication.class, args);
}
}
- @Cacheable("cacheName")
- @CacheEvict("cacheName")
- @CachePut("cacheName")
- @Caching()
- Daha önce ilgili key değerine (cacheName) değer yazılmamışsa önce belleğe yazılır . Daha sonra kullanıcıya ilgili değerleri döner. Eğer önbellekle ilgili bilgi varsa önbellekten çağrılacaktır .
@GetMapping("/list")
@Cacheable("cacheUsers")
public ResponseEntity<List<UserDTO>> findAllUsers() {
List<UserDTO> userDTOList = userMapper.userToUserDTOList(userService.getUsers());
return ResponseEntity.ok(userDTOList);
}
- Yukardaki örnekte bir kullanıcı listemizin olduğunu varsayalım . Bu listeyi ilk çektiğimizde veri tabanında listeler gelecektir . Daha sonra aynı listeyi tekrar çektiğimizde bu sefer önbellekten gelecektir . Ve daha kısa sürede gelecektir .
- Önbellekte ilgili key ile yazılmış değer varsa onu silecektir .
- Örneğin @Cacheable("users") adında bir metot çağırdık ve önbelleğe kullanıcı listesi yazdırdı . Daha sonra @CacheEvict("users") ifadesi olarak metodu çağırırsak , bellekteki kullanıcı listesini silercektir.
@DeleteMapping("/delete/{id}")
@CacheEvict(value = "cacheUsers",key = "#id")
public void deleteUser(@PathVariable("id") Long id) {
userService.deleteUser(id);
}
- Yukardaki örnekte key vererek kısıtlama yaptık verdiğimiz id deki kullanıcıları bellekten silecektir.
- Eğer bir metodun her defasında çalışmasını istiyorsak kullanırız . Bu sayede önbellekte her zaman en güncel veriler olacaktır .
- Aynı yöntemde aynı anda hem @CachePut hem de @CacheEvict ek açıklamalarına ihtiyacımız olduğunda kullanırız .
- Yani kısacası aynı türde birden fazla açıklama kullanmak istediğimizde kullanırız .
@PostMapping("/save")
@Caching(put = @CachePut(value = "cacheUsers" , key = "#result.id") , evict = @CacheEvict(value = "cacheUsers", allEntries = true))
public User createUser(@RequestBody UserDTO userDTO) {
return userService.createUser(userDTO);
}
- Yukardaki örnekte yeni bir kullanıcı ekleriz @CachePut önbelleği günceller ve eski listeyi @CacheEvict temizler .
- @Cacheable : Önbelleği kullanarak yöntem yürütülmesinin atlanmasına neden olur .
- @CachePut : Yöntem her zaman yürütülür ve sonucu her zaman önbelleğe alır