专栏首页码农UP2U给接口添加缓存

给接口添加缓存

在项目中有些接口调用非常的频繁,但是接口的数据却很少改变,在接口上添加缓存可以有效的提高接口的性能。本文介绍如何在接口上增加缓存来提高接口的性能。

一、创建 SpringBoot 项目

在项目中,我们通过引入 Redis 服务器来做接口的缓存,我们创建一个 SpringBoot 的项目,先来添加其依赖,依赖如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.6.0</version>
</dependency>

依赖中引入了 Redis 所需的依赖,以及连接池的依赖,引入依赖后,来完成相关的配置。配置文件如下:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.database=0
spring.redis.timeout=1800000
spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0

二、创建项目的结构及代码

写一个简单的 Demo,Demo 的功能有两个,一个用来读取用户的列表,第二个功能用来添加新的用户。我们首先创建 controller、service 和 mapper 三个包结构。然后在其下分别添加相关的代码。

首先添加 controller 的代码,代码如下:

@RestController
@RequestMapping("/api/user")
public class CacheController
{
    @Autowired
    private CacheService cacheService;

    @GetMapping("getList")
    public List<User> getList() {
        return cacheService.getList();
    }

    @PostMapping("save")
    public void save(User user) {
        cacheService.setUser(user);
    }
}

在 Controller 中有 getList 和 save 两个方法,getList 方法用来获取用户的列表,save 用来添加新的用户。然后来编写这两个方法对应的 service 代码,代码如下:

@Service
public class CacheServiceImpl extends ServiceImpl<UserMapper, User> implements CacheService
{
    @Override
    public List<User> getList() {
        return baseMapper.selectList(null);
    }

    @Override
    public void setUser(User user) {
        baseMapper.insert(user);
    }
}

在 service 的 getList 方法,直接调用 baseMapper 的 selectList 方法来获取全部用户的列表,setUser 方法直接调用 baseMapper 的 insert 方法来添加新的用户。

mapper 文件直接继承 BaseMapper 即可,mapper 代码如下:

@Mapper
public interface UserMapper extends BaseMapper<User>
{
}

上面的代码是典型 Web 开发的套路。在上面的代码中,每次调用 getList 接口都会查询 user 表,返回用户的列表。在返回的列表中,只要用户的信息不变,或者用户没有增减,那么列表返回的内容总是固定的。在这种情况,每次调用接口都去查询数据库,对数据库而言是一种负担,且是不必要的。这时候给该接口增加一个缓存,那么每次调用 getList 时就无需查询数据库了,这样既减轻了数据库的压力,也提升了接口的性能,这样就非常的 nice 了。

三、给接口增加缓存

缓存的形式比较多,可以在项目的内存中直接进行缓存,也可以使用专门的缓存服务器进行缓存。如果缓存的内容少,可以直接在项目的内存中进行缓存,省去了缓存服务器的管理与成本,缓存的内容多则在缓存服务器中进行缓存,方便后续的扩容和进行单独的管理等,并且在项目重启后,缓存的内容不丢。本 Demo 我们使用 Redis 服务器来作为缓存。

使用缓存,首先来增加一个 config 包,在包中创建一个 Redis 的配置类,在该配置类中设置编写 key 生成的规则,设置 RedisTemplate 的规则,设置缓存的规则等。此处,基本上每个 Redis 的配置类都差不多,因此,这里就不贴出具体的代码了。

在配置好 Redis 的配置类后,无需修改任何代码,只需要在 service 的方法上增加注解,即可给接口增加缓存,增加注解后的 service 代码如下:

@Override
@Cacheable(value = "user", keyGenerator = "keyGenerator")
public List<User> getList() {
    return baseMapper.selectList(null);
}

@Override
@CacheEvict(value = "user", allEntries = true)
public void setUser(User user) {
    baseMapper.insert(user);
}

在上面的代码中,为两个方法分别增加了注解。第一个 @Cacheable 注解用于给该方法增加一个缓存,另外一个 @CacheEvict 注解用于给清除缓存。在两个注解中,都有一个 value 值,@CacheEvict 清除缓存时会清除指定 value 的缓存。

增加完缓存后,我们重启项目,重新来测试接口的缓存。在测试接口之前,不要忘记启动 Redis 服务器,然后通过 redis-cli 执行 flushdb 清空 redis 中的缓存,这样方便我们观察缓存中的数据。做好这些准备,我们就可以请求接口的地址了,地址如下:

http://localhost:8080/api/user/getList

请求上面的接口后,在 IDEA 的控制台中可以看到接口查询数据库的日志记录,日志如下图所示。

此时来查看 Redis 服务器缓存,缓存中的内容如下图所示。

可以看到,缓存中已经有数据了,然后再次访问该接口,在 IDEA 的控制台中没有任何的查询日志输出,但是接口同样返回了刚才的数据列表,这样就说明我们接口查询的数据被缓存到 Redis 中了。

当我们增加一个新的 user 记录时,需要让缓存失效,也就是删除缓存。因为实际的用户列表发生了变化,这个功能由 @CacheEvict 注解为我们完成。我们通过 save 接口来增加一个用户,增加用户如下图。

此时再来查看 Redis 服务器中的缓存,如下图所示。

可以看到,刚刚被缓存的用户列表已经没有了。再次调用查询用户列表的接口,仍然可以看到 IDEA 的控制台有数据库的查询日志,且 Redis 服务器中又缓存了新的数据用户列表数据。

四、总结

并不是所有的接口都适合增加缓存,但是对于类似字典表中的数据我们完全可以进行缓存,还有一些不经常变化的数据也可以进行缓存。

本文分享自微信公众号 - 码农UP2U(gh_3c91b47a82e0),作者:码农UP2U

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-10-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 第 12 篇:加缓存为接口提速

    目前,用户对于接口的操作基本都需要查询数据库。获取文章列表需要从数据库查询,获取单篇文章需要从数据库查询,获取评论列表也需要查询数据。但是,对于博客中的很多资源...

    HelloGitHub
  • 用aop加redis实现通用接口缓存

    系统在高并发场景下,最有用的三个方法是缓存,限流,降级。 缓存就是其中之一,目前缓存基本上是用redis或者memcached。 redis和memcached...

    猿天地
  • 接口加了缓存之后如何验证缓存是否有效

    在项目中没有必要每次请求都查询数据库的情况就可以使用缓存,让每次请求先查询缓存,如果命中,就直接返回缓存结果,如果没有命中,再查询数据库, 并将查询结果放入缓存...

    小博测试成长之路
  • 用firebug给firefox添加信任链接

      在前文“firefox查看微信公众平台的数据分析时就出现不信任链接怎么办?”我们使用了导入证书的方法添加信任链接,有网友反映说证书导入不成功,这里用另外一种...

    ytkah
  • Android 8.0的缓存大小和缓存清理接口方法

    以上这篇Android 8.0的缓存大小和缓存清理接口方法就是小编分享给大家的全部内容了,希望能给大家一个参考。

    砸漏
  • 给SpringBoot接口加全局日志(AOP)

    一想到,每个接口都需要加一个开始时间和一个结束时间,我就感觉特别烦,就是不想撸代码。

    猿码优创
  • 实战SSM_O2O商铺_47【Redis缓存】清除缓存接口的开发

    设计如下: 在接口层传入缓存key的前缀,通过匹配的方式将能匹配到该前缀的所有key均删除。

    小小工匠
  • 仿写Spring Boot缓存注解@Cacheable 添加删除

    最近在使用springboot 的缓存注解的时候,发现挺好用的。这里我们就来仿写一下。

    分享干货的你
  • 利用Spring特性给接口添加注解式挡板和分布式锁

    在很多实际场景中,需要给接口加上挡板和分布式锁。比如,最常见的定时任务,有时候需要通过配置决定这个定时任务是该运行还是该暂停,有时候开启了多个实例,但是在同一时...

    leaforbook
  • CacheManager:–个通用缓存接口抽象类库

    CacheManager是–个缓存通用接口抽象类库,它支持各种高速缓存提供者,例如Memcache,Redis,并且有许多先进的功能特性。具体可以访问官方网站 ...

    张善友
  • 给typecho加上txt缓存功能,减缓网站并发压力

    有些时候我们希望减少对数据库的查询来提高程序的性能,因为这些数据不是经常变更的,而是会在很长一段时间内都不会变化,因此,我们每连接一次数据库,都会把相应的结果用...

    用户7146828
  • VisualStudio 给项目添加特殊的 Nuget 的链接

    有一些项目需要使用一些特殊的 Nuget 才可以下载,但是不能在开源的项目需要小伙伴下载仓库在自己的 VisualStudio 修改自己的 Nuget 链接才能...

    林德熙
  • 缓存中ConcurrentHashMap的加锁怎么做给个例子?

    记 不记得,我们在讲java的线程部分安全知识时,举了一个例子【例:1.8.2-(补充)】。卖书卖到最后,卖出了个负数。这里还用那个例子,可是完全用 Concu...

    马克java社区
  • 【接口调用】EasyCVR如何通过接口添加RTMP推流的直播过程?

    大家知道EasyCVR是TSINGSEE青犀视频开发的平台中支持协议最多的一款协议融合平台,EasyCVR能够兼容海康、大华的私有SDK,同时也具备GB2818...

    TSINGSEE青犀视频
  • 干货 | 小程序多页面接口数据缓存

    小程序里面多个页面,有时候会需要用到同一个接口的数据。而这些数据全局来说只需要拉取一遍,如果要存到缓存,要怎么保证其他页面取缓存的时候,数据已经拉取回来了呢?

    腾讯NEXT学位
  • .NET Core教程--给API加一个服务端缓存啦

    在.NET Core Web API这里的话, 两种思路:Middleware 或者ActionFilter.

    李国宝
  • 1、Redis服务搭建 2、为功能添加缓存功能

    2.redis介绍 2.1.什么是redis Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应...

    爱明依
  • 如何给基于 SAP Cloud SDK 的应用增添缓存支持 Cache support

    有时,从您的应用程序到外部服务器的服务调用在性能和延迟方面非常昂贵。一旦达到客户和客户的关键响应时间,对查询数据的进一步评估会使事情变得更糟。

    Jerry Wang
  • 给你的数据库加一道缓存:Redis入门教程

    Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。 本教程将会教你如何在Ubuntu 18.04 上安装、配置Red...

    苏子晨

扫码关注云+社区

领取腾讯云代金券