Spring Boot Data Redis Nedir? Distributed Cache Kullanımı
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 redis
Code 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.

Listeyelim

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_0
Code 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.

@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.
No Comment! Be the first one.