Spring Boot Redis Cache
Spring Boot Redis Cache
Konfigurimi i projektit Redis Boot Spring
Spring Boot Redis Cache Maven Dependencies
Megjithëse ne kemi përfunduar tashmë konfigurimin me mjetin, nëse dëshironi ta konfiguroni manualisht, ne përdorim sistemin e ndërtimit të Maven për këtë projekt dhe këtu janë varësitë që kemi përdorur:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- for JPA support -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- for embedded database support -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Sigurohuni që të përdorni versionin stabil për Spring Boot nga maven central.
Përcaktimi i Modelit
Për të ruajtur një objekt në bazën e të dhënave Redis, ne përcaktojmë një objekt modeli Person me fushat bazë:
package com.journaldev.rediscachedemo;
import javax.persistence.*;
import java.io.Serializable;
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 7156526077883281623L;
@Id
@SequenceGenerator(name = "SEQ_GEN", sequenceName = "SEQ_USER", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN")
private Long id;
private String name;
private long followers;
public User() {
}
public User(String name, long followers) {
this.name = name;
this.followers = followers;
}
//standard getters and setters
@Override
public String toString() {
return String.format("User{id=%d, name='%s', followers=%d}", id, name, followers);
}
}
Është një POJO standard me marrës dhe vendosës.
Konfigurimi i cache Redis
Me Spring Boot dhe varësinë e kërkuar tashmë në punë me Maven, ne mund të konfigurojmë shembullin lokal të Redis me vetëm tre rreshta në skedarin tonë application.properties si:
# Redis Config
spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=6379
Gjithashtu, përdorni shënimin @EnableCaching
në klasën kryesore Spring Boot:
package com.journaldev.rediscachedemo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
@EnableCaching
public class Application implements CommandLineRunner {
private final Logger LOG = LoggerFactory.getLogger(getClass());
private final UserRepository userRepository;
@Autowired
public Application(UserRepository userRepository) {
this.userRepository = userRepository;
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... strings) {
//Populating embedded database here
LOG.info("Saving users. Current user count is {}.", userRepository.count());
User shubham = new User("Shubham", 2000);
User pankaj = new User("Pankaj", 29000);
User lewis = new User("Lewis", 550);
userRepository.save(shubham);
userRepository.save(pankaj);
userRepository.save(lewis);
LOG.info("Done saving users. Data: {}.", userRepository.findAll());
}
}
Ne kemi shtuar një CommandLineRunner pasi duam të plotësojmë disa të dhëna të mostrës në bazën e të dhënave të ngulitur H2.
Përcaktimi i depove
Para se të tregojmë se si funksionon Redis, ne thjesht do të përcaktojmë një Depo për funksionalitetin e lidhur me JPA:
package com.journaldev.rediscachedemo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository { }
Ajo nuk ka asnjë thirrje metodë deri tani pasi ne nuk kemi nevojë për asnjë.
Përcaktimi i kontrolluesit
Kontrollorët janë vendi ku cache Redis thirret për veprim. Në fakt, ky është vendi më i mirë për ta bërë këtë, sepse pasi një memorie e fshehtë lidhet drejtpërdrejt me të, kërkesa nuk do të duhet as të fusë kodin e shërbimit për të pritur rezultatet e ruajtura në memorie. Këtu është skeleti i kontrolluesit:
package com.journaldev.rediscachedemo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;
@RestController
public class UserController {
private final Logger LOG = LoggerFactory.getLogger(getClass());
private final UserRepository userRepository;
@Autowired
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
...
}
Tani, për të vendosur diçka në cache, ne përdorim shënimin @Cacheable
:
@Cacheable(value = "users", key = "#userId", unless = "#result.followers < 12000")
@RequestMapping(value = "/{userId}", method = RequestMethod.GET)
public User getUser(@PathVariable String userId) {
LOG.info("Getting user with ID {}.", userId);
return userRepository.findOne(Long.valueOf(userId));
}
Në hartën e mësipërme, metoda getUser
do të vendosë një person në një cache të quajtur përdorues, do ta identifikojë atë person me çelës si userId dhe do të ruajë vetëm një përdorues me ndjekës më të mëdhenj se 12000. Kjo sigurohet që cache të jetë e mbushur me përdorues që janë shumë të njohur dhe që shpesh kërkohen. Gjithashtu, ne kemi shtuar qëllimisht një deklaratë regjistri në thirrjen API. Le të bëjmë disa thirrje API nga Postman në këtë moment. Këto janë thirrjet që kemi bërë:
localhost:8090/1
localhost:8090/1
localhost:8090/2
localhost:8090/2
Nëse vërejmë regjistrat, këto do të jenë:
... : Getting user with ID 1.
... : Getting user with ID 1.
... : Getting user with ID 2.
Vëreni diçka? Ne bëmë katër thirrje API, por vetëm tre deklarata log ishin të pranishme. Kjo për shkak se Përdoruesi me ID 2 ka 29000 ndjekës dhe kështu, të dhënat e tij u ruajtën në memorie. Kjo do të thotë që kur është bërë një thirrje API për të, të dhënat janë kthyer nga cache dhe nuk është bërë asnjë thirrje DB për këtë!
Po përditëson cache
Vlerat e cache duhet gjithashtu të përditësohen sa herë që azhurnohen vlerat e tyre aktuale të objekteve. Kjo mund të bëhet duke përdorur shënimin @CachePut:
@CachePut(value = "users", key = "#user.id")
@PutMapping("/update")
public User updatePersonByID(@RequestBody User user) {
userRepository.save(user);
return user;
}
Me këtë, një person përsëri identifikohet me ID dhe përditësohet me rezultatet.
Pastrimi i cache
Nëse disa të dhëna do të fshihen nga baza aktuale e të dhënave, nuk do të ketë më asnjë pikë për t'i mbajtur ato në cache. Ne mund të pastrojmë të dhënat e memories duke përdorur shënimin @CacheEvict
:
@CacheEvict(value = "users", allEntries=true)
@DeleteMapping("/{id}")
public void deleteUserByID(@PathVariable Long id) {
LOG.info("deleting person with id {}", id);
userRepository.delete(id);
}
Në hartëzimin e fundit, ne thjesht hoqëm hyrjet në cache dhe nuk bëmë asgjë tjetër.
Ekzekutimi i aplikacionit Spring Boot Redis Cache
Ne mund ta ekzekutojmë këtë aplikacion thjesht duke përdorur një komandë të vetme:
mvn spring-boot:run
Kufijtë e cache Redis
Megjithëse Redis është shumë i shpejtë, ai ende nuk ka kufizime në ruajtjen e çdo sasie të dhënash në një sistem 64-bit. Mund të ruajë vetëm 3 GB të dhëna në një sistem 32-bit. Më shumë memorie e disponueshme mund të rezultojë në një raport më të goditur, por kjo do të priret të pushojë sapo të zënë shumë memorie nga Redis. Kur madhësia e cache arrin kufirin e memories, të dhënat e vjetra hiqen për t'i lënë vend një të reje.
Përmbledhje
Në këtë mësim, ne shikuam se çfarë fuqie na ofron Redis Cache me ndërveprim të shpejtë të të dhënave dhe si mund ta integrojmë atë me Spring Boot me konfigurim minimal dhe megjithatë të fuqishëm. Mos ngurroni të lini komente më poshtë.
Shkarkoni Projektin Spring Boot Redis Cache