开发中通常会使用缓存中间件:redis、memcached、ehcache.
redis可以用作数据库、缓存和消息中间件,本文中使用redis作为缓存
一、安装redis
1、docker中安装redis:
sudo docker pull redis
2、启动redis并映射端口
sudo docker run -d -p 6379:6379 --name myredis 镜像名
映射容器服务的 6379 端口到宿主机的 6379 端口。外部可以直接通过宿主机ip:6379 访问到 Redis 的服务
3、windows中安装
4、连接虚拟机
右击redis打开控制台console可以输入命令
二、配置redis
1、pom.xml中引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、application.properties中配置
#连接虚拟机中的redis
spring.redis.host=192.168.0.103
spring.redis.port=6379
3、在测试中注入redis操作的模板:
@Autowired
StringRedisTemplate stringRedisTemplate; //模板:操作key-value都是字符串
@Autowired
RedisTemplate redisTemplate; //模板:操作key-value,都是对象
模板中的方法:
/**
* Redis常见的五大数据类型
* String(字符串)、List(列表)、Set(集合)、Hash(散列)、ZSet(有序集合)
* stringRedisTemplate.opsForValue() [操作String 字符串的]
* stringRedisTemplate.opsForList() [List(列表)]
* stringRedisTemplate.opsForSet()
* stringRedisTemplate.opsForHash()
* stringRedisTemplate.opsForZSet()
* redisTemplate.opsForValue() //两个模板使用方法都一样
*
*/
4、测试用例:
在redis中添加字符串key-value
@Test
public void test01() {
//给redis中保存数据
stringRedisTemplate.opsForValue().append("msg", "hello");
//String str=stringRedisTemplate.opsForValue().get("msg");
//System.out.println(str);
}
5、测试例子:利用RedisTemplate类模板的实例保存对象object
注意:保存的对象employee需要是一个可序列化的类,默认如果保存对象,使用jdk序列化机制,序列化后的数据保存到redis中,如下图所示:
@Test
public void test02() {
//给redis中保存对象
Employee employee=employeemapper.getEmpById(2);
redisTemplate.opsForValue().set("emp-01", employee); //需要一个可序列化的类
}
@Test
void contextLoads() {
Employee employee=employeemapper.getEmpById(2);
System.out.println(employee);
}
在Employee类中继承序列化(Serializable)接口:
6、改变默认的序列化规则(不使用默认的jdk序列化机制)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Primary;
//import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
//import springboot.bean.Department;
import springboot.bean.Employee;
import java.net.UnknownHostException;
@Configuration
public class MyRedisConfig {
@Bean //注入模板到容器
public RedisTemplate<Object, Employee> empRedisTemplate(
RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Employee> template = new RedisTemplate<Object, Employee>();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer<Employee> ser = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
template.setDefaultSerializer(ser);
return template;
}
}
在测试中注入模板
@Autowired
RedisTemplate<Object, Employee> empRedisTemplate;
利用该模板保存对象:
@Test
public void test02() {
//给redis中保存对象
Employee employee=employeemapper.getEmpById(2);
empRedisTemplate.opsForValue().set("emp-01", employee); //需要一个可序列化的类
}
可以直接保存对象
三、测试缓存
缓存的原理:缓存管理器CacheManager–>创建出缓存组件Cache,缓存组件Cache来实际给缓存中CRUD(增删改查)数据
1、引入redis的starter后,容器中保存的是RedisCacheManager
2、RedisCacheManager创建RedisCache作为缓存组件;RedisCache通过操作redis缓存数据
(默认配置类使用SimpleCacheConfiguration,配置完redis后使用的配置类为RedisCacheConfiguration,缓存管理器使用RedisCacheManager)
3、redis中添加缓存,默认保存数据的key-value都是Object,利用序列化保存.如何将保存在缓存中的对象保存为json:
(下图为浏览器中查询2号员工:http://localhost:8080/emp/2
后的redis中缓存的数据)
- 引入了redis的starter,cacheManager变为RedisCacheManager
- 默认创建的RedisCacheManager操作redis的时候使用的是RedisTemplate<Object,Object>
- RedisTemplate<Object,Object>是默认使用jdk序列化机制(所以都是乱码)
4、自定义CacheManager
未完…
来源:CSDN
作者:yh_1021
链接:https://blog.csdn.net/yh_1021/article/details/104468705