SpringBoot整合Redis使用@Cacheable和RedisTemplate
對之前網站做瞭一些很簡單的優化,給用戶列表加瞭一個分頁功能。
分頁就更好考慮加載速度,如果換一頁就要等幾秒,那體驗感是非常差的。
因此想到瞭加一個redis緩存。
springboot整合redis有兩種方式:
- 一、使用註解,@EnableCaching @Cacheable . . . 等
- 二、使用RedisTemplate
兩者都能操作緩存,使用RedisTemplate 操作肯定是比使用註解靈活、方便。但是從理論上來講註解方式速度應該更快,因為使用註解如果在緩存中有就直接從緩存中取,不用進入方法。而RedisTemplate 必須進入方法,而且執行寫的邏輯判斷。
下面記錄一下我給分頁做緩存的思路,肯定有很多不好的地方,希望大傢可以給我指出。
業務場景是後臺管理系統,不用過於註重實時數據刷新,就設置一個小時過期。
我的思路是:
第一次加載頁面,就從數據庫把前面四頁的數據從數據庫查詢出來,這樣第一次稍微多等一下,後面換頁幾乎不用等待,這樣體驗比較好。然後每次換頁都換查看有沒有在緩存中,沒用就加入緩存。
@RequestMapping("/appUser/{currentPage}") public R<String> getTableData1(@PathVariable int currentPage) { //第一次請求 前面幾頁用到的概率更大 把後面三頁存入redis 減少後面分頁請求的時間 以後每次加載頁面都把那頁放入redis // 設置一個小時過期 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)); }
數據統計那塊我又試瞭試註解。
先要在啟動加上 @EnableCaching註解
註解使用就簡單,在方法上加上@Cacheable 就行,執行方法前會查詢redis緩存是否有對應的key,有就直接取值,沒有就執行方法。
value = "appUserData" 是緩存區的名字 , 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記錄每個月份出現的次數 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轉成List,map的一組key,value對應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
到此這篇關於SpringBoot整合Redis使用@Cacheable和RedisTemplate的文章就介紹到這瞭,更多相關SpringBoot整合Redis內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringBoot集成Redis並實現主從架構的實踐
- springboot使用redis的詳細步驟
- SpringBoot集成Redis的思路詳解
- SpringBoot集成Redis實現驗證碼的簡單案例
- SpringBoot詳解如何整合Redis緩存驗證碼