首頁  >  文章  >  資料庫  >  SpringBoot怎麼整合Redis使用@Cacheable和RedisTemplate

SpringBoot怎麼整合Redis使用@Cacheable和RedisTemplate

PHPz
PHPz轉載
2023-05-29 18:19:411396瀏覽

對之前網站做了一些很簡單的優化,為使用者清單加了一個分頁功能。

分頁就更好考慮載入速度,如果換一頁就要等幾秒,那體驗感是非常差的。

因此想到了加一個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 ="&#39;userArea&#39;")
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的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除