最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Spring Boot中如何使用數(shù)據(jù)緩存

 更新時間:2017年04月14日 14:31:44   作者:_江南一點雨  
本篇文章主要介紹了在Spring Boot中如何使用數(shù)據(jù)緩存,具有一定的參考價值,有興趣的可以了解一下。

在實際開發(fā)中,對于要反復(fù)讀寫的數(shù)據(jù),最好的處理方式是將之在內(nèi)存中緩存一份,頻繁的數(shù)據(jù)庫訪問會造成程序效率低下,同時內(nèi)存的讀寫速度本身就要強于硬盤。Spring在這一方面給我們提供了諸多的處理手段,而Spring Boot又將這些處理方式進一步簡化,接下來我們就來看看如何在Spring Boot中解決數(shù)據(jù)緩存問題。

創(chuàng)建Project并添加數(shù)據(jù)庫驅(qū)動

Spring Boot的創(chuàng)建方式還是和我們前文提到的創(chuàng)建方式一樣,不同的是這里選擇添加的依賴不同,這里我們添加Web、Cache和JPA依賴,如下圖:

這里寫圖片描述 

創(chuàng)建成功之后,接下來添加數(shù)據(jù)庫驅(qū)動,我還是使用MySQL,在pom.xml中添加數(shù)據(jù)庫驅(qū)動,如下:

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.40</version>
 </dependency>

配置application.properties

這個application.properties的配置還是和初識在Spring Boot中使用JPA一樣,各個參數(shù)的含義我這里也不再贅述,我們直接來看代碼:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/sang?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=sang

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jackson.serialization.indent_output=true

創(chuàng)建實體類

@Entity
public class Person {
 @Id
 @GeneratedValue
 private Long id;
 private String name;
 private String address;
 private Integer age;

 public Person() {
 }

 public Long getId() {
 return id;
 }

 public void setId(Long id) {
 this.id = id;
 }

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }

 public String getAddress() {
 return address;
 }

 public void setAddress(String address) {
 this.address = address;
 }

 public Integer getAge() {
 return age;
 }

 public void setAge(Integer age) {
 this.age = age;
 }

 public Person(Long id, String name, String address, Integer age) {
 this.id = id;
 this.name = name;
 this.address = address;
 this.age = age;
 }
}

創(chuàng)建實體類的Repository

public interface PersonRepository extends JpaRepository<Person,Long> {}

創(chuàng)建業(yè)務(wù)類

業(yè)務(wù)接口

public interface DemoService {
 public Person save(Person person);

 public void remove(Long id);

 public Person findOne(Person person);
}

實現(xiàn)類

@Service
public class DemoServiceImpl implements DemoService {
 @Autowired
 PersonRepository personRepository;

 @CachePut(value = "people", key = "#person.id")
 @Override
 public Person save(Person person) {
 Person p = personRepository.save(person);
 System.out.println("為id、key為" + p.getId() + "數(shù)據(jù)做了緩存");
 return p;
 }

 @CacheEvict(value = "people")
 @Override
 public void remove(Long id) {
 System.out.println("刪除了id、key為" + id + "的數(shù)據(jù)緩存");
 personRepository.delete(id);
 }

 @Cacheable(value = "people", key = "#person.id")
 @Override
 public Person findOne(Person person) {
 Person p = personRepository.findOne(person.getId());
 System.out.println("為id、key為" + p.getId() + "數(shù)據(jù)做了緩存");
 return p;
 }
}@Service
public class DemoServiceImpl implements DemoService {
 @Autowired
 PersonRepository personRepository;

 @CachePut(value = "people", key = "#person.id")
 @Override
 public Person save(Person person) {
 Person p = personRepository.save(person);
 System.out.println("為id、key為" + p.getId() + "數(shù)據(jù)做了緩存");
 return p;
 }

 @CacheEvict(value = "people")
 @Override
 public void remove(Long id) {
 System.out.println("刪除了id、key為" + id + "的數(shù)據(jù)緩存");
 personRepository.delete(id);
 }

 @Cacheable(value = "people", key = "#person.id")
 @Override
 public Person findOne(Person person) {
 Person p = personRepository.findOne(person.getId());
 System.out.println("為id、key為" + p.getId() + "數(shù)據(jù)做了緩存");
 return p;
 }
}

關(guān)于這個實現(xiàn)類我說如下幾點:

1.@CachePut表示緩存新添加的數(shù)據(jù)或者更新的數(shù)據(jù)到緩存中,兩個參數(shù)value表示緩存的名稱為people,key表示緩存的key為person的id

2.@CacheEvict表示從緩存people中刪除key為id的數(shù)據(jù)

3.@Cacheable表示添加數(shù)據(jù)到緩存中,緩存名稱為people,緩存key為person的id屬性。

創(chuàng)建Controller

@RestController
public class CacheController {
 @Autowired
 DemoService demoService;

 @RequestMapping("/put")
 public Person put(Person person) {
 return demoService.save(person);
 }

 @RequestMapping("/able")
 public Person cacheable(Person person) {
 return demoService.findOne(person);
 }

 @RequestMapping("/evit")
 public String evit(Long id) {
 demoService.remove(id);
 return "ok";
 }
}

OK ,做完這一切我們就可以來測試我們剛剛寫的緩存了。

測試

看我們的Controller,我們有三個地址要測試,一個一個來。當然,在 測試之前,我們先來看看初始狀態(tài)下的數(shù)據(jù)庫是什么樣子的:

這里寫圖片描述

首先我們在瀏覽器中訪問http://localhost:8080/able?id=1,得到如下訪問結(jié)果:

這里寫圖片描述 

這個時候查看控制臺,輸出內(nèi)容如下:

這里寫圖片描述 

說是數(shù)據(jù)已經(jīng)被緩存了,這個時候我們再繼續(xù)在瀏覽器中刷新繼續(xù)請求id為1的數(shù)據(jù),會發(fā)現(xiàn)控制臺不會繼續(xù)打印日志出來,就是因為數(shù)據(jù)已被存于緩存之中了。

接下來我們向瀏覽器中輸入http://localhost:8080/put?age=47&name=奧巴牛&address=米國,訪問結(jié)果如下:

這里寫圖片描述 

這個時候查看控制臺打印的日志如下:

這里寫圖片描述 

再查看數(shù)據(jù)表,數(shù)據(jù)已插入成功:

這里寫圖片描述 

此時,我們在瀏覽器中輸入http://localhost:8080/able?id=106,訪問剛剛插入的這條數(shù)據(jù),結(jié)果如下:

這里寫圖片描述 

這個時候查看控制臺,發(fā)現(xiàn)并沒有數(shù)據(jù)數(shù)據(jù),就是因為數(shù)據(jù)已經(jīng)處于緩存中了。

最后我們在瀏覽器中輸入http://localhost:8080/evit?id=106,將數(shù)據(jù)從緩存中移除,訪問結(jié)果如下:

這里寫圖片描述 

這個時候查看控制臺,已經(jīng)提示緩存移除掉了:

這里寫圖片描述 

同時數(shù)據(jù)也從數(shù)據(jù)庫刪除掉了,這個時候如果還需要該數(shù)據(jù)則需要我們繼續(xù)向表中添加數(shù)據(jù)。

緩存技術(shù)切換

Spring Boot默認情況下使用ConcurrentMapCacheManager作為緩存技術(shù),有的時候你可能想替換為其他的緩存方式,在Spring Boot中進行緩存的切換非常簡單,我這里以Google提供的Guava為例,如果要使用這種緩存策略,只需要添加相應(yīng)的依賴即可,如下:

<dependency>
 <groupId>com.google.guava</groupId>
 <artifactId>guava</artifactId>
 <version>20.0</version>
</dependency>

就這樣就可以了。實際上在Spring Boot中,底層使用哪一種緩存我們并不必做過多考慮,切換的方式也很簡單,如上文引入相應(yīng)的依賴即可,我們只需要把上層的邏輯寫好即可。

本文案例下載:

本文GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test25-Cache.

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java獲取控制臺輸入的兩種方法小結(jié)

    Java獲取控制臺輸入的兩種方法小結(jié)

    這篇文章主要介紹了Java獲取控制臺輸入的兩種方法小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java?RabbitMQ的持久化和發(fā)布確認詳解

    Java?RabbitMQ的持久化和發(fā)布確認詳解

    這篇文章主要為大家詳細介紹了RabbitMQ的持久化和發(fā)布確認,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • java方法重載示例

    java方法重載示例

    方法重載是以統(tǒng)一的方式處理不同數(shù)據(jù)類型的一種手段,這篇文章主要介紹了java方法重載示例,需要的朋友可以參考下
    2014-03-03
  • 解析springBoot-actuator項目構(gòu)造中health端點工作原理

    解析springBoot-actuator項目構(gòu)造中health端點工作原理

    這篇文章主要介紹了springBoot-actuator中health端點工作原理,對spring-boot-actuator的項目構(gòu)造,工作原理進行了全面的梳理,側(cè)重health健康檢查部分
    2022-02-02
  • Spring中使用copyProperties方法進行對象之間的屬性賦值詳解

    Spring中使用copyProperties方法進行對象之間的屬性賦值詳解

    這篇文章主要介紹了Spring中使用copyProperties方法進行對象之間的屬性賦值詳解,使用org.springframework.beans.BeanUtils.copyProperties方法進行對象之間屬性的賦值,避免通過get、set方法一個一個屬性的賦值,需要的朋友可以參考下
    2023-12-12
  • jquery對輸入框內(nèi)容的數(shù)字校驗代碼實例

    jquery對輸入框內(nèi)容的數(shù)字校驗代碼實例

    這篇文章主要介紹了jquery對輸入框內(nèi)容的數(shù)字校驗代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • java 中break如何跳出外部循環(huán)

    java 中break如何跳出外部循環(huán)

    這篇文章主要介紹了java 中break如何跳出外部循環(huán),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • POI通用導(dǎo)出Excel(.xls,.xlsx)的方法

    POI通用導(dǎo)出Excel(.xls,.xlsx)的方法

    這篇文章主要介紹了POI通用導(dǎo)出Excel(.xls,.xlsx)的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Java?8中讀取文件內(nèi)容?Files.lines()方法使用示例

    Java?8中讀取文件內(nèi)容?Files.lines()方法使用示例

    這篇文章主要介紹了Java?8中讀取文件內(nèi)容Files.lines()方法如何使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • MyBatisPlus中事務(wù)處理的實現(xiàn)

    MyBatisPlus中事務(wù)處理的實現(xiàn)

    本文主要介紹了MyBatisPlus中事務(wù)處理的實現(xiàn),包括事務(wù)的開啟、提交、回滾等操作,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07

最新評論

洱源县| 正宁县| 惠州市| 顺昌县| 罗甸县| 通城县| 临澧县| 东莞市| 天全县| 广宗县| 吴忠市| 建始县| 五指山市| 连城县| 濮阳市| 临安市| 广安市| 嵊泗县| 英德市| 河源市| 西吉县| 民乐县| 湖州市| 宕昌县| 攀枝花市| 涞源县| 库车县| 建德市| 新河县| 大关县| 云南省| 沾化县| 襄樊市| 承德市| 历史| 林口县| 玉树县| 凉城县| 车致| 胶南市| 嵊泗县|