日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

spring boot缓存_Spring Boot和缓存抽象

發布時間:2023/12/3 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring boot缓存_Spring Boot和缓存抽象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

spring boot緩存

緩存是大多數應用程序的主要組成部分,只要我們設法避免磁盤訪問,緩存就會保持強勁。 Spring對各種配置的緩存提供了強大的支持 。 您可以根據需要簡單地開始,然后進行更多可定制的操作。

這將是spring提供的最簡單的緩存形式的示例。
Spring默認帶有一個內存緩存,它很容易設置。

讓我們從gradle文件開始。

group 'com.gkatzioura' version '1.0-SNAPSHOT'buildscript {repositories {mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.2.RELEASE")} }apply plugin: 'java' apply plugin: 'idea' apply plugin: 'org.springframework.boot'repositories {mavenCentral() }sourceCompatibility = 1.8 targetCompatibility = 1.8dependencies {compile("org.springframework.boot:spring-boot-starter-web")compile("org.springframework.boot:spring-boot-starter-cache")compile("org.springframework.boot:spring-boot-starter")testCompile("junit:junit") }bootRun {systemProperty "spring.profiles.active", "simple-cache" }

由于同一項目將用于不同的緩存提供程序,因此會有多個spring配置文件。 本教程的Spring配置文件將是簡單緩存,因為我們將使用基于ConcurrentMap的緩存,該緩存恰好是默認緩存。

我們將實現一個應用程序,該應用程序將從本地文件系統中獲取用戶信息。 該信息應位于users.json文件中

[{"userName":"user1","firstName":"User1","lastName":"First"},{"userName":"user2","firstName":"User2","lastName":"Second"},{"userName":"user3","firstName":"User3","lastName":"Third"},{"userName":"user4","firstName":"User4","lastName":"Fourth"} ]

我們還將為要檢索的數據指定一個簡單的模型。

package com.gkatzioura.caching.model;/*** Created by gkatzioura on 1/5/17.*/ public class UserPayload {private String userName;private String firstName;private String lastName;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;} }

然后,我們將添加一個將讀取信息的bean。

package com.gkatzioura.caching.config;import com.fasterxml.jackson.databind.ObjectMapper; import com.gkatzioura.caching.model.UserPayload; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.core.io.Resource;import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.Collections; import java.util.List;/*** Created by gkatzioura on 1/5/17.*/ @Configuration @Profile("simple-cache") public class SimpleDataConfig {@Autowiredprivate ObjectMapper objectMapper;@Value("classpath:/users.json")private Resource usersJsonResource;@Beanpublic List<UserPayload> payloadUsers() throws IOException {try(InputStream inputStream = usersJsonResource.getInputStream()) {UserPayload[] payloadUsers = objectMapper.readValue(inputStream,UserPayload[].class);return Collections.unmodifiableList(Arrays.asList(payloadUsers));}} }

顯然,為了訪問信息,我們將使用實例化的Bean包含所有用戶信息。

下一步將是創建一個存儲庫接口,以指定將要使用的方法。

package com.gkatzioura.caching.repository;import com.gkatzioura.caching.model.UserPayload;import java.util.List;/*** Created by gkatzioura on 1/6/17.*/ public interface UserRepository {List<UserPayload> fetchAllUsers();UserPayload firstUser();UserPayload userByFirstNameAndLastName(String firstName,String lastName);}

現在,讓我們深入研究將包含所需緩存注釋的實現。

package com.gkatzioura.caching.repository;import com.gkatzioura.caching.model.UserPayload; 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.Cacheable; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository;import java.util.List; import java.util.Optional;/*** Created by gkatzioura on 12/30/16.*/ @Repository @Profile("simple-cache") public class UserRepositoryLocal implements UserRepository {@Autowiredprivate List<UserPayload> payloadUsers;private static final Logger LOGGER = LoggerFactory.getLogger(UserRepositoryLocal.class);@Override@Cacheable("alluserscache")public List<UserPayload> fetchAllUsers() {LOGGER.info("Fetching all users");return payloadUsers;}@Override@Cacheable(cacheNames = "usercache",key = "#root.methodName")public UserPayload firstUser() {LOGGER.info("fetching firstUser");return payloadUsers.get(0);}@Override@Cacheable(cacheNames = "usercache",key = "{#firstName,#lastName}")public UserPayload userByFirstNameAndLastName(String firstName,String lastName) {LOGGER.info("fetching user by firstname and lastname");Optional<UserPayload> user = payloadUsers.stream().filter(p-> p.getFirstName().equals(firstName)&&p.getLastName().equals(lastName)).findFirst();if(user.isPresent()) {return user.get();} else {return null;}}}

包含@Cacheable的方法將觸發緩存填充,而包含@CacheEvict的方法將觸發緩存逐出。 通過使用@Cacheable而不是僅指定將存儲我們的值的緩存映射,我們還可以基于方法名稱或方法參數來指定鍵。

因此,我們實現了方法緩存。 例如,方法firstUser使用方法名稱作為鍵,而方法userByFirstNameAndLastName使用方法參數以創建鍵。

帶有@CacheEvict批注的兩種方法將清空指定的緩存。

LocalCacheEvict將是處理驅逐的組件。

package com.gkatzioura.caching.repository;import org.springframework.cache.annotation.CacheEvict; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component;/*** Created by gkatzioura on 1/7/17.*/ @Component @Profile("simple-cache") public class LocalCacheEvict {@CacheEvict(cacheNames = "alluserscache",allEntries = true)public void evictAllUsersCache() {}@CacheEvict(cacheNames = "usercache",allEntries = true)public void evictUserCache() {}}

由于我們使用非常簡單的緩存形式,因此不支持驅逐ttl。 因此,我們將僅針對此特定情況添加一個調度程序,該調度程序將在一定時間段后退出緩存。

package com.gkatzioura.caching.scheduler;import com.gkatzioura.caching.repository.LocalCacheEvict; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Profile; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;/*** Created by gkatzioura on 1/7/17.*/ @Component @Profile("simple-cache") public class EvictScheduler {@Autowiredprivate LocalCacheEvict localCacheEvict;private static final Logger LOGGER = LoggerFactory.getLogger(EvictScheduler.class);@Scheduled(fixedDelay=10000)public void clearCaches() {LOGGER.info("Invalidating caches");localCacheEvict.evictUserCache();localCacheEvict.evictAllUsersCache();}}

最后,我們將使用控制器來調用指定的方法

package com.gkatzioura.caching.controller;import com.gkatzioura.caching.model.UserPayload; import com.gkatzioura.caching.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** Created by gkatzioura on 12/30/16.*/ @RestController public class UsersController {@Autowiredprivate UserRepository userRepository;@RequestMapping(path = "/users/all",method = RequestMethod.GET)public List<UserPayload> fetchUsers() {return userRepository.fetchAllUsers();}@RequestMapping(path = "/users/first",method = RequestMethod.GET)public UserPayload fetchFirst() {return userRepository.firstUser();}@RequestMapping(path = "/users/",method = RequestMethod.GET)public UserPayload findByFirstNameLastName(String firstName,String lastName ) {return userRepository.userByFirstNameAndLastName(firstName,lastName);}}

最后但并非最不重要的一點是,我們的Application類應包含兩個額外的注釋。 為了啟用調度程序,需要@EnableScheduling;為了啟用緩存,需要@EnableCaching

package com.gkatzioura.caching;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.scheduling.annotation.EnableScheduling;/*** Created by gkatzioura on 12/30/16.*/ @SpringBootApplication @EnableScheduling @EnableCaching public class Application {public static void main(String[] args) {SpringApplication.run(Application.class,args);}}

您可以在github上找到源代碼。

翻譯自: https://www.javacodegeeks.com/2017/01/spring-boot-cache-abstraction.html

spring boot緩存

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的spring boot缓存_Spring Boot和缓存抽象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美中文字幕一区 | 舔花蒂 | 亚洲成人久久久久 | 精品少妇av | 欧美三级网站在线观看 | 男生捅女生肌肌 | 四虎色 | 欧美a∨| 天堂资源网 | 妓院一钑片免看黄大片 | 午夜视频1000 | 精品国产午夜 | 粗了大了 整进去好爽视频 日本女优中文字幕 | 污视频免费网站 | 久久av在线播放 | 日韩av自拍| 亚洲最大av | 国产欧美精品久久久 | 丁香在线| 毛片专区 | 免费在线观看a级片 | 男男受被啪到高潮自述 | 国产又粗又黄又爽又硬的视频 | 久插网 | 国产美女精品人人做人人爽 | 东京久久久 | 国精产品一区一区三区免费视频 | 国产一区二区三区免费观看视频 | 色视频网址 | 亚洲精品88 | 久久国 | 美女免费网站 | 国产在线自 | 国产真实老熟女无套内射 | 性xxxx欧美老肥妇牲乱 | 国产999精品久久久久久 | 久久国内免费视频 | 亚洲成av人片在www色猫咪 | 人妻激情偷乱频一区二区三区 | 久久久午夜 | 日本特黄色片 | 亚洲ⅴ国产v天堂a无码二区 | 久久黄色小视频 | 一个人在线观看免费视频www | 国产探花一区二区三区 | 精品人妻无码一区 | 亚洲系列在线 | 久久精品99北条麻妃 | 欧美狂猛xxxxx乱大交3 | 激情第一页 | 91aaaa| 成人一级影视 | 超碰人人射 | 欧美xxxx少妇 | 成人av一区二区在线观看 | 丰满人妻一区二区三区免费视频 | 国产情侣久久久久aⅴ免费 caoporn成人 | 扒开女人屁股进去 | 欧美123区 | 中文字幕婷婷 | av网站观看 | 99国产精品白浆在线观看免费 | 亚洲人掀裙打屁股网站 | 国产中文在线 | 成人精品国产 | wwwxx欧美 | 国产欧美一区二区三区在线 | 人妻丰满熟妇av无码区不卡 | 午夜精品一区二区三 | 天天视频亚洲 | 成人在线免费观看视频 | 黄av网 | 欧美日本在线看 | 黄色激情毛片 | 秋霞一区二区 | 色乱码一区二区三在线看 | 99精品黄色 | 夜夜骚网站 | 日本在线观看一区二区 | 国内自拍2020 | 国产欧美一区二区三区在线看蜜臀 | 可以免费看毛片的网站 | 不卡的av在线免费观看 | 黄色片91| 欧洲av在线| 国产精品久久久久久久久毛片 | 国产精品无码一区二区三区免费 | 欧美在线观看成人 | 成人区一区二区 | ass日本| 免费一级片网站 | 亚洲影院中文字幕 | xxx国产 | 亚洲视频免费在线观看 | 丝袜毛片 | 国产乱淫av片免费看 | 国模吧一区二区三区 | 91尤物视频在线观看 | 一个人看的www日本高清视频 |