湖南城鄉(xiāng)建設(shè)網(wǎng)站全網(wǎng)絡(luò)品牌推廣
系列文章目錄
分頁查詢–Java項目實戰(zhàn)篇
全局異常處理–Java實戰(zhàn)項目篇
完善登錄功能–過濾器的使用
更多該系列文章請查看我的主頁哦
文章目錄
- 系列文章目錄
- 前言
- 一、Spring Cache介紹
- 二、Spring Cache的使用
- 1. 導(dǎo)入依賴
- 2. 配置信息
- 3. 在啟動類上添加注解
- 4. 添加注解
- 4.1 @CachePut注解
- 4.2 @CacheEvict注解
- 4.3 @Cacheable注解
- 查看Redis存入的數(shù)據(jù)
- 總結(jié)
前言
在我們學(xué)習(xí)完Redis緩存之后,明白了為什么要使用Redis。也通過學(xué)習(xí)寫代碼練習(xí)時需要使用Redis進行大量的設(shè)置值、刪除值、還有大量的邏輯判斷將數(shù)據(jù)加入或刪除Redis緩存。雖說邏輯方面也比較簡單,但太過于繁瑣。每個方法都得注入RedisTemplate,使用redisTemplate.opsForValue().set(phone,code,60L, TimeUnit.SECONDS)這樣的代碼。才能使得數(shù)據(jù)庫中的數(shù)據(jù)與Redis緩存中的數(shù)據(jù)保持一致從而避免用戶讀到的數(shù)據(jù)是臟數(shù)據(jù)(修改前的數(shù)據(jù),與數(shù)據(jù)庫的數(shù)據(jù)不一致現(xiàn)象)。
然而Spring就給我們提供了Spring Cache框架,來減少這部分的麻煩。使我們的開發(fā)可以更多的關(guān)注于業(yè)務(wù)邏輯。下面這篇文章我們就來講述這個框架的使用。
一、Spring Cache介紹
Spring Cache是一個框架,實現(xiàn)了基于注解的緩存功能,只需要簡單地加一個注解,就能實現(xiàn)緩存功能。
Spring Cache提供了一層抽象,底層可以切換不同的cache實現(xiàn)。具體就是通過CacheManager接口來統(tǒng)一不同的緩存技術(shù)。
CacheManager是Spring提供的各種緩存技術(shù)抽象接口。
針對不同的緩存技術(shù)需要實現(xiàn)不同的CacheManager:
- EhCacheCacheManager 使用EhCache作為緩存技術(shù)
- GuavaCacheManager 使用Google的GuavaCache作為緩存技術(shù)
- RedisCacheManager 使用Redis作為緩存技術(shù)
這里我們就用RedisCacheManager作為緩存技術(shù)來練習(xí)。
二、Spring Cache的使用
1. 導(dǎo)入依賴
在pom.xml文件中添加redis依賴和spring提供的cache依賴。
代碼如下:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2. 配置信息
在application.yml文件中添加redis的一些基礎(chǔ)信息,和連接Mysql數(shù)據(jù)庫一樣將基本的密碼,端口等配置上去。time-to-live: 1800000的單位為秒,表示緩存中存入的數(shù)據(jù)在多少秒后清除。
代碼如下:
spring:redis:host: localhostport: 6379#password:database: 0cache:redis:time-to-live: 1800000
3. 在啟動類上添加注解
在啟動類上添加開啟緩存注解功能的注解:@EnableCaching
代碼如下:
@EnableCaching //開啟緩存注解功能
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class,args);log.info("項目啟動成功...");}
}
4. 添加注解
4.1 @CachePut注解
@CachePut注解在執(zhí)行添加操作時,將新的數(shù)據(jù)添加到Redis緩存中,以便于數(shù)據(jù)庫查詢的值和展示的數(shù)據(jù)一致。Redis底層執(zhí)行的是set操作。
注解里的參數(shù)第一個數(shù)該緩存的名稱“value”,第二個參數(shù)是設(shè)置一個key(作為緩存數(shù)據(jù)的key)。如下述代碼就會將新增的這條數(shù)據(jù)添加到Redis緩存中。
@PostMapping@CachePut(value = "setmealCache",key = "#setmealDto.categoryId+'_'+#setmealDto.status")public R<String> save(@RequestBody SetmealDto setmealDto){setmealService.saveWithDish(setmealDto);return R.success("新增套餐成功");}
4.2 @CacheEvict注解
@CacheEvict注解執(zhí)行修改、刪除數(shù)據(jù)操作時刪除對應(yīng)的所有該名稱(value=值)下的緩存數(shù)據(jù),以便于數(shù)據(jù)庫查詢的值和展示的數(shù)據(jù)一致。Redis底層執(zhí)行的是del(刪除)操作。
下次在刪除修改完后查詢時就會重新執(zhí)行sql語句去數(shù)據(jù)庫中查詢數(shù)據(jù),這樣就使得數(shù)據(jù)庫與緩存數(shù)據(jù)一致。
@PutMapping@CacheEvict(value = "setmealCache",allEntries = true)public R<String> update(@RequestBody SetmealDto setmealDto){setmealService.updateWithDish(setmealDto);return R.success("修改成功");}
4.3 @Cacheable注解
@Cacheable注解和上面的參數(shù)也是相同的,將查詢的數(shù)據(jù)放到Redis中,所以Redis底層代碼也是做的set操作。
@GetMapping("/list")//將返回的結(jié)果存入redis緩存中@Cacheable(value = "setmealCache",key = "#setmeal.categoryId+'_'+#setmeal.status")public R<List<Setmeal>> list(Setmeal setmeal){LambdaQueryWrapper<Setmeal> queryWrapper=new LambdaQueryWrapper<>();queryWrapper.eq(setmeal.getCategoryId()!=null,Setmeal::getCategoryId,setmeal.getCategoryId());queryWrapper.eq(setmeal.getStatus()!=null,Setmeal::getStatus,setmeal.getStatus());queryWrapper.orderByDesc(Setmeal::getUpdateTime);List<Setmeal> list = setmealService.list(queryWrapper);return R.success(list);}
查看Redis存入的數(shù)據(jù)
在Redis中我們也可以看到和我們注解中的信息能夠?qū)?yīng)的上。
如下圖所示:
總結(jié)
這就是Spring Cache框架的簡單使用,可以更加快捷的將Redis緩存中的數(shù)據(jù)存入或刪除。邏輯方面也不需要我們?nèi)ゾ帉?#xff08;像以前在查詢時先看緩存中是否有該數(shù)據(jù),如果有直接返回數(shù)據(jù),沒有在進行sql語句查詢數(shù)據(jù)庫將數(shù)據(jù)返回并且存入Redis的邏輯)。學(xué)習(xí)完spring cache框架后我們只需要在方法上加注解設(shè)置value、key的值就可以了。
心態(tài)還需努力呀~