spring boot 缓存_Spring Boot 集成 Redis 实现数据缓存

Spring Boot 集成 Redis 实现数据缓存,只要添加一些注解方法,就可以动态的去操作缓存了,减少代码的操作。

在这个例子中我使用的是 Redis,其实缓存类型还有很多,例如 Ecache、Mamercache、Caffeine  等。

Redis 简介

Redis 是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的 Web 应用程序。

Redis 相关的知识就不在这里赘述了,感兴趣的可以公众号回复 Redis 看下 Redis 系列文章。

下面我们在 Spring Boot 中集成 Redis 来实现数据缓存。

Spring Boot 集成 Redis 实现缓存

Spring Boot 集成 Redis 实现缓存主要分为以下三步:

  1. 加入 Redis 依赖
  2. 加入 Redis 配置
  3. 演示 Redis 缓存

加入依赖

首先创建一个项目,在项目中加入 Redis 依赖,项目依赖如下所示(由于使用 Redis 连接池,需额外引入 commons-pool2):

org.springframework.bootspring-boot-starter-web
org.springframework.bootspring-boot-starter-data-redis
org.apache.commonscommons-pool2

spring-boot-starter-data-redis 1.X 版本默认使用 Jedis 客户端,在 2.X 版本默认开始使用 Lettuce 客户端,如果习惯使用 Jedis 的话,可以从 spring-boot-starter-data-redis 中排除 Lettuce 并引入 Jedis。

加入配置

在配置文件 application.properties 中配置 Redis 的相关参数,具体内容如下:

#Redis 索引(0~15,默认为 0)
spring.redis.database=0
spring.redis.host=127.0.0.1
#Redis 密码,如果没有就默认不配置此参数
spring.redis.password=
spring.redis.port=6379
#Redis 连接的超时时间
spring.redis.timeout=1000
#连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=20
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.lettuce.pool.max-wait=-1
#连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=10
#连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=0

接下来在 config 包下创建一个 Redis 配置类 RedisConfig,在配置类上加入注解 @Configuration,注入一个 CacheManager 来配置一些相关信息,代码如下:

@Configuration
public class RedisConfig {

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(30))
                .prefixKeysWith("cache:user:")
                .disableCachingNullValues()
                .serializeKeysWith(keySerializationPair())
                .serializeValuesWith(valueSerializationPair());
        return RedisCacheManager.builder(factory)
                .withCacheConfiguration("user", redisCacheConfiguration).build();
    }

    private RedisSerializationContext.SerializationPair keySerializationPair() {
        return RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer());
    }

    private RedisSerializationContext.SerializationPair valueSerializationPair() {
        return RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer());
    }
}

首先通过 RedisCacheConfiguration 生成默认配置,然后对缓存进行自定义化配置,比如过期时间、缓存前缀、key/value 序列化方法等,然后构建出一个 RedisCacheManager,其中通过 keySerializationPair 方法为 key 配置序列化,valueSerializationPair 为 value 配置序列化。

定义用户实体类

domain 包下创建一个用户实体类:

public class User {

    private Long id;

    private String name;

    private String password;
    // 省略 getter/setter
}

在服务中使用 SpringCache 注解

service 包下定义用户接口,分别包含添加用户、查询用户、更新用户以及删除用户四个接口,具体代码如下:

public interface UserService {

    void addUser(User user);

    User getUserById(Long id);

    User updateUser(User user);

    void deleteById(Long id);
}

然后编写实现类,为了方便演示,在这里使用 Map userMap,没有去连接数据库,其中用到的注解有 @CacheConfig、@Cacheable、@CachePut 以及 @CacheEvict,具体代码如下:

@Service
@CacheConfig(cacheNames = "user")
public class UserServiceImpl implements UserService {

    Map userMap = Collections.synchronizedMap(new HashMap<>());@Overridepublic void addUser(User user) {
        userMap.put(user.getId(), user);
    }@Override@Cacheable(key = "#id")public User getUserById(Long id) {if (!userMap.containsKey(id)) {return null;
        }return userMap.get(id);
    }@Override@CachePut(key = "#user.id")public User updateUser(User user) {if (!userMap.containsKey(user.getId())) {throw new RuntimeException("不存在该用户");
        }
        User newUser = userMap.get(user.getId());
        newUser.setPassword(user.getPassword());
        userMap.put(newUser.getId(), newUser);return newUser;
    }@Override@CacheEvict(key = "#id")public void deleteById(Long id) {
        userMap.remove(id);
    }
}

在这里说下这几个注解:

@CacheConfig 类级别的缓存注解,允许共享缓存名称

@Cacheable 触发缓存入口

一般用于查询操作,根据 key 查询缓存.

  1. 如果 key 不存在,查询 db,并将结果更新到缓存中。
  2. 如果 key 存在,直接查询缓存中的数据。

@CacheEvict 触发移除缓存

根据 key 删除缓存中的数据。

@CacahePut 更新缓存

一般用于更新和插入操作,每次都会请求 db,通过 key 去 Redis 中进行操作。

  1. 如果 key 存在,更新内容
  2. 如果 key 不存在,插入内容。

最后,在 controller 包下创建一个 UserController 类,提供用户 API 接口(未使用数据库),代码如下:

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public ResponseEntity getUser(@PathVariable Long id) {
        return ResponseEntity.status(HttpStatus.CREATED).body(userService.getUserById(id));
    }

    @PostMapping
    public ResponseEntity createUser(@RequestBody User user) {
        userService.addUser(user);
        return ResponseEntity.status(HttpStatus.CREATED).body("SUCCESS");
    }

    @PutMapping
    public ResponseEntity updateUser(@RequestBody User user) {
        return ResponseEntity.status(HttpStatus.CREATED).body(userService.updateUser(user));
    }

    @DeleteMapping("/{id}")
    public ResponseEntity deleteUser(@PathVariable Long id) {
        userService.deleteById(id);
        return ResponseEntity.status(HttpStatus.CREATED).body("SUCCESS");
    }
}

启动类添加开启缓存注解

@SpringBootApplication
@EnableCaching
public class RedisCacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(RedisCacheApplication.class, args);
    }
}

@EnableCaching 表明开启缓存,Spring Boot 会自动配置 Redis 缓存的 CacheManager。

启动项目,先调用添加用户接口,添加用户 wupx,id 为 1,在 getUserById 方法打断点,第一次调用 getUser 接口获取用户的时候,会运行到断点处,第二次调用 getUser 不会运行到断点处,而是直接从 Redis 中读取缓存数据。

通过 Redis 可视化工具 RedisDesktopManager 查看,结果如图所示:

734add9d268a2f7c49425e2d6a93b236.png

到此为止,我们就完成了 Spring Boot 与 Redis 的集成实现数据缓存。

总结

Spring Boot 集成 Redis 实现数据缓存还是比较轻松的,Spring 提供了缓存注解,使用这些注解可以有效简化编程过程,大家可以自己动手实践下。

本文的完整代码在 https://github.com/wupeixuan/SpringBoot-Learn 的 redis-cache 目录下。

留言讨论

最好的关系就是互相成就,大家的点赞、在看、分享、留言四连就是我创作的最大动力。

参考

https://github.com/wupeixuan/SpringBoot-Learn

37e041385d95f7cd1807f4d278956652.gif   ●Spring Boot 集成阿里云 OSS 进行文件存储●Spring Boot 集成 Elasticsearch 实战●Spring Boot 集成 WebSocket 实现服务端推送消息到客户端

4278d3d68d70e13ea5f1e39f5fcd1f86.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.md是什么文件_Element-UI源码阅读之md显示到页面

入口文件首先&#xff0c;看一个项目的入口&#xff0c;可以从package.json中去看它的运行命令 可以看到dev那行&#xff0c;执行了很多脚本&#xff1a; npm run bootstrap && npm run build:file && cross-env NODE_ENVdevelopment webpack-dev-server --con…

linux误删ssh不上,误删openssh-server删除,复原操作

在别的节点上寻找openssh的程序有哪些&#xff1a;而我的这个节点上只有一个openssh-clines&#xff0c;所以&#xff0c;就先利用了yum install openssh-server进行安装&#xff0c;但是这个安装的是最新的 openssh-server-5.3p1-122.el6.x86_64.rpm&#xff0c;担心集群节点之…

我用 MySQL 干掉了一摞简历

临近过年&#xff0c;疫情又趋于平稳&#xff0c;最近出来面试的人也多了起来&#xff0c;我们公司也在招人。我发现&#xff0c;不少候选人&#xff0c;对数据库的认知还处在比较基础的阶段&#xff0c;以为会写“增删改查”、做表关联就足够了&#xff0c;那些工作中经常出现…

为什么AI工程师成为当前薪资最高的技术岗位

今年无疑是“人工智能”话题火热指数最高的一年。从腾讯西雅图AI实验室&#xff0c;百度斥资超过200亿投入人工智能研发&#xff0c;再到最近 Google 打算在中国进行AI领域的市场扩张&#xff0c;其母公司 Alphabet 更是在7月便成立专注AI领域的风投机构...全球都在风生水起、将…

spring boot jar包_「Spring Boot 新特性」 jar 大小自动瘦身

自动分析瘦身Spring Boot 项目最终构建处理 JAR 包大小一直是个诟病&#xff0c;需要把所有依赖包内置最终输出可运行的 jar。当然可以使用其他的插件扩展 实现依赖 JAR 和 可运行 jar 分离可以参考 slot-maven-plugin[1], 但此种方法治标不治本并不能减少原有依赖的 JAR 的大小…

设计模式在项目中的应用案例_设计模式在项目中的应用(初学者版)

文章首发链接&#xff1a;设计模式在项目中的实际应用&#xff08;应试版&#xff09;​mp.weixin.qq.com本文适用于设计模式初学者。很多人学习了设计模式&#xff0c;但在项目开发中仍然不知道如何使用&#xff1b;很多小伙伴在课堂上跟着老师稀里糊涂的听了&#xff0c;懂了…

微创社001期:从0开始创作第一本技术书

互联网已经成为了人们生活中如饮水空气一般的基础设施&#xff0c;它不仅影响着当下我们的生活&#xff0c;也必将在更加普遍的领域影响着我们的未来。而在大浪潮中&#xff0c;坚守一个以自我为中心的知识体系&#xff0c;不仅有助于我们作为个体更好的从互联网汲取养分&#…

关于虚拟机下linux共享Windows文件的解决方案

先跟大家说一下在windows下装的vmware&#xff0c;就是又在vmware的系统里虚拟了一个Linux的系统的话&#xff0c;我们有些朋友就是想法把物理机的东西拷贝到Linux虚拟机里时很是伤神&#xff0c;当然windows就很简单了&#xff0c;直接拖进去&#xff08;如果你安装了vmware t…

10分钟让你快速掌握Excel的16项重要技巧

大家在日常生活、工作使用Excel时&#xff0c;是不是总会遇到很多问题呢? 不小心将文件命名错了&#xff0c;要一个个改&#xff1f; 文件里只需要数据却不知道怎么提取&#xff1f; 工作汇报要做数据汇总、需要插入大量图片怎么办&#xff1f; 甚至在耗费相当多的时间与精力…

linux中wine yum安装,分享|在基于RedHat或Debian的系统上安装 Wine 1.7

Wine,Linux上最流行也是最有力的软件, 可以顺利地在Linux平台上运行Windows程序和游戏。这篇文章教你怎么在像CentOS, Fedora, Ubuntu, Linux Mint一样基于Red Hat和Debian的系统上安装最新的Wine 1.7。在Linux安装 Wine 1.7不幸的, 在基于Red Hat的系统上没有官方的 Wine 仓库…

还不知道这 11 个超酷的编程新工具你就 out 了!

工具对开发人员来说至关重要。工具可以让一个开发人员的日常工作更高效&#xff0c;并且只需要关注最重要的事情。对于开发人员来讲&#xff0c;寻找更好的替代工具往往比坚持使用熟悉过时的工具更困难。 在这篇文章中&#xff0c;我们将列出你在日常工作中能够使用的新的开发工…

Linux装多个apache,windows linux如何安装多个apache?

富国沪深Windows下安装多个Apache服务&#xff1a;1.安装好Apache以后&#xff0c;可以在浏览器中输入http://localhost测试&#xff1b;2.更改第一个站点的根目录&#xff1a;在文件Apache2.2\conf\httpd.conf中查找 DocumentRoot 属性&#xff0c;将后面的路径改为你的主站点…

[Abp 源码分析]DTO 自动验证

点击上方蓝字关注我们0.简介在平时开发 API 接口的时候需要对前端传入的参数进行校验之后才能进入业务逻辑进行处理&#xff0c;否则一旦前端传入一些非法/无效数据到 API 当中&#xff0c;轻则导致程序报错&#xff0c;重则导致整个业务流程出现问题。用过传统 ASP.NET MVC 数…

五分钟搞懂并查集

并查集是我暑假从高手那里学到的一招&#xff0c;觉得真是太精妙的设计了。来看一个实例&#xff0c;杭电1232畅通工程。首先在地图上给你若干个城镇&#xff0c;这些城镇都可以看作点&#xff0c;然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问…

[Abp 源码分析]多语言(本地化)处理

点击上方蓝字关注我们0.简介如果你所开发的需要走向世界的话&#xff0c;那么肯定需要针对每一个用户进行不同的本地化处理&#xff0c;有可能你的客户在日本&#xff0c;需要使用日语作为显示文本&#xff0c;也有可能你的客户在美国&#xff0c;需要使用英语作为显示文本。如…

Kaggle 发布首份数据科学从业报告 | 不及美国同行1/3,中国数据科学家平均年薪约3万美元

Kaggle 是互联网上最著名的数据科学竞赛平台之一&#xff0c;今年 3 月 8 日&#xff0c;这家机构被谷歌收购&#xff0c;6 月 6 日又宣布用户数量超过了 100 万人。互联网创业方兴未艾&#xff0c;人工智能的浪潮又接踵而来&#xff0c;而贯穿其中的数据科学则在这更迭交替中显…

mysql设置表名字为占位符_这可能是把MySQL存储引擎讲解的最清楚的一篇文章了

存储引擎是MySQL的组件&#xff0c;用于处理不同表类型的SQL操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能&#xff0c;使用不同的存储引擎&#xff0c;还可以获得特定的功能。使用哪一种引擎可以灵活选择&#xff0c;一个数据库中多个表可以使用不同引擎…

linux开发板显示横向彩虹,给 Linux 终端的输出添加彩虹特效的命令

原标题&#xff1a;给 Linux 终端的输出添加彩虹特效的命令正文如果认为Linux命令行很无聊并且没有任何乐趣&#xff0c;那么您错了&#xff0c;真实的Linux多么有趣和淘气。在本文&#xff0c;我将介绍一个名为“ lolcat ”的实用小工具&#xff0c;该实用工具在终端中产生彩虹…

Delphi 与 DirectX 之 DelphiX(46): TDIB.DoAntiAlias;

本例效果图:代码文件:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, DIB, StdCtrls;typeTForm1 class(TForm)DXPaintBox1: TDXPaintBox;Button1: TButton;Button2: TButton;procedure Button1Click(Sender: T…

Web API实现微信公众平台开发-服务器验证

背景最近开发微信公众号相关接口&#xff0c;在这里记录下微信公众号相关各项功能的实现。先决条件1、一台可部署web服务的服务器或者云平台&#xff08;本地可以搞个花生壳域名&#xff09;。2、一个可以正常使用的微信公众账号&#xff0c;开始的时候使用它的测试号。3、Visu…