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

目录

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=0;i<10;i++){
    User user = new User();
    user.setUsername(“鲁智深菜园子”+i);
    user.setPassword(“123456”);
    userRepository.save(user);
    }
    }

}

下面将分别测试代码。

5、测试代码

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

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

在这里插入图片描述

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

测试@Cacheable注解的缓存(将方法的返回值进行缓存)

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

测试@CachePut注解的缓存(调用方法后更新缓存)

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

测试@CacheEvict 注解的缓存(清除缓存)

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

如果你想搭建该测试案例,你需要做的是:

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

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

发布了0 篇原创文章 · 获赞 0 · 访问量 179

猜你喜欢

转载自blog.csdn.net/qq_41490913/article/details/104878074