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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot整合Redis正确的实现分布式锁的示例代码

    前言 最近在做分块上传的业务,使用到了Redis来维护上传过程中的分块编号. 每上传完成一个分块就获取一下文件的分块集合,加入新上传的编号,手动接口测试下是没有问题的,前端通过并发上传调用就出现问题了,并发的get再set,就会存在覆盖写现象,导致最后的分块数据不对,不能触发分块合并请求. 遇到并发二话不说先上锁,针对执行代码块加了一个JVM锁之后问题就解决了. 仔细一想还是不太对,项目是分布式部署的,做了负载均衡,一个节点的代码被锁住了,请求轮询到其他节点还是可以进行覆盖写,并没有解决到问题啊

  • SpringBoot2整合Redis缓存三步骤代码详解

    遵循SpringBoot三板斧 第一步加依赖 <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- redis依赖commons-pool 这个依赖一定要添加 --> <

  • springboot与redis的简单整合实例

    前言 Redis是一个缓存.消息代理和功能丰富的键值存储.StringBoot提供了基本的自动配置.本文记录一下springboot与redis的简单整合实例 官方文档:https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/ 前期准备 首先我们要有一个Redis服务,由于我没有Linux环境,为了方便搭建项目,直接在Windows下安装,参考这篇博客:Windows下安装Redis服务 安装步骤:一直

  • SpringBoot 整合Redis 数据库的方法

    Redis简介 Redis(官网: https://redis.io )是一个基于内存的日志型可持久化的缓存数据库,保存形式为key-value格式,Redis完全免费开源,它使用ANSI C语言编写.与其他的key - value缓存产品一样,Redis具有以下三个特点. • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用: • Redis不仅支持简单的key-value类型数据,同时还提供字符串.链表.集合.有序集合和哈希等数据结构的存储: • R

  • Redis整合SpringBoot的RedisTemplate实现类(实例详解)

    Redis整合SpringBoot>>RedisService 接口 package com.tuan.common.base.redis; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; public interface RedisService { //Redis 字符串(String) /** * 模糊值再删除 * @param

  • SpringBoot2整合Redis多数据源步骤详解

    redis是一个基于内存的高性能key-value数据库,具有极高的读写速度.本文介绍 SpringBoot 和 Redis 的整合,以及如何在项目中具体应用 配置文件属性 spring: redis: database: 1 host: 192.168.50.144 port: 6379 password: timeout: 600 #Springboot2.0 不能设置为0 lettuce: pool: max-active: 50 max-wait: -1 max-idle: 8 min-

  • springboot整合redis进行数据操作(推荐)

    redis是一种常见的nosql,日常开发中,我们使用它的频率比较高,因为它的多种数据接口,很多场景中我们都可以用到,并且redis对分布式这块做的非常好. springboot整合redis比较简单,并且使用redistemplate可以让我们更加方便的对数据进行操作. 1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starte

  • springboot整合redis集群过程解析

    简介 在springboot使用搭建好的redis集群 添加redis和连接池依赖 <!--redis连接池 start--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <!--redis连接池 end--> <!--redis start-

  • SpringSecurity整合springBoot、redis实现登录互踢功能

    背景 基于我的文章--<SpringSecurity整合springBoot.redis token动态url权限校验>.要实现的功能是要实现一个用户不可以同时在两台设备上登录,有两种思路: (1)后来的登录自动踢掉前面的登录. (2)如果用户已经登录,则不允许后来者登录. 需要特别说明的是,项目的基础是已经是redis维护的session. 配置redisHttpSession 设置spring session由redis 管理. 2.1去掉yml中的http session 配置,yml和

  • SpringBoot整合Redis使用@Cacheable和RedisTemplate

    对之前网站做了一些很简单的优化,给用户列表加了一个分页功能. 分页就更好考虑加载速度,如果换一页就要等几秒,那体验感是非常差的. 因此想到了加一个redis缓存. springboot整合redis有两种方式: 一.使用注解,@EnableCaching @Cacheable . . . 等 二.使用RedisTemplate 两者都能操作缓存,使用RedisTemplate 操作肯定是比使用注解灵活.方便.但是从理论上来讲注解方式速度应该更快,因为使用注解如果在缓存中有就直接从缓存中取,不用进

  • SpringBoot整合Redis及Redis工具类撰写实例

    目录 一.Maven依赖 二.application.properties中加入redis相关配置 三.写一个redis配置类 四.写一个Redis工具类 五.小结 SpringBoot整合Redis的博客很多,但是很多都不是我想要的结果.因为我只需要整合完成后,可以操作Redis就可以了,并不需要配合缓存相关的注解使用(如@Cacheable).看了很多博客后,我成功的整合了,并写了个Redis操作工具类.特意在此记录一下,方便后续查阅. 一.Maven依赖 (1)本文所采用的SpringBo

  • SpringBoot整合Redis、ApachSolr和SpringSession的示例

    本文介绍了SpringBoot整合Redis.ApachSolr和SpringSession,分享给大家,具体如下: 一.简介 SpringBoot自从问世以来,以其方便的配置受到了广大开发者的青睐.它提供了各种starter简化很多繁琐的配置.SpringBoot整合Druid.Mybatis已经司空见惯,在这里就不详细介绍了.今天我们要介绍的是使用SpringBoot整合Redis.ApacheSolr和SpringSession. 二.SpringBoot整合Redis Redis是大家比

  • SpringBoot整合Redis的示例

    redis是最常用的缓存数据库,常用于存储用户登录token.临时数据.定时相关数据等. redis是单线程的,所以redis的操作是原子性的,这样可以保证不会出现并发问题. redis基于内存,速度非常快,据测试,redis读的速度是110000次/s,写的速度是81000次/s 本节介绍SpringBoot引入redis,以及使用RedisTemplate来操作redis数据. 采用SpringBoot 2.1.9.RELEASE,对应示例代码在:https://github.com/lao

  • springboot整合redis修改分区的操作流程

    springboot整合redis修改分区 问题由来 最近使用springboot整合redis,一个系统动态数据源连接不同数据库,缓存使用的redis,那么就需要将不同数据库的数据缓存到redis不同的分区,也就是不同的库中. 老版解决 这里的老版指的是2.0之前的,我使用的1.5.9是ok的. redis的配置类这里就不贴了,网上很多. 1.使用JedisConnectionFactory修改 @Autowired JedisConnectionFactory jedisConnection

  • 关于SpringBoot整合redis使用Lettuce客户端超时问题

    参考的博客 问题起因 做毕设的时候,使用到Lettuce连接redis,一段时间后不操作,再去操作redis,会报连接超时错误,在其重连后又可使用. 原因是:Lettuce 自适应拓扑刷新(Adaptive updates)与定时拓扑刷新(Periodic updates) 是默认关闭的导致问题的出现 解决的方案 1.重写连接工厂实例,更改其LettuceClientConfiguration 为开启拓扑更新 @Configuration public class RedisConfig { @

  • springBoot整合redis使用案例详解

    一.创建springboot项目(采用骨架方式) 创建完成: 我们分析下pom文件中内容: 所使用到的关键依赖: <!--springBoot集成redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.5.4<

随机推荐