SpringBoot整合Redis使用@Cacheable和RedisTemplate
對之前網(wǎng)站做了一些很簡單的優(yōu)化,給用戶列表加了一個分頁功能。
分頁就更好考慮加載速度,如果換一頁就要等幾秒,那體驗感是非常差的。
因此想到了加一個redis緩存。
springboot整合redis有兩種方式:
- 一、使用注解,@EnableCaching @Cacheable . . . 等
- 二、使用RedisTemplate
兩者都能操作緩存,使用RedisTemplate 操作肯定是比使用注解靈活、方便。但是從理論上來講注解方式速度應(yīng)該更快,因為使用注解如果在緩存中有就直接從緩存中取,不用進入方法。而RedisTemplate 必須進入方法,而且執(zhí)行寫的邏輯判斷。
下面記錄一下我給分頁做緩存的思路,肯定有很多不好的地方,希望大家可以給我指出。
業(yè)務(wù)場景是后臺管理系統(tǒng),不用過于注重實時數(shù)據(jù)刷新,就設(shè)置一個小時過期。
我的思路是:
第一次加載頁面,就從數(shù)據(jù)庫把前面四頁的數(shù)據(jù)從數(shù)據(jù)庫查詢出來,這樣第一次稍微多等一下,后面換頁幾乎不用等待,這樣體驗比較好。然后每次換頁都換查看有沒有在緩存中,沒用就加入緩存。
@RequestMapping("/appUser/{currentPage}")
public R<String> getTableData1(@PathVariable int currentPage) {
//第一次請求 前面幾頁用到的概率更大 把后面三頁存入redis 減少后面分頁請求的時間 以后每次加載頁面都把那頁放入redis
// 設(shè)置一個小時過期
Page<AppUser> appUserPage = new Page<AppUser>(currentPage, 12);
if (currentPage == 1 && !redisTemplate.hasKey(1)) {
for (int i = 1; i < 5; i++) {
Page<AppUser> redisPage = new Page<AppUser>(i, 12);
redisTemplate.opsForValue().set(i, appUserServiceInterface.page(redisPage), 1, TimeUnit.HOURS);
}
} else if (!redisTemplate.hasKey(currentPage)) {
redisTemplate.opsForValue().set(currentPage, appUserServiceInterface.page(appUserPage), 1, TimeUnit.HOURS);
return R.success((Page<AppUser>) redisTemplate.opsForValue().get(currentPage));
} else if (redisTemplate.hasKey(currentPage)) {
return R.success((Page<AppUser>) redisTemplate.opsForValue().get(currentPage));
}
return R.success(appUserServiceInterface.page(appUserPage));
}
數(shù)據(jù)統(tǒng)計那塊我又試了試注解。
先要在啟動加上 @EnableCaching注解
注解使用就簡單,在方法上加上@Cacheable 就行,執(zhí)行方法前會查詢redis緩存是否有對應(yīng)的key,有就直接取值,沒有就執(zhí)行方法。
value = "appUserData" 是緩存區(qū)的名字 , key是鍵的名字 。
以下的鍵值就是 appUserData : : userArea
@RequestMapping ("/userArea")
@Cacheable(value = "appUserData",key ="'userArea'")
public R<String> area() {
? ? List<AppUser> userList = appUserServiceInterface.list();
? ? List<String> areaList = new ArrayList<>();
? ? for (AppUser appUser : userList) {
? ? ? ? areaList.add(appUser.getArea());
? ? }
? ? //放入map記錄每個月份出現(xiàn)的次數(shù)
? ? Map<String, Integer> areaTimes = new HashMap<>();
? ? for (String s : areaList) {
? ? ? ? if (!areaTimes.containsKey(s)) {
? ? ? ? ? ? areaTimes.put(s, 1);
? ? ? ? }else {
? ? ? ? ? ? areaTimes.put(s, areaTimes.get(s) + 1);
? ? ? ? }
? ? }
? ? //排序
? ? //自定義比較器
? ? Comparator<Map.Entry<String, Integer>> valCmp = new Comparator<Map.Entry<String, Integer>>() {
? ? ? ? @Override
? ? ? ? public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
? ? ? ? ? ? // TODO Auto-generated method stub
? ? ? ? ? ? return o2.getValue() - o1.getValue(); ?// 降序排序,如果想升序就反過來
? ? ? ? }
? ? };
? ? //將map轉(zhuǎn)成List,map的一組key,value對應(yīng)list一個存儲空間
? ? List<Map.Entry<String, Integer>> mapList = new ArrayList<Map.Entry<String, Integer>>(areaTimes.entrySet()); //傳入maps實體
? ? Collections.sort(mapList, valCmp);
? ? //取前8
? ? int len = mapList.size();
? ? for (int i = 0; i < len-8; i++) {
? ? ? ? mapList.remove(8);
? ? }
? ? Map<String, String> resMap = new HashMap<>();
? ? for (Map.Entry<String, Integer> m : mapList) {
? ? ? ? resMap.put(m.getKey(), m.getValue().toString());
? ? }
? ? return R.success(resMap);
}其他注解:
- @CachePut
- @Caching
- @CacheEvict
到此這篇關(guān)于SpringBoot整合Redis使用@Cacheable和RedisTemplate的文章就介紹到這了,更多相關(guān)SpringBoot整合Redis內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 在SpringBoot中注入RedisTemplate實例異常的解決方案
- SpringBoot整合RedisTemplate實現(xiàn)緩存信息監(jiān)控的步驟
- 詳解SpringBoot使用RedisTemplate操作Redis的5種數(shù)據(jù)類型
- SpringBoot整合Redis使用RedisTemplate和StringRedisTemplate
- springboot使用redisRepository和redistemplate操作redis的過程解析
- SpringBoot混合使用StringRedisTemplate和RedisTemplate的坑及解決
- SpringBoot集成RedisTemplate的實現(xiàn)示例
相關(guān)文章
SpringBoot如何配置Controller實現(xiàn)Web請求處理
這篇文章主要介紹了SpringBoot如何配置Controller實現(xiàn)Web請求處理,文中通過圖解示例介紹的很詳細,具有有一定的參考價值,需要的小伙伴可以參考一下2023-05-05
Java因項目配置不當(dāng)而引發(fā)的數(shù)據(jù)泄露
這篇文章主要介紹了Java因項目配置不當(dāng)而引發(fā)的數(shù)據(jù)泄露解決辦法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09
Java如何讀取csv文件并將數(shù)據(jù)放入對象中
這篇文章主要介紹了Java如何讀取csv文件并將數(shù)據(jù)放入對象中的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
Spring?Boot獲取resources目錄下的文件三種方式詳解
在Spring?Boot項目中,經(jīng)常需要獲取resources目錄下的文件,這些文件可以包括配置文件、模板文件、靜態(tài)資源等,這篇文章主要介紹了Spring?Boot獲取resources目錄下的文件的三種方式,需要的朋友可以參考下2023-06-06
SpringBoot利用限速器RateLimiter實現(xiàn)單機限流的示例代碼
本文主要介紹了SpringBoot利用限速器RateLimiter實現(xiàn)單機限流的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01

