前言

在此章,我们将 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 实现缓存机制

    本文章牵涉到的技术点比较多:spring Data JPA.Redis.Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对以上这些技术点有一定的了解或者也可以先看看这篇文章 ...

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

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

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

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

  4. Spring Boot 集成 Redis 缓存

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

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

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

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

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

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

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

  8. Spring Boot 2 + Redis 对象缓存

    依赖配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:/ ...

  9. Java Web现代化开发:Spring Boot + Mybatis + Redis二级缓存

    背景 Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一.Mybatis是一个十分轻量好用的ORM框架.Redis是当今十分主流的分布式key- ...

最新文章

  1. java中序列化与反序列化_Java中的序列化
  2. 【科普】联邦知识蒸馏概述与思考
  3. java web乱码问题_Java Web中文乱码问题解决
  4. [转载] 推荐的C++书籍以及阅读顺序
  5. 2017IEC计算机第二次作业
  6. 将数据集转换为Excel格式的一个实现
  7. C语言:求1到100之间的所有素数,并设定每行输出5个素数
  8. 金山词霸-身边的实用工具
  9. 维码扫描之集成Zxing
  10. 层次分析法 - MATLAB代码详解
  11. 香港城市大学全奖PhD/联培PhD/博后/RA
  12. 为企业出海“搭桥”,汇量科技靠什么出圈?
  13. 2021-09-16关于初学C的心路历程~
  14. 力扣(LeetCode)159. 至多包含两个不同字符的最长子串(2022.06.08)
  15. 红旗 linux 在哪儿 看 版本,简介红旗Linux不同版本的介绍
  16. 51nod 2455 花园
  17. Java程序完形填空题_完形填空:-_JavaDeveloper-51CTO博客
  18. chm打开秒退_CHM文件打开方式
  19. Java之XML解析-使用dom(org.w3c.dom)解析XML
  20. linux中top显示的信息详解,Linux中top显示信息详解

热门文章

  1. 测试敏捷化 vs 敏捷测试
  2. #linux# gcc编译器优化选项的详细信息
  3. Rust入坑指南:海纳百川
  4. lynx最新版本下载地址-2015-7
  5. 一个简单网页游戏--丑陋的连连看
  6. html表格美化源码,非常酷炫的CSS3表格设计样式源码
  7. 1 Java基础后端-基础语法
  8. 2022-1-19 计算机组成原理 —— 程序装载
  9. 技术分享!如何用powerPCB设定4层板的层?-道合顺大数据Infinigo
  10. android viewpager 上下滚动条,安卓中使用ViewPager2实现上下滑动翻页