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即是服务器安装redisIP地址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地址 与 密码。

回复获取资源

关注后回复 缓存 

获取SpringBoot整合Redis的资源

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值