>  기사  >  데이터 베이스  >  SpringBoot가 @Cacheable 및 RedisTemplate을 사용하여 Redis를 통합하는 방법

SpringBoot가 @Cacheable 및 RedisTemplate을 사용하여 Redis를 통합하는 방법

PHPz
PHPz앞으로
2023-05-29 18:19:411390검색

이전 웹사이트를 매우 간단하게 최적화하고 사용자 목록에 페이징 기능을 추가했습니다.

페이지를 매길 때 로딩 속도를 고려하는 것이 좋습니다. 페이지를 변경하는 데 몇 초를 기다려야 한다면 경험이 매우 좋지 않을 것입니다.

그래서 Redis Cache를 추가하려고 생각했습니다.

redis를 springboot와 통합하는 방법에는 두 가지가 있습니다.

  • 먼저 주석, @EnableCaching @Cacheable 등을 사용합니다.

  • 두 번째, RedisTemplate을 사용하여

, 주석을 사용하는 것보다 더 효율적입니다. 유연하고 편리합니다. 주석을 사용하는 것은 메소드를 입력할 필요 없이 캐시에서 직접 데이터를 가져오기 때문에 이론적으로 더 빠릅니다. RedisTemplate은 메소드 내에서 수행되어야 하며 작성 로직의 판단을 수행해야 합니다.

다음은 페이지 매김 캐싱에 대한 내 아이디어에 대한 기록입니다. 많은 단점이 있을 것입니다.

비즈니스 시나리오는 백엔드 관리 시스템입니다. 실시간 데이터 새로 고침에 너무 많은 관심을 기울일 필요는 없습니다. 만료 시간을 한 시간만 설정하면 됩니다.

내 생각은:

페이지를 처음 로드할 때 데이터베이스에서 처음 4페이지의 데이터를 쿼리하는 것입니다. 이렇게 하면 처음에는 조금 더 기다려야 하고 그럴 필요가 거의 없습니다. 후속 페이지 변경을 기다리십시오. 이렇게 하면 경험이 더 좋아집니다. 그런 다음 페이지를 변경할 때마다 캐시에 있는지 확인하고 유용하지 않으면 캐시에 추가하세요.

@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 주석을 추가하세요.

주석은 사용하기 쉽습니다. 메서드를 실행하기 전에 Redis 캐시에 해당 키가 있는지 확인하면 됩니다. 값을 직접 가져옵니다. 그렇지 않은 경우 메서드를 실행합니다.

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가 @Cacheable 및 RedisTemplate을 사용하여 Redis를 통합하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제