热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot整合Redis详解快速入门篇(有源码)

目录1、简介2、利用Docker安装Redis3、常用代码介绍4、SpringBoot整合Redis5、测试代码如果对docker操作不熟悉的请点击下面的链接学习:

目录

1、简介
2、利用Docker安装Redis
3、常用代码介绍
4、SpringBoot整合Redis
5、测试代码

如果对docker操作不熟悉的请点击下面的链接学习:

CentOS7服务器搭建SpringBoot项目 详解 (基本操作)

1、简介

NoSQL(Not Only SQL)数据库即非关系型数据库,Redis就是其中一种非关系型数据库。Redis的数据都是在内存中的,也支持持久化,支持多种数据类型,采用单线程+多路IO复用技术。Redis除了缓存查询数据库的结果,还可以保存验证码、session共享等等。

一句话描述Redis就是:数据保存在内存中,访问速度很快,缓存的数据就不用每次都查数据库了。

2、利用Docker安装Redis

采用Xshell工具连接到服务器的控制台。

利用docker安装redis:

输入 docker pull redis 下载Redis

输入 docker images 查看docker本地的镜像

操作如下图:

在这里插入图片描述

运行docker中的redis:

输入 docker images 查看本地镜像

输入 以下代码启动redis服务

docker run -d --name myredis -p 6379:6379 redis --requirepass “123456”

其中

-p 代表将主机的端口映射到容器的一个端口,主机端口:容器内部的端口。

–requirepass “123456” 即是指定redis的登录密码。

–name 即是设置在容器的名称

-d 代表后台运行。

操作如下图:
在这里插入图片描述

利用redis-desktop-manager工具就可以直观的查看缓存的内容,操作如下图:
在这里插入图片描述
在这里插入图片描述

3、常用代码介绍

缓存注解功能介绍:

@EnableCaching 开启基于注解的缓存

@CacheConfig 缓存公共配置

cacheName参数等价于方法上的value

@Cacheable 将方法的返回值进行缓存

运行的流程是 先按照cacheName/value的值去查询缓存组件,如果没有找到就自动创建缓存组件,如果找到了就以key来查询缓存组件,如果找到就直接返回数据否则调用方法,再将数据缓存起来。

@CachePut 调用方法后更新缓存

运行的流程是 先调用方法,再以指定的key缓存返回的结果。

@CacheEvict 清除缓存

运行的流程是 以指定的key去删除缓存的内容,如果参数beforeInvocation的值为true则是先删除缓存中的内容,再去执行方法体中的内容(好处是就算方法出现异常缓存也会被清除),如果为false则先执行方法体再去删除缓存(如果方法体出现异常,缓存就不能被删除)。

参数 beforeInvocation 值为true先删缓存 值为false后删缓存。

参数 allEntries 默认值为false 如果设置为true则方法调用后删除所有缓存。

@Cacheable、@CachePut、@CacheEvict 主要参数:

value 指定缓存组件的名称,至少指定一个。

key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的 所有参数进行组合

condition 缓存的条件,可以为空,使用 SpEL 编写,返 回 true 或者 false,只有为 true 才进行缓存/清 除缓存

除了利用注解的方式操作缓存,还可以使用StringRedisTemplate类与RedisTemplate类操作缓存。

StringRedisTemplate类 继承于 RedisTemplate类,因为缓存操作字符串用得比较多,所以单独抽取出来一个专门处理字符串的类。

这两个类主要操作缓存的方法(五大数据类型):

opsForValue() 用于操作String字符串

opsForList() 用于操作List集合

opsForSet() 用于操作Set集合

opsForHash() 用于操作Hash集合

opsForZSet() 用于操作ZSet有序集合

4、SpringBoot整合Redis

本次项目的基本环境是SpringBoot、JPA、MySql、Redis

利用IDEA创建项目并导入依赖,操作如下图:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

配置Redis:

分别配置Redis的IP地址与登录密码,在application.yml中添加以下代码:

spring:
#配置redis
redis:
#配置redis连接地址
host: 106.12.192.182
#配置redis连接密码
password: 123456
host即是服务器安装redis的IP地址,password就是redis的登录密码。

本次测试案例目录结构图如下:

在这里插入图片描述

在main方法的类上标注@EnableCaching注解,开启基于注解的缓存。

UserService类用于测试缓存,代码如下:

package com.heiban.springboot.service;

import com.heiban.springboot.bean.User;
import com.heiban.springboot.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@CacheConfig(cacheNames = “usr”)//统一配置
@Service
public class UserService {

@Autowired
UserRepository userRepository;@Cacheable(key = "#id")//设置key为参数的id 如果只有一个参数默认就是该参数名称
public User getUser(Long id){User one = userRepository.getOne(id);return one;
}@CachePut(key = "#result.id")//更新数据 并添加到缓存中 key的取值需要是返回后的id
public User updataUser(User user){userRepository.save(user);return user;
}@CacheEvict(key = "#id",beforeInvocation = true)//清空指定的缓存 beforeInvocation = true即先清空缓存再执行方法
public void clear(Long id){System.out.println("清除缓存"+id);
}@CacheEvict(allEntries = true)//清空所有缓存
public void clearAll(){System.out.println("清除所有缓存");
}

}

控制器Index类的代码如下:

package com.heiban.springboot.controller;
import com.heiban.springboot.bean.User;
import com.heiban.springboot.repository.UserRepository;
import com.heiban.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

/**

  • @author 公众号 鲁智深菜园子

  • @date 2020 3 14
    */
    @RestController
    public class Index {

    @Autowired
    UserRepository userRepository;//JPA数据库操作

    @Autowired
    StringRedisTemplate stringRedisTemplate;//操作缓存的方法

    @Autowired
    RedisTemplate redisTemplate;//操作缓存的方法

    @Autowired
    UserService userService;//数据缓存方法

    @ResponseBody
    @RequestMapping({"/","/index.html"})
    public String index() {
    addUser();
    return “添加用户成功”;
    }

    //非注解的方法保存数据包缓存中
    @RequestMapping("/detail/{msg}")
    public String getUser(@PathVariable(“msg”) String msg) {
    stringRedisTemplate.opsForValue().set(“detail”,msg);//设置缓存
    return stringRedisTemplate.opsForValue().get(“detail”);//获取缓存
    }

    //测试缓存注解方法
    @RequestMapping("/user/{id}")
    public String getUser(@PathVariable(“id”) Long id) {
    System.out.println(“查询用户”+id);
    return userService.getUser(id).toString();
    }

    //测试缓存注解方法
    @RequestMapping("/changeuser/{id}")
    public User updataUser(@PathVariable(“id”) Long id) {
    User user = userService.getUser(id);
    //将密码修改成当前时间错
    user.setPassword(System.currentTimeMillis()+"");
    userService.updataUser(user);//更新用户的密码
    return userService.getUser(id);
    }

    //清除指定ID用户的缓存
    @RequestMapping("/clear/{id}")
    public String clear(@PathVariable(“id”) Long id) {
    userService.clear(id);
    return “清除缓存成功”;
    }

    //清除所有缓存
    @ResponseBody
    @RequestMapping("/clearall")
    public String clearAll() {
    userService.clearAll();
    return “清除所有缓存成功”;
    }

    //用于测试添加多个用户
    public void addUser(){
    for(int i&#61;0;i<10;i&#43;&#43;){
    User user &#61; new User();
    user.setUsername(“鲁智深菜园子”&#43;i);
    user.setPassword(“123456”);
    userRepository.save(user);
    }
    }

}

下面将分别测试代码。

5、测试代码

首先测试一下利用StringRedisTemplate类保存数据的方法&#xff0c;由于方法比较多就只演示这个其他也是差不多的。

按照我控制器上面的写法&#xff0c;应该访问 http://127.0.0.1/detail/内容 &#xff0c;得到相应的结果是缓存中存在detail为key 的键值对。测试结果如下&#xff1a;

在这里插入图片描述

如果你的数据库还没有数据&#xff0c;访问 http://127.0.0.1 会自动添加10条数据&#xff0c;用来测试。

测试&#64;Cacheable注解的缓存&#xff08;将方法的返回值进行缓存&#xff09;

按照我控制器上面的写法&#xff0c;应该访问 http://127.0.0.1/user/用户DI &#xff0c;得到相应的结果是缓存中存在用户ID为key 的键值对&#xff0c;查询两次&#xff0c;如果第二次JPA没有发送Sql语句证明数据是从缓存中取的。测试结果如下&#xff1a;
在这里插入图片描述
在这里插入图片描述

测试&#64;CachePut注解的缓存&#xff08;调用方法后更新缓存&#xff09;

按照我控制器上面的写法&#xff0c;应该访问 http://127.0.0.1/changeuser/用户DI &#xff0c;得到相应的结果是修改数据库中的值并缓存起来&#xff0c;修改后查询数据&#xff0c;如果修改后再查询JPA没有发送Sql语句证明数据是从缓存中取的。测试结果如下&#xff1a;
在这里插入图片描述
在这里插入图片描述

测试&#64;CacheEvict 注解的缓存&#xff08;清除缓存&#xff09;

按照我控制器上面的写法&#xff0c;应该访问 http://127.0.0.1/clear/用户DI &#xff0c;得到相应的结果是缓存被删除&#xff0c;如果再次查询JPA发送了Sql语句证明缓存删除成功。测试结果如下&#xff1a;
在这里插入图片描述
在这里插入图片描述

如果你想搭建该测试案例&#xff0c;你需要做的是&#xff1a;

搭建Mysql数据库 密码123456 并且创建数据库名称为cache的数据库&#xff0c;项目启动后JPA会自动创建数据库表。

你还需要配置你的Redis IP地址 与 密码。


推荐阅读
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • Nacos 0.3 数据持久化详解与实践
    本文详细介绍了如何将 Nacos 0.3 的数据持久化到 MySQL 数据库,并提供了具体的步骤和注意事项。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
    在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Linux Shell变量初探:初始值解析与使用指南
    本文探讨了Linux Shell中变量的基本概念及其在BASH中的应用。变量是用于存储可变数据的标识符,能够代表不同的值。文章详细介绍了BASH shell的主要优势,包括强大的命令编辑能力、自动补全功能、命令别名设置、作业控制以及前后台任务管理。此外,还涵盖了编程脚本编写和通配符的使用方法,为初学者提供了全面的指导。 ... [详细]
  • Jeecg开源社区正式启动第12届架构技术培训班,现已开放报名。本次培训采用师徒制模式,深入探讨Java架构技术。类似于大学导师指导研究生的方式,特别适合在职人员。导师将为学员布置课题,提供丰富的视频资料,并进行一对一指导,帮助学员高效学习和完成任务。我们的教学方法注重实践与理论结合,旨在培养学员的综合技术能力。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 本书《.NET Core 2.* 开发者指南》是面向开发者的全面学习与实践手册,涵盖了从基础到高级的各个层面。书中详细解析了 .NET Core 的核心概念,包括如何创建 .NET Core 网站,并通过视频教程直观展示操作过程。此外,还深入探讨了 Startup 类的作用、项目目录结构的组织方式以及如何在应用中使用静态文件等内容。对于希望深入了解 .NET Core 架构和开发技巧的开发者来说,本书提供了丰富的实践案例和详尽的技术指导。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
author-avatar
手机用户2602896463
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有