Arşivler

Spring Boot Data Redis Nedir? Distributed Cache Kullanımı

Spring Data Redis Cache Kullanım Örneği
Spring Data Redis Cache Kullanım Örneği

Spring Boot Dersleri‘ne devam ediyorum.

Cache Neden İhtiyaç Duyarız?

Verilerimizi önbelleğe alarak veritabanına gidecek olan sorgulama işlemlerini en aza indirerek hem kaynak kullanımını azaltıyoruz hem de performans artışı sağlayabilmekteyiz. Değişmeyecek verilerimizde cevap hep aynı kalacağı için veritabanına gitme maaliyetini en aza indiriyoruz.

Cache Çeşitleri

In-Memory-Cache

Önceki derslerde In-Memory-Cache yöntemi ile bir örnek yapmıştım. Aşağıdaki linkten ulaşabilirsiniz.

İlgini Çekebilir: Spring Cache Nasıl Yapılır?

Distributed Cache

Distributed Cache ise cache mekanızmasını dağıtık yapıda kullanmak istediğimizde ortaya çıkan bir teknolojidir. Distributed Cache için projemize bu dağıtık yapıyı yönetebilmek için bir ara teknolojiye ihtiyaç vardır. Bunlardan en bilinenler Redis ve Hazelcast diyebilirim.

Redis Nedir?

Redis key-value nosql veritabanıdır ve genellikle caching, session yönetimi, pub/sub, message broker amacıyla kullanılmaktadır.

Docker ile Redis Kurulumu

Redis’i docker üzerinden ayağa kaldıralım. Aşağıdaki adımları yapalım. Öncelikle docker run diyerek redisi indirip bilgisayarımızda 6379 portundan çalıştırmış oluyoruz.

docker run --name my-redis -p 6379:6379 --restart always --detach redisCode language: CSS (css)

Spring Data Redis Uygulama Örneği

Öğrencilerin CRUD işlemlerini yapan basit bir Spring Boot Uygulaması yapalım.

Bağımlılıklarımız aşağıdaki gibi olacak.

  • spring-boot-starter-data-jpa
  • spring-boot-starter-data-redis
  • spring-boot-starter-web
  • h2
  • lombok

Student Entity

@Table
@Entity
@Data
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String nameSurname;
    private int schoolNumber;
    private String branch;
}Code language: PHP (php)

Student Repository Oluşturalım.

@Repository
public interface StudentRepository extends CrudRepository<Student,Integer> {
}Code language: PHP (php)

Student Service kısmını oluşturalım.

@Service
@AllArgsConstructor
public class StudentService {

    private StudentRepository studentRepository;

    public void saveStudent(Student student) {
        studentRepository.save(student);
    }

    public void updateStudent(Student student) {
        studentRepository.save(student);
    }

    public void deleteStudent(Integer id) {
        studentRepository.deleteById(id);
    }

    public Student findById(Integer id) {
        return studentRepository.findById(id).get();
    }

    public List<Student> getAllStudent() {
        List<Student> books = new ArrayList<Student>();
        studentRepository.findAll().forEach(student -> books.add(student));
        return books;
    }
}
Code language: PHP (php)

Student Controllerimizi oluşturalım. Bu controller bir rest api olacak.

@RestController
@AllArgsConstructor
public class StudentController {
    @Autowired
    private StudentService studentService;
    
    @GetMapping("/student")
    private List<Student> getAllStudent() {
        return studentService.getAllStudent();
    }

    @GetMapping("/student/{id}")
    private Student getStudent(@PathVariable("id") Integer id) {
        return studentService.findById(id);
    }

    @DeleteMapping("/student/{id}")
    private void deleteStudent(@PathVariable("id") Integer id) {
        studentService.deleteStudent(id);
    }

    @PostMapping("/student")
    private void saveStudent(@RequestBody Student student) {
        studentService.saveStudent(student);
    }

    @PostMapping("/student/update")
    private void updateStudent(@RequestBody Student student) {
        studentService.updateStudent(student);
    }
}Code language: CSS (css)

Test

Postman üstünden işlmlerimizi gerçekleştirelim. Öncelikle bir kayıt oluşturalım.

blank
Spring Boot CRUD Example

Listeyelim

blank
Spring Boot List Example

Listeleme örneğinde uygulama konsoluna baktığımızda ise listeleme işlemi için veritabanı sorgusu yapıldığını görüyoruz.

Hibernate: 
select s1_0.id,s1_0.branch,s1_0.name_surname,s1_0.school_number 
from student s1_0Code language: CSS (css)

Her sorgu işlemi yaptığımızda veritabanı sorgusu veritabanına gitmektedir.

Spring Data Redis Entegrasyonu

Bu sorgulama işlemlerini en aza indirmek için Redis sayesinde cache işlemlerini projeye ekleyeceğiz.

Projemizde Cache kullanacağımız için aktif etmemiz gerekiyor bunun için;

@SpringBootApplication
@EnableCaching
public class SpringDataRedisProjectApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringDataRedisProjectApplication.class, args);
	}
}
Code language: PHP (php)

application.yml config

Projemizin redis’e bağlanamabilmesi gerekli cache tipini, hostu ve portunu application.yaml dosyasına belirtiyoruz.

spring.cache.type=redis
spring.data.redis.host=localhost
spring.data.redis.port=6379


Spring Boot Cache Anotasyonları?

@EnableCaching

Spring Boot uygulamasında Cache özelliğini projemizde etkinleştirmek için kullanacağımız bir anotasyondur.

@Cacheable

İlgili metodun üzerine konan bu anotasyon sayesinde tanımlanmış bir cache varsa bu değeri cache’den alabilmek için kullanılır.

@Cacheable(value = "student", key = "#id")
@GetMapping("/student/{id}")
public Student getStudent(@PathVariable("id") Integer id) {
  return studentService.findById(id);
}
Code language: Java (java)

İlk sorgulamamızı yaptıktan sonra veritabanına sorgulama işlemini görürüz ve bu ilk sorgulama sayesinde redis cache alır ve sonraki sorgulamalardan sonra veritabanına uğramaz.

blank
Spring Data Redis Listemeleme

@CachePut

Cache’de bulunan bir değeri yenilemek için kullanılır. Verilerimizde bir güncelleme geldiği zaman cache’deki bu değerinde güncellenmesini sağlıyoruz. Eğer bu işlemi güncelleme metotunda yazmaksak redisimizdeki verinin güncel hali olmaz.

@CachePut(value = "student", key = "#student.id")
@PostMapping("/student/update")
public void updateStudent(@RequestBody Student student) {
  studentService.updateStudent(student);
}
Code language: Java (java)

@CacheEvict

Verimizi sildiğimizde cache’den de silinmesini sağlamak için bu anotasyonu kullanıyoruz.

@CacheEvict(value = "student", key="#id")
@DeleteMapping("/student/{id}")
public void deleteStudent(@PathVariable("id") Integer id) {
  studentService.deleteStudent(id);
}
Code language: Java (java)

Redis ile Spring Boot Data Redis pojesi ile Cache mekanizmasını bu şekilde kolaylıkla kullanabilmekteyiz ve veritabanı ihtiyacını en aza indiriyoruz.


Projenin Kaynak Kodlarına Ulaş
Önceki Ders: Spring Boot Projelerinde Tomcat Yerine Jetty Kullanmak
Spring Boot Dersleri
Sonraki Ders: Spring Boot Interceptor Nedir