SpringBoot整合Redis使用@Cacheable和RedisTemplate

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内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    redis密码设置|如何设置redis密码

    redis密码设置|如何设置redis密码,,如何设置redis密码初始化Redis密码: 在配置文件中有个参数: requirepass 这个就是配置redis访问密码的

    Redis集群批量操作

    Redis集群批量操作,节点,集群,Redis在3.0版正式引入了集群这个特性,扩展变得非常简单。然而当你开心的升级到3.0后,却发现有些很好用的功能

    redis sentinel模式命令集

    redis sentinel模式命令集,状态,频道, ping 订阅模式:ping 服务器回复:*2$4pong$0ping xxx 服务器回复:*2$4pong$3xxx其他模式ping 服

    C# 基于StackExchange.Redis.dll利用Redis实现分布式Session

    C# 基于StackExchange.Redis.dll利用Redis实现分布式Session,令牌,客户端,最近在研发一款O2O产品,考虑到分布式架构的需要,以前那一套.NET的

    REDIS|11 redis做分页

    REDIS|11 redis做分页,分页,每页,之前的数据都加载到了本地java的Map,分页如下@RequestMapping("/articles")String articles(Model mode

    SpringBoot自动配置的实现原理是什么

    SpringBoot自动配置的实现原理是什么,配置,组件,文件,方法,注册,获取,一、什么是springboot自动配置SpringBoot通过@EnableAutoConfiguration注

    softwaredistribution是什么文件夹

    softwaredistribution是什么文件夹,升级,存放,更新日志,文件,补丁下载,删除,softwaredistribution在Windows目录下,主要是用来存放WINDOWS UPDAT

    SpringBoot启动流程是什么

    SpringBoot启动流程是什么,应用程序,方法,组件,上下文,对象,配置,SpringBoot启动过程简介SpringBoot应用程序的启动过程可以分为以下几个步骤:加

    centos下redis无法连接

    centos下redis无法连接,防火墙,也会,主要是两方面的原因(1)redis.conf中bind的ip,默认是127.0.0.1,只能本地连接(体现为Could not connect to

    redis bitmap实现点赞的思路

    redis bitmap实现点赞的思路,照片,用户,bitmap简介:bitmap时一连串的二进制数字(0,1),每位所在的位置为偏移(offset),在bitmap上可以执行and、or