Caching Data with Spring

Source code : https://bitbucket.org/zengcode/spring-caching

ตัวอย่างนี้เป็น Spring Boot ที่สร้างด้วย Maven นะครับ อันดับแรกสร้าง pom.xml ขึ้นมาก่อนเลยครับ

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>4.0.0</modelVersion>

<groupId>org.springframework</groupId>
<artifactId>spring-caching</artifactId>
<version>0.1.0</version>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
</parent>

<properties>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
</dependencies>


<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

ต่อไปเราจะสร้าง data model ที่เราจะทำการ caching กันครับ

package zengcode.medium.com.model;


public class Person {

private int id;
private String name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Person(int id, String name) {
this.id = id;
this.name = name;
}

@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}

ต่อไปสร้าง Interface สำหรับ Repository ที่ใช้การ เรียกข้อมูล Person ที่เราสร้างขึ้น

package zengcode.medium.com.service;


import zengcode.medium.com.model.Person;

public interface IPersonRepository {

public Person getById(int id);
}

ต่อไป implement PersonRepository จาก interface ข้างต้น ที่จะใช้การ เรียกข้อมูล Person ที่เราสร้างขึ้น ซึ่งปกติก็จะไปอ่านจาก database นะครับ แต่ในตัวอย่างนี้เราจะไม่ยุ่งเกี่ยวกะ database เลย เราจะสร้างกัน ดื้อ ๆ

package zengcode.medium.com.service;

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Repository;
import zengcode.medium.com.model.Person;

import java.util.UUID;

@Repository
public class PersonRepository implements IPersonRepository {

@Override
@Cacheable("persons")
public Person getById(int id) {
//simulate delay for 3 secs
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new Person(id, "Chiwa " + UUID.randomUUID().toString());
}
}

เราจะสั่งให้ spring ทำหาร caching ด้วย

@Cacheable("persons")

โดยเราจะทำการ sleep 3 sec เพื่อดู response time เมื่อตอนยังไม่มีข้อมูลใน Caching และเมื่อมีข้อมูลใน Caching แล้วนะครับ

ต่อไปสร้าง Main Class

@SpringBootApplication
@EnableCaching
public class Application {

@Autowired
public IPersonRepository personRepository;

public static void main(String[] args) throws Exception {

ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args);
Application application = ctx.getBean(Application.class);

System.out.println("Before caching......");
for(int i = 1; i <= 5; i++) {
Instant start = Instant.now();
System.out.println("===> " + application.personRepository.getById(i));
Instant end = Instant.now();
System.out.println("total execution times ========> " + ChronoUnit.MILLIS.between(start, end));
}

System.out.println("===============================");
System.out.println("After caching......");
for(int i = 1; i <= 5; i++) {
Instant start = Instant.now();
System.out.println("===> " + application.personRepository.getById(i));
Instant end = Instant.now();
System.out.println("total execution times ========> " + ChronoUnit.MILLIS.between(start, end));
}
}

}

อธิบายคร่าวๆ นะครับ for loop แรกจะยังไม่มีข้อมูลใน Caching สำหรับ for loop ที่สองจะทำงานเมื่อมีข้อมูลใน Caching แล้วนะครับ

อย่าลืม

@EnableCaching

เพื่อให้ Spring ทำการ Caching data ให้กับเรานะครับ

เมื่อรัน Application จะได้ output ประมาณนี้ครับ

Before caching……
===> Person{id=1, name=’Chiwa 75652d7b-e5d3–4fbc-a29f-f6e03ee67d43'}
total execution times ========> 3013
===> Person{id=2, name=’Chiwa cf026221-a9bf-485c-a135–9d569a30d943'}
total execution times ========> 3005
===> Person{id=3, name=’Chiwa 6eae4f9f-889f-4715–83ff-65d9f5073575'}
total execution times ========> 3006
===> Person{id=4, name=’Chiwa 76fa5ef2–3269–45ee-a235–071442873f55'}
total execution times ========> 3003
===> Person{id=5, name=’Chiwa 90f9c1b6-a700–408f-9163-d4e5fc66bf5f’}
total execution times ========> 3004
===============================
After caching……
===> Person{id=1, name=’Chiwa 75652d7b-e5d3–4fbc-a29f-f6e03ee67d43'}
total execution times ========> 1
===> Person{id=2, name=’Chiwa cf026221-a9bf-485c-a135–9d569a30d943'}
total execution times ========> 0
===> Person{id=3, name=’Chiwa 6eae4f9f-889f-4715–83ff-65d9f5073575'}
total execution times ========> 0
===> Person{id=4, name=’Chiwa 76fa5ef2–3269–45ee-a235–071442873f55'}
total execution times ========> 0
===> Person{id=5, name=’Chiwa 90f9c1b6-a700–408f-9163-d4e5fc66bf5f’}
total execution times ========> 0

จะเห็นว่า Spring ทำการ Cahing data ให้เรา ดังนั้นใน for loop รอบที่ 2 ก็จะทำงานเร็วมากๆ ครับผม

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.