Spring Boot 集成 Redis 缓存

在此章,我们将 SpringBoot 集成 Redis 缓存,Redis是一个开源的,基于内存的数据结构存储,可以用作数据库、缓存和消息代理,在本章仅讲解缓存集成。

准备工作

当前项目工具及环境

  • 开发工具 IDEA 2020.3
  • 依赖管理 Maven
  • Spring Boot
  • JDK 1.8
  • Redis

现在去初始化一个Spring网站初始生成一个SpringBoot项目

新建项目




点击 Next 后设置项目名称后,点击 Finish 完成创建项目

新建实体对象

要将数据存到redis,我们需要定义一个实体来进行交互,并需要序列化实体对象

User.java

package com.github.gleans.model;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;import javax.persistence.*;
import java.io.Serializable;@Data
@Entity
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {private static final long serialVersionUID = 1L;@Id@SequenceGenerator(name = "SEQ_GEN", sequenceName = "SEQ_USER", allocationSize = 1)@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN")private Long id;private String name;private long money;
}

使用JPA的简洁数据操作

UserRepository.java

package com.github.gleans.dao;import com.github.gleans.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;/*** 操作数据库*/
@Repository
public interface UserRepository extends JpaRepository<User, Long>  {}

接口api代码

UserController.java

import com.github.gleans.dao.UserRepository;
import com.github.gleans.model.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;import java.util.List;@Slf4j
@RestController
public class UserController {private  UserRepository userRepository;@Autowiredpublic void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}@Cacheable(cacheNames = "userAll")@GetMapping("user/all")public Object getUserAll() {return userRepository.findAll();}@Cacheable(value = "users", key = "#userId", unless = "#result.money < 10000")@GetMapping("user/con/{userId}")public Object getUserByCondition(@PathVariable Long userId) {return userRepository.findById(userId);}@CachePut(value = "users", key = "#user.id")@PutMapping("/update")public User updatePersonByID(@RequestBody User user) {userRepository.save(user);return user;}@CacheEvict(value = "users", allEntries=true)@DeleteMapping("/{id}")public void deleteUserByID(@PathVariable Long id) {List<User> userListOld =  userRepository.findAll();log.info("删除前:{}", userListOld.toString());userRepository.deleteById(id);List<User> userList =  userRepository.findAll();log.info("删除后:{}", userList.toString());}
}

配置 application.yml

# Redis Config
spring:datasource:url: jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000driverClassName: org.h2.Driverusername: rootpassword: rootcache:type: redisredis:host: localhostport: 6379password: ekko1234jpa:show-sql: true

启动 Redis

项目根目录, 使用docker-compose up -d 启动 redis

Microsoft Windows [版本 10.0.17763.1339]
(c) 2018 Microsoft Corporation。保留所有权利。C:\Users\ekko\Documents\SpringBootLearn>cd springboot-redisC:\Users\ekko\Documents\SpringBootLearn\springboot-redis>docker-compose up -d
Creating network "springboot-redis_default" with the default driver
Creating my_redis ... doneC:\Users\ekko\Documents\SpringBootLearn\springboot-redis>

开启缓存并初始化数据

在启动类增加注解@EnableCaching开启缓存
并实现CommandLineRunner接口来执行启动完成之后的任务
SpringBootRedisApplication.java


import com.github.gleans.dao.UserRepository;
import com.github.gleans.model.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;@Slf4j
//springboot启动时执行任务CommandLineRunner
@SpringBootApplication
//开启缓存
@EnableCaching
public class SpringBootRedisApplication implements CommandLineRunner {private UserRepository userRepository;public static void main(String[] args) {SpringApplication.run(SpringBootRedisApplication.class, args);}@Autowiredpublic void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}@Overridepublic void run(String... args) throws Exception {log.info("开始初始化user ->user count ->{}", userRepository.count());User james = new User(1L, "James", 2000);User potter = new User(2L, "Potter", 4000);User dumbledore = new User(3L, "Dumbledore", 999999);userRepository.save(james);userRepository.save(potter);userRepository.save(dumbledore);log.info("初始化完成 数据-> {}.", userRepository.findAll());}
}

新增缓存

当我们数据库查询出来的值要放到缓存里,用@Cacheable注解

    @Cacheable(value = "users", key = "#userId", unless = "#result.money < 10000")@RequestMapping(value = "/{userId}", method = RequestMethod.GET)public Object getUser(@PathVariable Long userId) {logger.info("获取user信息根据ID-> {}.", userId);return userRepository.findById(userId);}

我们访问 localhost:8080/1 和 localhost:8080/3 分别两次

发现id为3的就走了一次方法 说明缓存成功
id为1的走了两次是因为 unless里条件成立就不会缓存到redis

更新缓存

每次当我们的数据库的值要更改,我们缓存的也要更改 ,我们可以使用 @CachePut 注解

   @CachePut(value = "users", key = "#user.id")@PutMapping("/update")public User updatePersonByID(@RequestBody User user) {userRepository.save(user);return user;}

删除缓存

当我们的数据从数据库删除,我们也要从缓存进行删除,我们可以使用 @CacheEvict 注解
allEntries 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存

    @CacheEvict(value = "users", allEntries=true)@DeleteMapping("/{id}")public void deleteUserByID(@PathVariable Long id) {logger.info("删除用户根据ID-> {}", id);userRepository.deleteById(id);}

在redis中查看已经没有了缓存
redis可视化工具下载地址在github

源码地址

https://github.com/Gleans/SpringBootLearn/tree/master/springboot-redis

逻辑脑图

Spring Boot 集成 Redis 缓存相关推荐

  1. Spring Boot集成Redis缓存之模拟高并发场景处理

    前言 同样我们以上一篇文章为例子,搭建好环境之后,我欧美可以模拟高并发场景下,我们的缓存效率怎么样,到底能不能解决我们实际项目中的缓存问题.也就是如何解决缓存穿透? Spring Boot集成Redi ...

  2. Spring Boot集成Redis缓存之RedisTemplate的方式

    前言 Spring Boot 集成Redis,将自动配置 RedisTemplate,在需要使用的类中注入RedisTemplate的bean即可使用 @Autowired private Redis ...

  3. Spring Boot集成Redis缓存之注解方式

    首先还是加入依赖Jar pom.xml中加入依赖 <!-- 加载spring boot redis 包 --><dependency><groupId>org.sp ...

  4. Linux 安装Redis-6.2.5,配置及使用(RDB与AOF持久化、sentinel机制、主从复制、Spring Boot 集成 Redis)

    CentOS 7 安装Redis-6.2.5版本 Redis采用的是基于内存的单进程 单线程模型 的KV数据库,由C语言编写.官方提供的数据是可以达到100000+的qps 应用场景: 令牌(Toke ...

  5. Spring Boot 结合 Redis 缓存

    Redis官网: 中:http://www.redis.cn/ 外:https://redis.io/ redis下载和安装 Redis官方并没有提供Redis的Windows版本,这里使用微软提供的 ...

  6. Spring boot - 整合 Redis缓存(上)

    一.配置Pom文件 在使用spring boot 2.0整合redis时遇到了好多问题,网上很多例子都是1.x版本的.故2.0没有折腾好所以将2.0降到了1.5.降级后由于thymeleaf版本也会从 ...

  7. Spring Boot集成Redis实现缓存

    前言 在此章,我们将 SpringBoot 集成 Redis缓存,Redis是一个开源的,基于内存的数据结构存储,可以用作数据库.缓存和消息代理,在本章仅讲解缓存集成.一键获取源码地址 准备工作 当前 ...

  8. Spring Boot 集成 本地缓存Guava框架

    Spring Boot 作为主流微服务框架,拥有成熟的社区生态.市场应用广泛,为了方便大家,整理了一个基于spring boot的常用中间件快速集成入门系列手册,涉及RPC.缓存.消息队列.分库分表. ...

  9. 【第二十三篇】Spring Boot集成redis

    1.1 简介 REmote DIctionary Server(Redis)是一个由Salvatore Sanfilippo写的key-value存储系统. Redis是一个开源的使用ANSI C语言 ...

最新文章

  1. Chrome禁用浏览器跨域拦截
  2. static关键字(修饰函数、局部变量、全局变量)
  3. HDU 1231 最大连续子序列 (动态规划)
  4. linux里工作目录的字体变蓝,netterm访问Linux时字体和背景颜色随目录发生改变的问题解决...
  5. leetcode python3 简单题231. Power of Two
  6. JavaScript执行机制-node事件循环
  7. 傲梅分区助手 linux,傲梅分区助手专业版
  8. python评分卡模型
  9. ArangoDB高级查询(一)
  10. centos安装宝塔跳过绑定手机号
  11. linux之kubuntu挂载硬盘
  12. 信任危机在蔓延,会不会产生雪崩效应
  13. 计算机二级Python错题
  14. Neo4j 4.x 社区版数据导入及Spring-Data-Neo4j 5.x、6.x使用案例
  15. 2023年房地产地段研究报告
  16. stm32f429ig usbvcp故障排除
  17. 架构师之数字判断-----------------怎么判断一个字符串是个数字
  18. 计算机毕业设计Java重庆旅游景点(源码+系统+mysql数据库+Lw文档)
  19. docker-前端部署
  20. 对学校的希望和寄语_对孩子的希望和寄语

热门文章

  1. 最值得收藏的电脑快捷键使用, 让你的效果成倍增加
  2. 更改开发者账号中的公司名称, 也就是苹果商店显示的开发商名称
  3. Django框架全面速览
  4. 深度评测 r7 5700g核显相当于什么显卡
  5. 戴尔540服务器光驱在什么位置,戴尔Dell 500 官方拆机图解教程
  6. iOS开发-Swift进阶之枚举enum!
  7. 用计算机专业术语写寄语,霸气辅导员用编程写寄语 毕业生直呼有创意
  8. Java读取文件内容
  9. QT 5.11.1 + OpenGL 第一篇(OpenGL在Qt中几个版本)
  10. 怎样注册一个好域名?