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

歡迎訪問 生活随笔!

生活随笔

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

javascript

springboot 插入返回id_实战SpringBoot缓存开发

發布時間:2025/3/15 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot 插入返回id_实战SpringBoot缓存开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方“Java專欄”,選擇“置頂或者星標”

第一時間閱讀精彩文章!

? 程序員進階必備資源免費送「21種技術方向!」 點擊查看?

作者:Yrion

cnblogs.com/wyq178/p/9840985.html

前言:緩存在開發中是一個必不可少的優化點,近期在公司的項目重構中,關于緩存優化了很多點,比如在加載一些數據比較多的場景中,會大量使用緩存機制提高接口響應速度,間接提升用戶體驗。

關于緩存,很多人對它都是既愛又恨,愛它的是:它能大幅提升響應效率,恨的是它如果處理不好,沒有用好比如LRU這種策略,沒有及時更新數據庫的數據就會導致數據產生滯后,進而產生用戶的誤讀,或者疑惑。

這是很嚴重的一個問題,比如我在公司和某家公司(國內的一線旅游開發公司)的對接的時候,線上總是出現我們推送接口數據但是網站的數據產生滯后的現象,詢問對方的技術人員,告訴我們是緩存的問題,只要刪除緩存就沒事了,我只能無奈…所以如何處理好緩存,對我們開發人員來說是一個很棘手的問題。不過關于這一切,springboot已經提供給我們很便捷的開發工具!

本篇博客就來探索springBoot的緩存注解如何使用!

本篇博客的目錄

  • springBoot開啟緩存注解

  • 常用緩存注解

  • 使用實例

  • 總結

一:springBoot開啟注解

1.1:搭建springBoot環境

在idea中,搭建一個springboot是很簡單easy的。接下來我簡單說一下步驟:

File->new->projiect->Spring Initializer->next->named->web(選中)->Finish->new Window

1.2:開始緩存

@SpringBootApplication
@EnableAutoConfiguration
@EnableCaching
public?class?SpringbootcacheApplication?{

????public?static?void?main(String[]?args)?{
????????SpringApplication.run(SpringbootcacheApplication.class,?args);
????}
}

主要是@EnableCaching用于開啟緩存注解的驅動,否則后面使用的緩存都是無效的!

二:常用緩存注解

2.1:@CacheConfig

這個注解的的主要作用就是全局配置緩存,比如配置緩存的名字(cacheNames),只需要在類上配置一次,下面的方法就默認以全局配置為主,不需要二次配置,節省了部分代碼。

2.2:@Cacheable

這個注解是最重要的,主要實現的功能再進行一個讀操作的時候。就是先從緩存中查詢,如果查找不到,就會走數據庫的執行方法,這是緩存的注解最重要的一個方法,基本上我們的所有緩存實現都要依賴于它。它具有的屬性為cacheNames:緩存名字,condtion:緩存的條件,unless:不緩存的條件??梢灾付⊿PEL表達式來實現,也可以指定緩存的key,緩存的內部實現一般都是key,value形式,類似于一個Map(實際上cacheable的緩存的底層實現就是concurrenHashMap),指定了key,那么緩存就會以key作為鍵,以方法的返回結果作為值進行映射。

2.3:@CacheEvict

這個注解主要是配合@Cacheable一起使用的,它的主要作用就是清除緩存,當方法進行一些更新、刪除操作的時候,這個時候就要刪除緩存。如果不刪除緩存,就會出現讀取不到最新緩存的情況,拿到的數據都是過期的。它可以指定緩存的key和conditon,它有一個重要的屬性叫做allEntries默認是false,也可以指定為true,主要作用就是清除所有的緩存,而不以指定的key為主。

2.4:@CachePut

這個注解它總是會把數據緩存,而不會去每次做檢查它是否存在,相比之下它的使用場景就比較少,畢竟我們希望并不是每次都把所有的數據都給查出來,我們還是希望能找到緩存的數據,直接返回,這樣能提升我們的軟件效率。

2.5:@cache

這個注解它是上面的注解的綜合體,包含上面的三個注解(cacheable、cachePut、CacheEvict),可以使用這一個注解來包含上面的所有的注解,看源碼如下

上面的注解總結如下表格:

三:使用實例

3.1:建立數據庫

我們來新建一個表,含義為文章,下面的示例將會在這張表中進行操作,所使用的框架為SSM+springboot

CREATE?TABLE?Artile?(
`id`??int(11)?NOT?NULL?AUTO_INCREMENT?,
`title`??varchar(30)?CHARACTER?SET?gbk?COLLATE?gbk_chinese_ci?NULL?DEFAULT?NULL?,
`author`??varchar(30)?CHARACTER?SET?gbk?COLLATE?gbk_chinese_ci?NULL?DEFAULT?NULL?,
`content`??mediumtext?CHARACTER?SET?gbk?COLLATE?gbk_chinese_ci?NULL?,
`file_name`??varchar(30)?CHARACTER?SET?gbk?COLLATE?gbk_chinese_ci?NULL?DEFAULT?NULL?,
`state`??smallint(2)?NULL?DEFAULT?1?COMMENT?'狀態'?,
PRIMARY?KEY?(`id`)
)
ENGINE=InnoDB
DEFAULT?CHARACTER?SET=gbk?COLLATE=gbk_chinese_ci
AUTO_INCREMENT=11
ROW_FORMAT=COMPACT
;

3.2:Mapper層

主要就是對Article進行增刪改查的業務操作,映射到具體的xml的sql里,然后用service去調用

public?interface?ArticleMapper?{


????/**
?????*?插入一篇文章
?????*?@param?title
?????*?@param?author
?????*?@param?content
?????*?@param?fileName
?????*?@return
?????*/
????public?Integer?addArticle(@Param("title")?String??title,@Param("author")String?author,
??????????????????????????????@Param("content")String?content,@Param("fileName")String?fileName);
????/**
?????*?根據id獲取文章
?????*?@param?id
?????*?@return
?????*/
????public?Article?getArticleById(@Param("id")?Integer?id);

????/**
?????*?更新content
?????*?@param?content
?????*/
????public?Integer?updateContentById(@Param("content")String?content,@Param("id")Integer?id);

????/**
?????*?根據id刪除文章
?????*?@param?id
?????*?@return
?????*/
????public?Integer?removeArticleById(@Param("id")Integer?id);

????/**
?????*?獲得上一次插入的id
?????*?@return
?????*/
????public?Integer?getLastInertId();

}

3.3:service層

主要需要注意的是我們上述講述的緩存注解都是基于service層(不能放在contoller和dao層),首先我們在類上配置一個CacheConfig,然后配置一個cacheNames,那么下面的方法都是以這個緩存名字作為默認值,他們的緩存名字都是這個,不必進行額外的配置。當進行select查詢方法的時候,我們配置上@Cacheable,并指定key,這樣除了第一次之外,我們都會把結果緩存起來,以后的結果都會把這個緩存直接返回。而當進行更新數據(刪除或者更新操作)的時候,使用@CacheEvict來清除緩存,防止調用@Cacheabel的時候沒有更新緩存

@Service
@CacheConfig(cacheNames?=?"articleCache")
public?class?ArticleService?{

????private?AtomicInteger?count?=new?AtomicInteger(0);

????@Autowired
????private?ArticleMapper?articleMapper;


????/**
?????*?增加一篇文章?每次就進行緩存
?????*?@return
?????*/
????@CachePut
????public?Integer?addArticle(Article?article){
????????Integer?result?=?articleMapper.addArticle(article.getTitle(),?article.getAuthor(),?article.getContent(),?article.getFileName());
????????if?(result>0)?{
????????????Integer?lastInertId?=?articleMapper.getLastInertId();
????????????System.out.println("--執行增加操作--id:"?+?lastInertId);
????????}
????????return?result;
????}

????/**
?????*?獲取文章??以傳入的id為鍵,當state為0的時候不進行緩存
?????*?@param?id?文章id
?????*?@return
?????*/
????@Cacheable(key?=?"#id",unless?=?"#result.state==0")
????public?Article?getArticle(Integer?id)?{
????????try?{
????????????//模擬耗時操作
????????????Thread.sleep(5000);
????????}?catch?(InterruptedException?e)?{
????????????e.printStackTrace();
????????}
????????final?Article?artcile?=?articleMapper.getArticleById(id);
????????System.out.println("--執行數據庫查詢操作"+count.incrementAndGet()+"次"+"id:"+id);
????????return?artcile;
????}

????/**
?????*?通過id更新內容?清除以id作為鍵的緩存
?????*
?????*?@param?id
?????*?@return
?????*/
????@CacheEvict(key?=?"#id")
????public?Integer?updateContentById(String?contetnt,?Integer?id)?{
????????Integer?result?=?articleMapper.updateContentById(contetnt,?id);
????????System.out.println("--執行更新操作id:--"+id);
????????return?result;
????}

????/**
?????*?通過id移除文章
?????*?@param?id??清除以id作為鍵的緩存
?????*?@return
?????*/
????@CacheEvict(key?=?"#id")
????public?Integer?removeArticleById(Integer?id){
????????final?Integer?result?=?articleMapper.removeArticleById(id);
????????System.out.println("執行刪除操作,id:"+id);
????????return?result;
????}

}

3.4:controller層

主要是接受客戶端的請求,我們配置了@RestController表示它是一個rest風格的應用程序,在收到add請求會增加一條數據,get請求會查詢一條數據,resh會更新一條數據,rem會刪除一條數據

@RestController
@ComponentScan(basePackages?=?{"com.wyq.controller",?"com.wyq.service"})
@MapperScan(basePackages?=?{"com.wyq.dao"})
public?class?ArticleController?{

????@Autowired
????private?ArticleService?articleService;

????@Autowired
????ArticleMapper?articleMapper;

????@PostMapping("/add")
????public?ResultVo?addArticle(@RequestBody?Article?article)?{

????????System.out.println(article.toString());
????????Integer?result?=?articleService.addArticle(article);

????????if?(result?>=?0)?{
????????????return?ResultVo.success(result);
????????}
????????return?ResultVo.fail();
????}


????@GetMapping("/get")
????public?ResultVo?getArticle(@RequestParam("id")?Integer?id)?{

????????Long?start?=?System.currentTimeMillis();
????????Article?article?=?articleService.getArticle(id);
????????Long?end?=?System.currentTimeMillis();
????????System.out.println("耗時:"+(end-start));

????????if?(null?!=?article)
????????????return?ResultVo.success(article);
????????return?ResultVo.fail();
????}


????/**
?????*?更新一篇文章
?????*
?????*?@param?contetnt
?????*?@param?id
?????*?@return
?????*/
????@GetMapping("/resh")
????public?ResultVo?update(@RequestParam("content")?String?contetnt,?@RequestParam("id")?Integer?id)?{
????????final?Integer?result?=?articleService.updateContentById(contetnt,?id);
????????if?(result?>?0)?{
????????????return?ResultVo.success(result);
????????}?else?{
????????????return?ResultVo.fail();
????????}
????}

????/**
?????*?刪除一篇文章
?????*
?????*?@param?id
?????*?@return
?????*/
????@GetMapping("/rem")
????public?ResultVo?remove(@RequestParam("id")?Integer?id)?{

????????final?Integer?result?=?articleService.removeArticleById(id);
????????if?(result?>?0)?{
????????????return?ResultVo.success(result);
????????}?else?{
????????????return?ResultVo.fail();
????????}
????}

}

3.5:測試

這里使用postman模擬接口請求

3.5.1:首先我們來增加一篇文章:請求add接口:

后臺返回表示成功:

我看到后臺數據庫已經插入了數據,它的id是11

3.5.2:執行查詢操作

在查詢操作中,getArticle,我使用線程睡眠的方式,模擬了5秒的時間來處理耗時性業務,第一次請求肯定會查詢數據庫,理論上第二次請求,將會走緩存,我們來測試一下:首先執行查詢操作

接口響應成功,再看一下后臺打印:表示執行了一次查詢操作,耗時5078秒

好,重點來了,我們再次請求接口看看會返回什么?理論上,將不會走數據庫執行操作,并且耗時會大大減少:與上面的比對,這次沒有打印執行數據庫查詢操作,證明沒有走數據庫,并且耗時只有5ms,成功了!緩存發揮作用,從5078秒減小到5秒!大大提升了響應速度,哈哈!

3.5.3:更新操作

當我們進行修改操作的時候,我們希望緩存的數據被清空:看接口返回值成功了,再看數據庫

后臺控制臺打印:

--執行更新操作id:--11

趁熱打鐵,我們再次請求三次查詢接口,看看會返回什么?每次都會返回這樣的結果,但是我的直觀感受就是第一次最慢,第二次、第三次返回都很快

再看看后臺打印了什么?執行id為11的數據庫查詢操作,這是因為緩存被清空了,所以它又走數據庫了(獲得最新數據),然后后面的查詢都會走緩存!很明顯,實驗成功!

3.5.4:刪除操作

同理,在刪除操作中,執行了一次刪除,那么緩存也會被清空,查詢的時候會再次走數據庫,這里就不給具體實驗效果了,如果需要的同學,可以把代碼下載下來,自己測試一下就知道了。

四:總結

本篇博客介紹了springBoot中緩存的一些使用方法,如何在開發中使用緩存?怎樣合理的使用都是值得我們學習的地方,緩存能大大提升程序的響應速度,提升用戶體驗,不過它適用的場景也是讀多寫少的業務場景,如果數據頻繁修改,緩存將會失去意義,每次還是執行的數據庫操作!

如何使用好它,還有更高效的方式,比如使用redis\memoryCache等專業組件,本篇博客只是探討的spring的注解緩存,相對來說比較簡單。


以上,便是今天的分享,希望大家喜歡,覺得內容不錯的,歡迎點擊「在看」支持,謝謝各位

喜歡文章,點個在看?

總結

以上是生活随笔為你收集整理的springboot 插入返回id_实战SpringBoot缓存开发的全部內容,希望文章能夠幫你解決所遇到的問題。

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