现在我们都知道SpringBoot整合的套路了吧,开箱即用,所以我们基本引入依赖,稍作配置就可以使用了。
下面我们简单的来看下SpringBoot和Redis的整合。
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置主机
spring:
redis:
host: 192.168.10.173
3.测试使用
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootCacheExamApplicationTests {
@Autowired
EmployeeMapper employeeMapper;
@Autowired
StringRedisTemplate stringRedisTemplate; //操作k-v都是字符串的
@Autowired
RedisTemplate<Object,Object> redisTemplate; //操作k-v都是对象的
@Test
public void test1(){//常用操作
stringRedisTemplate.opsForValue().append("msg","hello");
String msg = stringRedisTemplate.opsForValue().get("msg");
System.out.println(msg);
stringRedisTemplate.opsForValue().set("test", "100",60*10,TimeUnit.SECONDS);
stringRedisTemplate.boundValueOps("test").increment(-1);//val做-1操作
stringRedisTemplate.boundValueOps("test").increment(1);//val做+1操作
stringRedisTemplate.opsForValue().get("test");//根据key获取缓存中的val
stringRedisTemplate.getExpire("test");//根据key获取过期时间
stringRedisTemplate.getExpire("test",TimeUnit.SECONDS);//根据key获取过期时间并换算成指定单位
String str = stringRedisTemplate.opsForValue().get("test")+"___"+stringRedisTemplate.getExpire("test")+"___"+stringRedisTemplate.getExpire("test",TimeUnit.SECONDS);
System.out.println("test1: "+str);
stringRedisTemplate.delete("test");//根据key删除缓存
System.out.println("test2: "+stringRedisTemplate.opsForValue().get("test"));
System.out.println(stringRedisTemplate.hasKey("546545"));//检查key是否存在,返回boolean值
System.out.println(stringRedisTemplate.hasKey("msg"));
stringRedisTemplate.opsForList().rightPush("testlist","1");
stringRedisTemplate.opsForList().rightPush("testlist","2");
stringRedisTemplate.opsForList().rightPush("testlist", "A");
stringRedisTemplate.opsForList().rightPush("testlist", "B");
// leftPush依次由左边添加
stringRedisTemplate.opsForList().leftPush("testlist", "0");
stringRedisTemplate.opsForList().leftPush("testlist222", "0");
stringRedisTemplate.opsForSet().add("myset", "1","2","3");//向指定key中存放set集合
stringRedisTemplate.expire("myset",1000,TimeUnit.MILLISECONDS);//设置过期时间
System.out.println(stringRedisTemplate.opsForSet().isMember("myset", "1"));//根据key查看集合中是否存在指定数据
System.out.println(stringRedisTemplate.opsForSet().members("myset"));//根据key获取set集合
stringRedisTemplate.opsForHash().put("user:123456", "id","1");
stringRedisTemplate.opsForHash().put("user:123456", "name", "产品部");
stringRedisTemplate.opsForHash().put("user:1", "id","2");
stringRedisTemplate.opsForHash().put("user:1", "name", "技术部");
List<Object> keys = new ArrayList<Object>();
keys.add("name");
keys.add("id");
System.out.println(stringRedisTemplate.opsForHash().multiGet("user:1",keys));
}
//测试redisTemplate保存对象
@Test
public void test2(){
Employee emp = employeeMapper.getEmpById(1);
//如果保存对象,默认使用jdk序列化机制,序列化后的数据保存到redis中
//执行此句报错org.springframework.data.redis.serializer.SerializationException: Cannot serialize;`
redisTemplate.opsForValue().set("emp111",emp);
//解决办法: Employee实现序列化接口
//我们习惯存json格式,有两种实现方式
//(1)将对象转为json
//(2)自定义redisTemplate序列化规则;
}
3-1. 自定义redisTemplate序列化规则
@Configuration
public class RedisConfig {
// 自定义缓存key生成策略
@Bean
public KeyGenerator keyGenerator() {
@Bean
public RedisTemplate<Object, Object> redisTemplate(
RedisConnectionFactory factory) {
RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
3-2 .执行结果
4.测试缓存
4-1.缓存原理
我们之前用的是默认的缓存管理器:ConcurrentMapCacheManager,然后ConcurrentMapCacheManager会帮我们创建出缓存组件ConcurrentMapCache,ConcurrentMapCache来实现具体的CURD,给缓存中存取数据。那么我们加入了Redis以后会有什么变化呢?
我们可以看到此时我们的容器中保存的是 RedisCacheManager【默认是开启的SimpleCacheConfiguration】,然后RedisCacheManager 帮我们创建 RedisCache 来作为缓存组件;RedisCache来操作数据。
4-2 缓存测试
测试方法同上一篇博客:https://blog.csdn.net/try_try_try/article/details/80666185,
1.我们访问http://localhost:8080/emp/1来查询1号员工,控制台打印SQL,我们的Redis中已经缓存了1号员工的数据.
我们可以看到key=1,如果有多个对象就不太好区分了,我们可以通过自定义缓存管理器类设置一些所需要的规则。
@Primary //将某个缓存管理器作为默认的
@Bean
public RedisCacheManager myCacheManager(RedisTemplate<Object, Object> myRedisTemplate){
RedisCacheManager cacheManager = new RedisCacheManager(myRedisTemplate);
//使用前缀,默认会将CacheName作为key的前缀
cacheManager.setUsePrefix(true);
cacheManager.setDefaultExpiration(1800);
return cacheManager;
}
2.再次查询1号员工,控制台无输出。