参考:https://docs.spring.io/spring-boot/docs/1.5.17.RELEASE/reference/htmlsingle/#boot-features-nosql
SpringBoot Data提供了其他项目帮助访问各种NoSQL技术,包括MongoDB,Neo4J,Elasticsearch,Solr,Redis,Gemfire,Cassandra,Couchbase和LDAP。Spring Boot为Redis,MongoDB,Neo4j,Elasticsearch,Solr Cassandra,Couchbase和LDAP提供自动配置; 也可以使用其他项目,但需要自己配置它们。 请参阅projects.spring.io/spring-data上的相应参考文档。
Redis
1. 简介
Redis是一个缓存,消息代理和功能丰富的键值存储。 Spring Boot为Jedis客户端库提供基本的自动配置,并在Spring Data Redis提供的基础上提供抽象。 有一个spring-boot-starter-data-redis的'Starter'用于以方便的方式收集依赖项。
2. 连接Redis
可以像注入任何其他Spring Bean一样注入自动配置的RedisConnectionFactory,StringRedisTemplate或vanilla RedisTemplate实例。 默认情况下,实例将尝试使用localhost:6379连接到Redis服务器:
@Component
public class MyBean {
@Autowired
private StringRedisTemplate template;
}
如果你自己添加任何自动配置类型的@Bean,它将替换默认值(除了RedisTemplate,排除是基于bean名称'redisTemplate'而不是它的类型).如果commons-pool2在类路径上,则默认情况下将获得池连接工厂。
3. 示例
确保已经安装好redis,以单机版为例:
pom.xml添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
方式一:借助SpringBoot的自动配置
1. application.yml配置:
配置连接redis的host、端口、密码等,借助SpringBoot的自动配置,自动注册JedisConnectionFactory、RedisTemplate
spring:
redis:
host: redis01.momo.com
port: 6379
# redis密码,默认为空
password: redis
# redis分片,默认值0(redis默认有16个分片,0-15)
database: 0
pool:
# 连接池最大连接数,默认值8(负数表示没有限制)
max-active: 8
# 连接最大等待时间(负数表示没有限制)
max-wait: -1
# 连接池中的最大空闲连接
max-idle: 8
# 连接池中的最小空闲连接
min-idle: 0
# 连接超时时间(毫秒)
timeout: 10000
2. 测试
无需其他配置,即可连接redis进行操作。
@RunWith(SpringRunner.class)
@SpringBootTest
public class DefaultRedisTest {
// @Autowired
// private RedisTemplate<String, String> redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void testOpsForValueSet() {
stringRedisTemplate.opsForValue().set("default-name", "小明");
}
@Test
public void testOpsForValueGet() {
String name = stringRedisTemplate.opsForValue().get("default-name");
System.out.println(name);
}
}
方式二:手动配置
1. src/main/resources/config目录下定义redis.properties
# redis config
# redis
redis.host=redis01.momo.com
redis.port=6379
redis.password=redis
redis.database=0
redis.timeout=10000
#redis.usePool=true
# redis pool
redis.maxTotal=100
redis.maxIdle=20
redis.minIdl=0
redis.maxWaitMillis=1000
#redis.testOnBorrow=true
redis.defaultCacheExpireTime=7200
2. 配置类
@Component
@ConfigurationProperties(prefix = "redis")
@PropertySource("classpath:config/redis.properties")
public class RedisProperties {
private String host;
private int port;
private String password;
private int database;
private int timeout;
private boolean usePool;
private int maxTotal;
private int maxIdle;
private int minIdle;
private long maxWaitMillis;
private boolean testOnBorrow;
private long defaultCacheExpireTime;
// getter setter略
}
3. 自定义RedisTemplate
相关说明见注释
@Configuration
public class SpringRedisConfig {
@Autowired
private RedisProperties redisProperties;
// @Autowired
// private RedisConnectionFactory connectionFactory;
/**
* redis配置
*
* @return
*/
@Bean
public JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(redisProperties.getMaxTotal());
jedisPoolConfig.setMaxIdle(redisProperties.getMaxIdle());
jedisPoolConfig.setMinIdle(redisProperties.getMinIdle());
jedisPoolConfig.setMaxWaitMillis(redisProperties.getMaxWaitMillis());
jedisPoolConfig.setTestOnBorrow(true);
return jedisPoolConfig;
}
/**
* redis连接工厂
*
* @return
*/
@Bean
public JedisConnectionFactory connectionFactory() {
JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
connectionFactory.setPoolConfig(jedisPoolConfig());
connectionFactory.setHostName(redisProperties.getHost());
connectionFactory.setPort(redisProperties.getPort());
connectionFactory.setPassword(redisProperties.getPassword());
connectionFactory.setDatabase(redisProperties.getDatabase());
connectionFactory.setTimeout(redisProperties.getTimeout());
connectionFactory.setUsePool(true);
return connectionFactory;
}
/**
* 实例化RedisTemplate对象
*/
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
initRedisTemplate(redisTemplate, connectionFactory());
return redisTemplate;
}
/**
* 设置key、value存入redis的序列化方式
*
* @param redisTemplate
* @param connectionFactory
*/
private void initRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory connectionFactory) {
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
}
}
4. 测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class CustomRedisTest {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Test
public void testOpsForValueSet() {
redisTemplate.opsForValue().set("name", "小明");
}
@Test
public void testOpsForValueGet() {
String value = (String) redisTemplate.opsForValue().get("name");
System.out.println(value);
}
}