SpringBoot重点详解--使⽤RedisTemplate操作Redis数据库⼀、Maven依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 引⼊ Redis 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 引⼊单元测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 接下来三个是jackson的依赖 -->
<dependency>
<groupId>com.</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.8</version>
</dependency>
</dependencies>
⼆、l配置
spring:
### 配置Redis
# Redis数据库索引(默认为0)
redis:
database: 0
# Redis服务器地址
host: 172.16.250.238
# Redis服务器连接端⼝
port: 6379
# Redis服务器连接密码(默认为空)
password: 123456
# 配置连接池
jedis:
pool:
# 连接池最⼤连接数(使⽤负值表⽰没有限制)
max-active: 8
# 连接池最⼤阻塞等待时间(使⽤负值表⽰没有限制)
max-wait: -1
# 连接池中的最⼤空闲连接
max-idle: 500
# 连接池中的最⼩空闲连接
min-idle: 0
# 连接超时时间(毫秒)
timeout: 2000
lettuce:
shutdown-timeout: 0
三、StringRedisTemplate与RedisTemplate测试
完成上述两个步骤之后,Springboot就会在应⽤启动时⾃动地为我们装配好StringRedisTemplate和RedisTemplate的Bean。下⾯写⼀个JUNIT来测试⼀下:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.st.context.SpringBootTest;
import t.ApplicationContext;
import org.tion.RedisConnectionFactory;
import org.RedisTemplate;
import org.StringRedisTemplate;
import st.context.junit4.SpringRunner;
import javax.annotation.Resource;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringRedisApplicationTests {
@Autowired
private ApplicationContext context;
@Resource
private RedisTemplate<String, Object> redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void RedisTemplateTest() {
System.out.println(redisTemplate);  // 结果: org.RedisTemplate@314c8b4a
redisTemplate.opsForValue().set("db-type", "redis");
System.out.println(redisTemplate.opsForValue().get("db-type")); // 结果: redis
}
@Test
public void StringRedisTemplateTest() {
System.out.println(stringRedisTemplate);  // 结果: org.RedisTemplate@314c8b4a
stringRedisTemplate.opsForValue().set("db-type", "mongodb");
System.out.println(stringRedisTemplate.opsForValue().get("db-type")); // 结果: mongodb
System.out.println(redisTemplate.opsForValue().get("db-type")); // 结果: redis
}
@Test
public void RedisConnectionFactoryTest() {
RedisConnectionFactory redisConnectionFactoryBean = Bean(RedisConnectionFactory.class);
System.out.println(redisConnectionFactoryBean); // 结果: org.tion.lettuce.LettuceConnectionFactory@59496961    }
}
需要知道的是:
1. StringRedisTemplate继承⾃RedisTemplate;
2. 从测试结果可以看出 StringRedisTemplate和RedisTemplate所管理的数据是相互独⽴的,对其中⼀个的数据进⾏修改并不会对另⼀个的数据产⽣影响。
3. SDR默认采⽤的序列化策略有两种,⼀种是String的序列化策略,⼀种是JDK的序列化策略。
StringRedisTemplate默认采⽤的是String的序列化策略,保存的key和value都是采⽤此策略序列化保存的。
RedisTemplate默认采⽤的是JDK的序列化策略,保存的key和value都是采⽤此策略序列化保存的。
四、⾃⼰创建RedisTemplate Bean
public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware {}
注意:如果没特殊情况,切勿定义成RedisTemplate<Object, Object>,否则根据⾥⽒替换原则,使⽤的时候会造成类型错误 。推荐定义成 RedisTemplate<String, Object>。
常见问题:在使⽤@Autowired注解装配RedisTemplate<String, Object>时由于泛型不匹配会出现如下错误:
Could not autowire. No beans of 'RedisTemplate<String, Object>' type found.
解决办法:改⽤ @Resource 注解(@Autowired根据类型装配Bean,@Resource根据名称进⾏装配)。
或者,⾃⼰定义⼀个RedisTemplate<String, Object> Bean,⽽不再让Spring为我们创建RedisTemplate<Object, Object> Bean。这样即使使⽤@Autowired注解也可以成功装配RedisTemplate<String, Object> Bean。
import com.fasterxml.jackson.annotation.JsonAutoDetect;
resource和autowired注解的区别import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import t.annotation.Bean;
import t.annotation.Configuration;
import org.tion.RedisConnectionFactory;
import org.RedisTemplate;
import org.dis.serializer.Jackson2JsonRedisSerializer;
import org.dis.serializer.StringRedisSerializer;
/**
* @author pengjunlee
* @create 2019-09-10 9:59
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采⽤String的序列化⽅式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采⽤String的序列化⽅式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化⽅式采⽤jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化⽅式采⽤jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
五、Redis⼯具类
将RedisTemplate的常⽤API封装成⼀个⼯具类RedisUtil.java。
import org.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Set;
import urrent.TimeUnit;
/**
* @author pengjunlee
* @create 2019-09-10 10:02
*/
@Component
public class RedisUtil {
@Resource
private RedisTemplate<String, Object> redisTemplate;
/**
* 指定缓存失效时间
*
* @param key
* @param time 时间(秒)
* @return
*/
public boolean expire(String key, long time) {
try {
if (time > 0) {
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据key 获取过期时间
*
* @param key
* @return 时间(秒) 返回0代表为永久有效
*/
public long getExpire(String key) {
Expire(key, TimeUnit.SECONDS);
}
/**
* @param key
* @return true 存在 false不存在
*/
public boolean hasKey(String key) {
try {
return redisTemplate.hasKey(key);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。