前言

在此章,我们将 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
1.

启动 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有

逻辑脑图

源码地址

Spring Boot整合Redis实现缓存相关推荐

  1. Spring Boot 整合Redis 实现缓存

    本文提纲 一.缓存的应用场景 二.更新缓存的策略 三.运行 springboot-mybatis-redis 工程案例 四.springboot-mybatis-redis 工程代码配置详解 运行环境 ...

  2. Spring Boot 整合 Redis 实现缓存操作

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 产品没有价值,开发团队再优秀也无济于事 – <启示录> 』 本文提纲 一.缓 ...

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

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

  4. 猿创征文 | 微服务 Spring Boot 整合Redis 实战开发解决高并发数据缓存

    文章目录 一.什么是 缓存? ⛅为什么用缓存? ⚡如何使用缓存 二.实现一个商家缓存 ⌛环境搭建 ♨️核心源码 ✅测试接口 三.采用 微服务 Spring Boot 注解开启缓存 ✂️@CacheEn ...

  5. 十一、Spring Boot整合Redis(一)

    Spring Boot整合Redis    1. SpringBoot+单例Redis 1)引入依赖 <dependency>     <groupId>org.springf ...

  6. Spring boot整合Redis(入门教程)

    目录 源码分析 jedis VS lettuce 整合测试 导入依赖 配置连接 测试 存入字符串 存入对象 五大数据类型操作 自定义RedisConfig 存入对象 Redis工具类(常用API) 以 ...

  7. 大聪明教你学Java | Spring Boot 整合 Redis 实现访问量统计

    前言 之前开发系统的时候客户提到了一个需求:需要统计某些页面的访问量,记得当时还纠结了一阵子,不知道怎么去实现这个功能,后来还是在大佬的带领下借助 Redis 实现了这个功能.今天又回想起了这件事,正 ...

  8. Spring Boot整合Redis以及Redis的原理

    Redis的原理及知识 Redis简介 redis是一个key-value.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

  9. Spring Boot基础学习笔记08:Spring Boot整合Redis

    文章目录 零.学习目标 1.熟悉Redis相关概念 2.掌握使用Spring Boot整合Redis 一.Redis概述 1.Redis简介 2.Redis优点 (1)存取速度快 (2)数据类型丰富 ...

最新文章

  1. ie8.0 不能用document.all兼容IE7模式
  2. 社招转行CV算法的心酸之路:越朴素的方法,往往越容易成功!
  3. root cause of exception single deletion failure
  4. js字符串、数组和数字常用方法总结
  5. 多个服务间多个自定义的ExceptionHandler类的执行顺序
  6. SQL中IF函数的使用
  7. Oracle Functions快速入门
  8. 中荷金生有约养老年金险怎么样?好不好?
  9. opencv手写数字识别(未完待续...)
  10. php网页的制作,用PHP制作静态网站的模板框架
  11. 持续集成(CI)系统
  12. vs按f5没反应_迟到半年的提车作业,详细品鉴哈弗F5
  13. 【百问网智能家居5】ESP8266的相关知识
  14. python网校 哪个_学习Python有什么推荐的网课,书籍资料,以及该装哪个版本的Python?...
  15. linux命令写成sh脚本并执行
  16. 地质勘查土质分类图片_土质分类的图解分析方法
  17. 欧几里得空间——标准正交基
  18. MTK SN号修改失效
  19. 华为鸿蒙系统出来国产手机会支持,华为官方霸气表态!所有国产手机都能用鸿蒙OS系统:想用就支持...
  20. Linux命令完全指南sysctl,Linux的Sysctl命令

热门文章

  1. 这首英文歌叫《apologize》,很不错,以前高中时期,每次下午听英语听力都会放这首歌,还挺怀恋的呢!
  2. 相爱相杀!微软反超亚马逊重夺西雅图最值钱公司头衔
  3. Java用i74G的显卡_i7 10700能配1650 4G显卡吗?
  4. EarthView-在桌面中俯视地球
  5. Photoshop制作超酷的金属立体字
  6. python饮料购买_Python写的一个自动售饮料小程序!
  7. win7 + SUSE
  8. mysql每日备份数据库并上传到阿里云oss对象存储搭建笔记
  9. java 修改文件内容_用Java修改现有文件内容
  10. 【区块链进阶】比特怪胎下的风口--链上治理(上篇)