2.1, @EnableCaching
Die Hauptfunktion dieser Annotation besteht darin, die Cache-Annotationsfunktion zu aktivieren und andere Spring Cache-Annotationen wirksam zu machen. Die Verwendung ist ebenfalls sehr einfach. Fügen Sie sie einfach direkt über der Startklasse des Projekts hinzu.
@Slf4j
@SpringBootApplication
@EnableCaching
public class CacheDemoApplication {
public static void main(String[] args) {
SpringApplication.run(CacheDemoApplication.class, args);
log.info("项目启动成功...");
}
}
Nach dem Login kopieren
2.2, @Cacheable
@Cacheable
Annotation dient hauptsächlich dazu, vor dem Ausführen der Methode zu prüfen, ob sich Daten im Cache befinden. Wenn Daten vorhanden sind, werden die zwischengespeicherten Daten direkt zurückgegeben. Wenn keine Daten vorhanden sind, wird die Methode aufgerufen und der Rückgabewert der Methode im Cache abgelegt. @Cacheable
注解主要是在方法执行前 先查看缓存中是否有数据。如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中。
注解中的参数传递主要使用的是**SpEL(Spring Expression Language)**对数据进行获取传递,这有点类似于JSP中的EL表达式,常用方式如下几种:
“#p0”:获取参数列表中的第一个参数。其中的“#p”为固定写法,0为下标,代表第一个;
“#root.args[0]”:获取方法中的第一个参数。其中0为下标,代表第一个。
“#user.id”:获取参数 user 的 id 属性。注意的是这里的 user 必须要和参数列表中的参数名一致
“#result.id”:获取返回值中的 id 属性。
来自Spring Cache源码:Spring Expression Language (SpEL) expression used for making the method
在@Cacheable
注解中有几种常用的属性可进行需求性设置:
value:缓存的名称,每个缓存名称下面可以有多个 key
key:缓存的key。
condition:条件判断,满足条件时对数据进行缓存,值得注意的是该参数在Redis中无效
The parameter "unless" can be used in Redis as a conditional statement to avoid caching data if a certain condition is met.
/**
* @description 通过id获取用户信息
* @author xBaozi
* @date 14:23 2022/7/3
**/
@Cacheable(value = "userCache", key = "#id", unless = "#result == null")
@GetMapping("/{id}")
public User getById(@PathVariable Long id) {
User user = userService.getById(id);
return user;
}
Nach dem Login kopieren
2.3、@CachePut
@CachPut
注解主要是将方法的返回值放到缓存中。这里同样是使用SpEL获取数据,常用的属性如下:
value:缓存的名称,每个缓存名称下面可以有多个 key
key:缓存的key。
condition:条件判断,满足条件时对数据进行缓存,值得注意的是该参数在Redis中无效
The parameter "unless" can be used in Redis as a conditional statement to avoid caching data if a certain condition is met.
/**
* @description 新增用户信息并返回保存的信息
* @author xBaozi
* @date 14:38 2022/7/3
**/
@CachePut(value = "userCache", key = "#user.id")
@PostMapping
public User save(User user) {
userService.save(user);
return user;
}
Nach dem Login kopieren
2.4、@CacheEvict
@CacheeEvict
主要是将一条或多条数据从缓存中删除,同样使用SpEL获取数据,常用的属性如下:
value:缓存的名称,每个缓存名称下面可以有多个 key
key:缓存的key。
condition:条件判断,满足条件时对数据进行缓存,值得注意的是该参数在Redis中无效
The parameter "unless" can be used in Redis as a conditional statement to avoid caching data if a certain condition is met.
/**
* @description 更新用户信息
* @author xBaozi
* @date 14:41 2022/7/3
**/
@CacheEvict(value = "userCache", key = "#result.id")
@PutMapping
public User update(User user) {
userService.updateById(user);
return user;
}
Nach dem Login kopieren
3、使用Redis当作缓存产品
因为 Spring 默认的缓存技术无法持久化保存缓存数据,即服务挂了缓存也挂了,因此就需要使用Redis进行操作(其实也是因为学习了Redis)
前面的SpringBoot整合Redis缓存验证码里面有记录着一些Redis的基本操作。
3.1、坐标导入
导入 maven 坐标:spring-boot-starter-data-redis、spring-boot-starter-cache
<!--Spring Data Redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--Spring Cache-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
Nach dem Login kopieren
3.2、yml配置
spring:
redis:
host: localhost
port: 6379
password: 123456
database: 0
cache:
redis:
time-to-live: 1800000 # 设置缓存有效期
3.3、开启注解功能
在启动类 com/itheima/CacheDemoApplication.java
Die Parameterübertragung in Anmerkungen verwendet hauptsächlich **SpEL (Spring Expression Language)**, um Daten zu erhalten und zu übertragen. Dies ähnelt in gewisser Weise den EL-Ausdrücken in JSP. #🎜🎜 # "#p0": Ruft den ersten Parameter in der Parameterliste ab. Das „#p“ ist eine feste Schreibmethode, 0 ist der Index, der den ersten darstellt; 1 in der Methode ein Parameter. Unter diesen ist 0 der Index, der den ersten darstellt.
"#user.id": Ruft das ID-Attribut des Parameterbenutzers ab. Beachten Sie, dass der Benutzer hier mit dem Parameternamen in der Parameterliste übereinstimmen muss
"#result.id": Holen Sie sich das ID-Attribut im Rückgabewert.
Aus Spring Cache-Quellcode: Spring Expression Language (SpEL)-Ausdruck, der zum Erstellen der Methode
in @Cacheable</ verwendet wird code >Es gibt mehrere häufig verwendete Attribute in der Annotation, die bei Bedarf festgelegt werden können: </p><ul class=" list-paddingleft-2"><li>#🎜🎜#value: Der Name des Caches, der finden Sie unter jedem Cache-Namen. Es gibt mehrere Schlüssel#🎜🎜#</li><li>#🎜🎜#key: zwischengespeicherter Schlüssel. #🎜🎜#</li><li>#🎜🎜#Bedingung: Bedingte Beurteilung, Daten zwischenspeichern, wenn die Bedingung erfüllt ist. Es ist erwähnenswert, dass dieser Parameter in Redis ungültig ist #🎜🎜#</li><li ># 🎜🎜#Der Parameter „unless“ kann in Redis als bedingte Anweisung verwendet werden, um das Zwischenspeichern von Daten zu vermeiden, wenn eine bestimmte Bedingung erfüllt ist.#🎜🎜#</li></ul><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">@Slf4j
@SpringBootApplication
@ServletComponentScan
@EnableCaching
public class ReggieApplication {
public static void main(String[] args) {
SpringApplication.run(ReggieApplication.class, args);
log.info("springBoot项目启动成功……");
}
}</pre><div class="contentsignin">Nach dem Login kopieren</div></div>#🎜🎜#2.3、@ CachePut# 🎜🎜##🎜🎜#<code>@CachPut
-Annotation legt hauptsächlich den Rückgabewert der Methode im Cache ab. SpEL wird hier auch zum Abrufen von Daten verwendet. Die häufig verwendeten Attribute sind wie folgt: #🎜🎜#
- #🎜🎜#value: Der Name des Caches Name kann mehrere Werte haben. key#🎜🎜#
- #🎜🎜#key: zwischengespeicherter Schlüssel. #🎜🎜#
- #🎜🎜#Bedingung: Bedingte Beurteilung, Daten zwischenspeichern, wenn die Bedingung erfüllt ist. Es ist erwähnenswert, dass dieser Parameter in Redis ungültig ist #🎜🎜#
- # 🎜🎜#Der Parameter „unless“ kann in Redis als bedingte Anweisung verwendet werden, um das Zwischenspeichern von Daten zu vermeiden, wenn eine bestimmte Bedingung erfüllt ist.#🎜🎜#
/**
* @description 新增套餐信息
* @author xBaozi
* @date 17:55 2022/5/13
* @param setmealDto 需要新增套餐的数据
**/
@CacheEvict(value = "setmealCache",allEntries = true)
@PostMapping
public Result<String> save(@RequestBody SetmealDto setmealDto) {
log.info("套餐信息为{}", setmealDto);
setmealService.saveWithDish(setmealDto);
return Result.success("套餐" + setmealDto.getName() + "新增成功");
}
Nach dem Login kopieren
#🎜🎜#2.4、@ CacheEvict# 🎜🎜##🎜🎜#@CacheeEvict
Löscht hauptsächlich ein oder mehrere Daten aus dem Cache. Die häufig verwendeten Attribute sind wie folgt: #🎜🎜# - #🎜🎜#Wert: Der Name des Caches. Unter jedem Cache-Namen können mehrere Schlüssel vorhanden sein #🎜🎜#
- #🎜🎜 #key: Der Cache-Schlüssel. #🎜🎜#
- #🎜🎜#Bedingung: Bedingte Beurteilung, Daten zwischenspeichern, wenn die Bedingung erfüllt ist. Es ist erwähnenswert, dass dieser Parameter in Redis ungültig ist #🎜🎜#
- # 🎜🎜#Der Parameter „unless“ kann in Redis als bedingte Anweisung verwendet werden, um das Zwischenspeichern von Daten zu vermeiden, wenn eine bestimmte Bedingung erfüllt ist.#🎜🎜#
/**
* @description 更新套餐信息并更新其关联的菜品
* @author xBaozi
* @date 11:28 2022/5/14
* @param setmealDto 需要更新的套餐信息
**/
@CacheEvict(value = "setmealCache",allEntries = true)
@PutMapping
public Result<String> updateWithDish(@RequestBody SetmealDto setmealDto) {
log.info(setmealDto.toString());
setmealService.updateWithDish(setmealDto);
return Result.success("套餐修改成功");
}
Nach dem Login kopieren
Nach dem Login kopieren
3. Verwenden Sie Redis als Caching-Produkte
#🎜🎜#Da die Standard-Caching-Technologie von Spring die Cache-Daten nicht beibehalten kann, bleibt der Cache hängen, selbst wenn der Dienst hängt, sodass Sie Redis für den Betrieb verwenden müssen (tatsächlich liegt dies auch daran, dass Sie haben Redis gelernt)#🎜🎜 ##🎜🎜#Der vorherige SpringBoot-integrierte Redis-Cache-Verifizierungscode zeichnet einige grundlegende Vorgänge von Redis auf. #🎜🎜##🎜🎜#3.1, Koordinatenimport#🎜🎜##🎜🎜#Maven-Koordinaten importieren: spring-boot-starter-data-redis, spring-boot-starter-cache#🎜🎜#rrreee#🎜🎜# 3.2. yml-Konfiguration#🎜🎜##🎜🎜#spring:
redis:
host: localhost
port: 6379
passwort: 123456
datenbank: 0
Cache:
Redis:
Lebensdauer: 1800000 #Cache-Gültigkeitszeitraum festlegen#🎜🎜#
#🎜🎜#3.3. Anmerkungsfunktion aktivieren#🎜🎜# # 🎜🎜#Fügen Sie die @EnableCaching-Annotation zur Startklasse com/itheima/CacheDemoApplication.java
hinzu, um die Cache-Annotationsfunktion zu aktivieren#🎜🎜#rrreee#🎜🎜#3.4, verwenden Sie @Cacheable#🎜🎜 ##🎜 🎜#Es sollte daran erinnert werden, dass bei Verwendung des Caches der Rückgabewert die Serializable-Serialisierungsschnittstelle implementieren muss, andernfalls wird ein Fehler ausgegeben. #🎜🎜##🎜🎜#Dies liegt daran, dass es in der NoSql-Datenbank keine Datenstruktur gibt, die unseren Java-Grundtypen entspricht. Daher müssen wir beim Speichern in der NoSql-Datenbank das Objekt serialisieren und über das Netzwerk übertragen Beachten Sie, dass die serialVersionUID der Javabean in den beiden Anwendungen konsistent sein muss, da sonst die Deserialisierung nicht normal durchgeführt werden kann. #🎜🎜#rrreee#🎜🎜#3.5, verwenden Sie @CacheEvict#🎜🎜##🎜🎜#Das neue Attribut heißt allEntries, ein boolescher Typ, der angibt, ob alle Elemente im Cache gelöscht werden müssen. Der Standardwert ist false, was bedeutet, dass er nicht benötigt wird. Wenn allEntries auf true gesetzt ist, berücksichtigt Spring Cache den angegebenen Schlüssel nicht. Manchmal ist es effizienter, alle Elemente auf einmal zu löschen und zwischenzuspeichern, als Elemente einzeln zu löschen. #🎜🎜#/**
* @description 更新套餐信息并更新其关联的菜品
* @author xBaozi
* @date 11:28 2022/5/14
* @param setmealDto 需要更新的套餐信息
**/
@CacheEvict(value = "setmealCache",allEntries = true)
@PutMapping
public Result<String> updateWithDish(@RequestBody SetmealDto setmealDto) {
log.info(setmealDto.toString());
setmealService.updateWithDish(setmealDto);
return Result.success("套餐修改成功");
}
Nach dem Login kopieren
Nach dem Login kopieren
4、测试
代码编写完成之后,重启工程,然后访问后台管理系统,对套餐数据进行新增以及删除,而后观察Redis中的数据发现写的代码是能正常跑到!成功!