- 搭建redis环境
参考使用docker搭建redis - 引入redis
从
RedisCacheConfiguration
中可以看出如果需要使用redis则需要引入redis的jar包,因为springBoot默认使用的缓存是SimpleCacheConfiguration
<!--引入redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置redis
spring.redis.host=192.168.0.104
spring.redis.password=wasd753951..
spring.redis.port=6380
- 使用
引入redis后通过
RedisAutoConfiguration
中可以看到,redis给我们提供了两个类
1). RedisTemplate<Object, Object> redisTemplate
2). StringRedisTemplate stringRedisTemplate
所以使用的时候我们只需要注入对应的类即可
例如:
@Resource
StringRedisTemplate stringRedisTemplate; //简化操作k-v都是字符串的
@Resource
RedisTemplate redisTemplate; //k-v均是对象的
/**
* redis常见的5大类型
* String(字符串)
* stringRedisTemplate.opsForValue()
* List(列表)
* stringRedisTemplate.opsForList()
* Set(集合)
* stringRedisTemplate.opsForSet()
* Hash(散列)
* stringRedisTemplate.opsForHash()
* ZSet(有序集合)
* stringRedisTemplate.opsForZSet()
*/
@Test
void contextLoads() {
stringRedisTemplate.opsForValue().append("a", "like");
System.out.println(stringRedisTemplate.opsForValue().get("a"));
}
- redis常见的5大类型
- String(字符串)
stringRedisTemplate.opsForValue()
- List(列表)
stringRedisTemplate.opsForList()
- Set(集合)
stringRedisTemplate.opsForSet()
- Hash(散列)
stringRedisTemplate.opsForHash()
- ZSet(有序集合)
stringRedisTemplate.opsForZSet()
保存对象
- 首先需要给保存的对象进行序列化
默认保存对象使用的是jdk的序列化机制,将序列化后的内容保存至redis中
使用json格式将数据保存至redis中
1). 自己将数据转换为json保存,市面上有很多的json转化工具
2). RedisTemplate默认的序列化规则
3). 所以修改默认的序列化规则即可(两种方式1. 直接使用object的方式2.将需要转换的实体传入)
package com.saikie.springbootredis.config;
import com.saikie.springbootredis.bean.TestBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
@Configuration
public class MyRedisConfig {
@Bean
public RedisTemplate<Object, Object> myRedisTemplate(
RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
template.setConnectionFactory(redisConnectionFactory);
return template;
}
// @Bean
// public RedisTemplate<Object, TestBean> myRedisTemplate(
// RedisConnectionFactory redisConnectionFactory) {
// RedisTemplate<Object, TestBean> template = new RedisTemplate<Object, TestBean>();
// template.setDefaultSerializer(new Jackson2JsonRedisSerializer<TestBean>(TestBean.class));
// template.setConnectionFactory(redisConnectionFactory);
// return template;
// }
}
- 使用
@Resource
RedisTemplate<Object, Object> myRedisTemplate;
// RedisTemplate<Object, TestBean> myRedisTemplate;
@Test
void contextLoads() {
TestBean testBean = new TestBean();
testBean.setName("aaa");
testBean.setAge("12");
testBean.setSex("1");
myRedisTemplate.opsForValue().set("test-01", testBean);
System.out.println(myRedisTemplate.opsForValue().get("test-01").toString());
}
- 测试缓存
- 原理
-
CacheManager 获取 Cache 缓存组件来实际给缓存中存取数据
1). 引入redis的starter,容器中保存的是 RedisCacheManager
2). RedisCacheManager 帮我们创建RedisCache来做为缓存组件,RedisCache 通过操作redis缓存数据
3). CacheManager默认使用jdk的序列化方式,所以我们需要自定义CacheManager
-
- 原理
@Bean
public RedisCacheManager getRedisCacheManager(RedisTemplate<Object, Object> myRedisTemplate) {
RedisCacheManager redisCacheManager = new RedisCacheManager(myRedisTemplate);
// 使用前缀,默认会将CacheName做为key的前缀
redisCacheManager.setUsePrefix(true);
return redisCacheManager;
}
如果传入的参数的value是具体的实体的时候,这个时候如果多个实体,则需要创建多个RedisCacheManager并且需要指定一个默认的RedisCacheManager,一般指定redis自己的默认RedisCacheManager为Primary,使用
@Primary
来指定
然后在调用方在类上或方法上指定用哪个RedisCacheManager,例如:方法上的@Cacheable(cacheNames="test", cacheManager="getRedisCacheManager")