目录
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地址 与 密码。