diff --git a/build.gradle b/build.gradle index 420c2bb..31d7386 100644 --- a/build.gradle +++ b/build.gradle @@ -30,6 +30,10 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa:3.3.0' implementation group: 'com.github.jsqlparser', name: 'jsqlparser', version: '4.9' runtimeOnly 'org.postgresql:postgresql:42.7.2' + + implementation group: 'org.springframework.data', name: 'spring-data-redis', version: '3.3.0' + implementation(group: 'org.springframework.boot', name: 'spring-boot-starter-cache', version: '3.2.4') + implementation group: 'io.lettuce', name: 'lettuce-core', version: '6.3.2.RELEASE' } test { diff --git a/docker-compose.yml b/docker-compose.yml index c36b192..f0fba60 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,6 +6,7 @@ services: container_name: app depends_on: - db + - redis environment: - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/postgres - SPRING_DATASOURCE_USERNAME=postgres @@ -19,4 +20,9 @@ services: container_name: db environment: - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=123 \ No newline at end of file + - POSTGRES_PASSWORD=123 + + redis: + image: 'redis' + container_name: redis + restart: always \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 249e583..0000000 Binary files a/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index ae04661..0000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/out/artifacts/LinkShortener_jar/LinkShortener.jar b/out/artifacts/LinkShortener_jar/LinkShortener.jar deleted file mode 100644 index e77b2da..0000000 Binary files a/out/artifacts/LinkShortener_jar/LinkShortener.jar and /dev/null differ diff --git a/out/production/LinkShortener/main/java/org/example/Main.class b/out/production/LinkShortener/main/java/org/example/Main.class deleted file mode 100644 index 460ab32..0000000 Binary files a/out/production/LinkShortener/main/java/org/example/Main.class and /dev/null differ diff --git a/out/production/LinkShortener/main/java/org/example/database/Database.class b/out/production/LinkShortener/main/java/org/example/database/Database.class deleted file mode 100644 index effe396..0000000 Binary files a/out/production/LinkShortener/main/java/org/example/database/Database.class and /dev/null differ diff --git a/out/production/LinkShortener/main/java/org/example/exception/UnknownShortLinkException.class b/out/production/LinkShortener/main/java/org/example/exception/UnknownShortLinkException.class deleted file mode 100644 index d6f6951..0000000 Binary files a/out/production/LinkShortener/main/java/org/example/exception/UnknownShortLinkException.class and /dev/null differ diff --git a/out/production/LinkShortener/main/java/org/example/service/MainService.class b/out/production/LinkShortener/main/java/org/example/service/MainService.class deleted file mode 100644 index 297da95..0000000 Binary files a/out/production/LinkShortener/main/java/org/example/service/MainService.class and /dev/null differ diff --git a/out/production/LinkShortener/main/java/org/example/service/MainServiceImpl.class b/out/production/LinkShortener/main/java/org/example/service/MainServiceImpl.class deleted file mode 100644 index 973f7cd..0000000 Binary files a/out/production/LinkShortener/main/java/org/example/service/MainServiceImpl.class and /dev/null differ diff --git a/out/production/resources/META-INF/MANIFEST.MF b/out/production/resources/META-INF/MANIFEST.MF deleted file mode 100644 index dcad3eb..0000000 --- a/out/production/resources/META-INF/MANIFEST.MF +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Main-Class: org.example.LinkShortenerApplication - diff --git a/out/production/resources/application.properties b/out/production/resources/application.properties deleted file mode 100644 index 2d50a03..0000000 --- a/out/production/resources/application.properties +++ /dev/null @@ -1,7 +0,0 @@ -spring.jpa.show-sql = true - -spring.datasource.username = postgres -spring.datasource.password = 123 -spring.datasource.driverClassName = org.postgresql.Driver -spring.datasource.url = jdbc:postgresql://localhost:5432/postgres -spring.jpa.hibernate.ddl-auto=update \ No newline at end of file diff --git a/src/main/java/org/example/LinkShortenerApplication.java b/src/main/java/org/example/LinkShortenerApplication.java index 6a3628a..47c0f5b 100644 --- a/src/main/java/org/example/LinkShortenerApplication.java +++ b/src/main/java/org/example/LinkShortenerApplication.java @@ -2,7 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; +@EnableCaching @SpringBootApplication public class LinkShortenerApplication { public static void main(String... args) { diff --git a/src/main/java/org/example/controller/MainController.java b/src/main/java/org/example/controller/MainController.java index 1181f1a..efc5bae 100644 --- a/src/main/java/org/example/controller/MainController.java +++ b/src/main/java/org/example/controller/MainController.java @@ -8,6 +8,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.Random; + import static org.example.service.LinkServiceImpl.shortLinksDomain; @RestController @@ -18,17 +20,19 @@ public MainController(LinkService linkService) { this.linkService = linkService; } @PostMapping(value = "/create") - public String createShortLink(@RequestBody String longLink) - throws IncorrectLongLinkException, BadRepositoryFunctionCallException { + public String createShortLink(@RequestBody String longLink) { if(longLink == null || longLink.isBlank()) throw new IncorrectLongLinkException(); return linkService.getShortLink(longLink); } - @Autowired - private LinksRepository linksRepository; - + @PostMapping(value = "/generate") + public void generateShortLinks(@RequestBody String prefix) { + for(int i = 0; i < 1000; i++) { + linkService.getShortLink(String.format("%s%s.com", prefix, i)); + } + } @GetMapping("/{shortCode}") public String getLongLink(@PathVariable("shortCode") String shortCode) diff --git a/src/main/java/org/example/service/DBServiceImpl.java b/src/main/java/org/example/service/DBServiceImpl.java index 68249b0..9be17ff 100644 --- a/src/main/java/org/example/service/DBServiceImpl.java +++ b/src/main/java/org/example/service/DBServiceImpl.java @@ -4,10 +4,12 @@ import org.example.dao.repository.LinksRepository; import org.example.exception.BadRepositoryFunctionCallException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.*; import org.springframework.stereotype.Service; import java.util.List; + @Service public class DBServiceImpl implements DBService { @Autowired @@ -16,7 +18,9 @@ public class DBServiceImpl implements DBService { public DBServiceImpl(LinksRepository linksRepository) { this.linksRepository = linksRepository; } @Override + @Cacheable(value = "DBServiceImpl::getShortCodeFromDB", key = "#longLink") public String getShortCodeFromDB(String longLink) { + System.out.println("getShortCodeFromDB"); List shortCodes = linksRepository.findShortCodesByLongLink(longLink); if (!shortCodes.isEmpty()) { @@ -27,7 +31,9 @@ public String getShortCodeFromDB(String longLink) { } @Override + @Cacheable(value = "DBServiceImpl::getLongLinkFromDB", key = "#shortCode") public String getLongLinkFromDB(String shortCode) { + System.out.println("getLongLinkFromDB"); List longLinks = linksRepository.findLongLinksByShortCode(shortCode); if(!longLinks.isEmpty()) { @@ -38,19 +44,28 @@ public String getLongLinkFromDB(String shortCode) { } @Override + @Cacheable(value = "DBServiceImpl::containsShortCode", key = "#shortCode") public boolean containsShortCode(String shortCode) { + System.out.println("containsShortCode"); List longLinks = linksRepository.findLongLinksByShortCode(shortCode); return !longLinks.isEmpty(); } @Override + @Cacheable(value = "DBServiceImpl::containsLongLink", key = "#longLink") public boolean containsLongLink(String longLink) { + System.out.println("containsLongLink"); List shortCodes = linksRepository.findShortCodesByLongLink(longLink); return !shortCodes.isEmpty(); } @Override + @Caching(evict = { + @CacheEvict(value = "DBServiceImpl::containsLongLink", key = "#longLink"), + @CacheEvict(value = "DBServiceImpl::containsShortCode", key = "#shortCode") + }) public void addPairOfLinks(String longLink, String shortCode) { + System.out.println("addPairOfLinks"); linksRepository.save(new LinksEntity(shortCode, longLink)); } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index dee1170..fecca13 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,4 +1,10 @@ spring: + cache: + type: redis + data: + redis: + host: redis + port: 6379 jpa: hibernate: ddl-auto: update