이전 웹사이트를 매우 간단하게 최적화하고 사용자 목록에 페이징 기능을 추가했습니다.
페이지를 매길 때 로딩 속도를 고려하는 것이 좋습니다. 페이지를 변경하는 데 몇 초를 기다려야 한다면 경험이 매우 좋지 않을 것입니다.
그래서 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 ="'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가 @Cacheable 및 RedisTemplate을 사용하여 Redis를 통합하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!