宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見問題
產(chǎn)品動態(tài)
精選推薦

Spring Boot 2.x基礎教程:進程內緩存的使用與Cache注解詳解

管理 管理 編輯 刪除

快速入門

下面我們將使用使用Spring Data JPA訪問MySQLopen in new window一文的案例為基礎。這個案例中包含了使用Spring Data JPA訪問User數(shù)據(jù)的操作,利用這個基礎,我們?yōu)槠涮砑泳彺?,來減少對數(shù)據(jù)庫的IO,以達到訪問加速的作用。如果您還不熟悉如何實現(xiàn)對MySQL的讀寫操作,那么建議先閱讀前文,完成這個基礎案例的編寫。

先簡單回顧下這個案例的基礎內容:

User實體的定義


@Entity
@Data
@NoArgsConstructor
public class User {

    @Id
    @GeneratedValue
    private Long id;

    private String name;
    private Integer age;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

User實體的數(shù)據(jù)訪問實現(xiàn)

public interface UserRepository extends JpaRepository<User, Long> {

    User findByName(String name);

    User findByNameAndAge(String name, Integer age);

    @Query("from User u where u.name=:name")
    User findUser(@Param("name") String name);

}

為了更好的理解緩存,我們先對該工程做一些簡單的改造。

  • application.properties文件中新增spring.jpa.show-sql=true,開啟hibernate對sql語句的打印。如果是1.x版本,使用spring.jpa.properties.hibernate.show_sql=true參數(shù)。
  • 修改單元測試類,插入User表一條用戶名為AAA,年齡為10的數(shù)據(jù)。并通過findByName函數(shù)完成兩次查詢,具體代碼如下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter51ApplicationTests {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void test() throws Exception {
        // 創(chuàng)建1條記錄
        userRepository.save(new User("AAA", 10));

        User u1 = userRepository.findByName("AAA");
        System.out.println("第一次查詢:" + u1.getAge());

        User u2 = userRepository.findByName("AAA");
        System.out.println("第二次查詢:" + u2.getAge());
    }

}

在沒有加入緩存之前,我們可以先執(zhí)行一下這個案例,可以看到如下的日志:

Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=?
第一次查詢:10
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=?
第二次查詢:10

兩次findByName查詢都執(zhí)行了兩次SQL,都是對MySQL數(shù)據(jù)庫的查詢。

#引入緩存

第一步:在pom.xml中引入cache依賴,添加如下內容:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

第二步:在Spring Boot主類中增加@EnableCaching注解開啟緩存功能,如下:

@EnableCaching
@SpringBootApplication
public class Chapter51Application {

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

}

第三步:在數(shù)據(jù)訪問接口中,增加緩存配置注解,如:

@CacheConfig(cacheNames = "users")
public interface UserRepository extends JpaRepository<User, Long> {

    @Cacheable
    User findByName(String name);

}

第四步:再來執(zhí)行以下單元測試,可以在控制臺中輸出了下面的內容

Hibernate: insert into user (age, name, id) values (?, ?, ?)
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=?
第一次查詢:10
第二次查詢:10

到這里,我們可以看到,在調用第二次findByName函數(shù)時,沒有再執(zhí)行select語句,也就直接減少了一次數(shù)據(jù)庫的讀取操作。

為了可以更好的觀察,緩存的存儲,我們可以在單元測試中注入CacheManager

@Autowired
private CacheManager cacheManager;

使用debug模式運行單元測試,觀察CacheManager中的緩存集users以及其中的User對象的緩存加深理解。

可以看到,在第一次調用findByName函數(shù)之后,CacheManager將這個查詢結果保存了下來,所以在第二次訪問的時候,就能匹配上而不需要再訪問數(shù)據(jù)庫了。

#Cache配置注解詳解

回過頭來我們再來看這里使用到的兩個注解分別作了什么事情:

  • @CacheConfig:主要用于配置該類中會用到的一些共用的緩存配置。在這里@CacheConfig(cacheNames = "users"):配置了該數(shù)據(jù)訪問對象中返回的內容將存儲于名為users的緩存對象中,我們也可以不使用該注解,直接通過@Cacheable自己配置緩存集的名字來定義。
  • @Cacheable:配置了findByName函數(shù)的返回值將被加入緩存。同時在查詢時,會先從緩存中獲取,若不存在才再發(fā)起對數(shù)據(jù)庫的訪問。該注解主要有下面幾個參數(shù):

除了這里用到的兩個注解之外,還有下面幾個核心注解:

  • @CachePut:配置于函數(shù)上,能夠根據(jù)參數(shù)定義條件來進行緩存,它與@Cacheable不同的是,它每次都會真是調用函數(shù),所以主要用于數(shù)據(jù)新增和修改操作上。它的參數(shù)與@Cacheable類似,具體功能可參考上面對@Cacheable參數(shù)的解析
  • @CacheEvict:配置于函數(shù)上,通常用在刪除方法上,用來從緩存中移除相應數(shù)據(jù)。除了同@Cacheable一樣的參數(shù)之外,它還有下面兩個參數(shù):

歡迎關注本系列教程:《Spring Boot 2.x基礎教程》

#代碼示例

本文的相關例子可以查看下面?zhèn)}庫中的chapter5-1目錄:


請登錄后查看

CRMEB 最后編輯于2025-02-26 09:43:02

快捷回復
回復
回復
回復({{post_count}}) {{!is_user ? '我的回復' :'全部回復'}}
排序 默認正序 回復倒序 點贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無簡介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復' : '回復'}}
刪除
回復
回復

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復 {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復' : '回復'}}
刪除
回復
回復
查看更多
打賞
已打賞¥{{reward_price}}
793
{{like_count}}
{{collect_count}}
添加回復 ({{post_count}})

相關推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見問題 產(chǎn)品動態(tài) 精選推薦 首頁頭條 首頁動態(tài) 首頁推薦
取 消 確 定
回復
回復
問題:
問題自動獲取的帖子內容,不準確時需要手動修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請輸入 0.1-{{reward_max_price}} 范圍內的數(shù)值
打賞成功
¥{{price}}
完成 確認打賞

微信登錄/注冊

切換手機號登錄

{{ bind_phone ? '綁定手機' : '手機登錄'}}

{{codeText}}
切換微信登錄/注冊
暫不綁定
CRMEB客服

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

CRMEB開源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服