SpringBoot怎么整合Redis使用Cacheable和RedisTemplate
来源:亿速云
时间:2023-05-09 13:40:51 185浏览 收藏
目前golang学习网上已经有很多关于数据库的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《SpringBoot怎么整合Redis使用Cacheable和RedisTemplate》,也希望能帮助到大家,如果阅读完后真的对你学习数据库有帮助,欢迎动动手指,评论留言并分享~
对之前网站做了一些很简单的优化,给用户列表加了一个分页功能。
分页就更好考虑加载速度,如果换一页就要等几秒,那体验感是非常差的。
因此想到了加一个redis缓存。
springboot整合redis有两种方式:
一、使用注解,@EnableCaching @Cacheable . . . 等
二、使用RedisTemplate
两者都能操作缓存,使用RedisTemplate 操作肯定是比使用注解灵活、方便。但是从理论上来讲注解方式速度应该更快,因为使用注解如果在缓存中有就直接从缓存中取,不用进入方法。而RedisTemplate 必须进入方法,而且执行写的逻辑判断。
下面记录一下我给分页做缓存的思路,肯定有很多不好的地方,希望大家可以给我指出。
业务场景是后台管理系统,不用过于注重实时数据刷新,就设置一个小时过期。
我的思路是:
第一次加载页面,就从数据库把前面四页的数据从数据库查询出来,这样第一次稍微多等一下,后面换页几乎不用等待,这样体验比较好。然后每次换页都换查看有没有在缓存中,没用就加入缓存。
@RequestMapping("/appUser/{currentPage}") public RgetTableData1(@PathVariable int currentPage) { //第一次请求 前面几页用到的概率更大 把后面三页存入redis 减少后面分页请求的时间 以后每次加载页面都把那页放入redis // 设置一个小时过期 Page appUserPage = new Page (currentPage, 12); if (currentPage == 1 && !redisTemplate.hasKey(1)) { for (int i = 1; i redisPage = new Page (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 ) redisTemplate.opsForValue().get(currentPage)); } else if (redisTemplate.hasKey(currentPage)) { return R.success((Page ) 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 Rarea() { List userList = appUserServiceInterface.list(); List areaList = new ArrayList(); for (AppUser appUser : userList) { areaList.add(appUser.getArea()); } //放入map记录每个月份出现的次数 Map areaTimes = new HashMap(); for (String s : areaList) { if (!areaTimes.containsKey(s)) { areaTimes.put(s, 1); }else { areaTimes.put(s, areaTimes.get(s) + 1); } } //排序 //自定义比较器 Comparator > valCmp = new Comparator >() { @Override public int compare(Map.Entry o1, Map.Entry o2) { // TODO Auto-generated method stub return o2.getValue() - o1.getValue(); // 降序排序,如果想升序就反过来 } }; //将map转成List,map的一组key,value对应list一个存储空间 List > mapList = new ArrayList >(areaTimes.entrySet()); //传入maps实体 Collections.sort(mapList, valCmp); //取前8 int len = mapList.size(); for (int i = 0; i resMap = new HashMap(); for (Map.Entry m : mapList) { resMap.put(m.getKey(), m.getValue().toString()); } return R.success(resMap); }
其他注解:
@CachePut
@Caching
@CacheEvict
理论要掌握,实操不能落!以上关于《SpringBoot怎么整合Redis使用Cacheable和RedisTemplate》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
342 收藏
-
361 收藏
-
159 收藏
-
164 收藏
-
221 收藏
-
156 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习