本次记录spring boot 整合redis的配置
1. 引入redis和jedis依赖包
<!-- redis依赖和jedis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
2. 环境配置
applicaltion.yml
# redis配置
redis:
host: XX.XX.XX.XX
port: XXXX
database: 0 #数据库索引
timeout: 60000 #连接超时
password: XXXXXXX #口令
pool:
maxActive: 300 #最大连接数
maxWait: -1 #最大等待时间
maxIdle: 30
minIdle: 10
testOnBorrow: true #连接时检查
testWhileIdle: true #空闲时检查
3. config配置
import java.time.Duration;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import redis.clients.jedis.JedisPoolConfig;
/**
* @Title: redis配置
* @Description:
* @author zch
* @date 2019年6月26日 下午2:50:28
*/
@Configuration
@EnableCaching
@EnableAutoConfiguration
public class RedisConfiguration
{
// redis地址ip
@Value("${redis.host}")
private String host;
// 端口
@Value("${redis.port}")
private int port;
// redis口令
@Value("${redis.password}")
private String password;
// 索引
@Value("${redis.database}")
private int database;
// 连接超时
@Value("${redis.timeout}")
private int timeout;
// 最大 连接数
@Value("${redis.pool.maxActive}")
private int maxActive;
// 最大等待时间
@Value("${redis.pool.maxWait}")
private long maxWait;
// 最大空闲连接数
@Value("${redis.pool.maxIdle}")
private int maxIdle;
// 最小空闲连接数
@Value("${redis.pool.minIdle}")
private int minIdle;
// 连接时测试
@Value("${redis.pool.testOnBorrow}")
private boolean testOnBorrow;
// 空闲时测试
@Value("${redis.pool.testWhileIdle}")
private boolean testWhileIdle;
/**
* @Title: 连接池
* @Description:
* @author zch
* @date 2019年6月26日 下午3:22:40
*/
@Bean
public JedisPoolConfig jedisPoolConfig()
{
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMaxTotal(maxActive);
jedisPoolConfig.setMaxWaitMillis(maxWait);
jedisPoolConfig.setMinIdle(minIdle);
jedisPoolConfig.setTestOnBorrow(testOnBorrow);
jedisPoolConfig.setTestWhileIdle(testWhileIdle);
return jedisPoolConfig;
}
/**
* @Title: 连接工厂
* @Description:
* @author zch
* @date 2019年6月26日 下午2:51:38
*/
@SuppressWarnings("deprecation")
@Bean
public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig)
{
JedisClientConfiguration.JedisClientConfigurationBuilder jedisClientConfigurationBuilder = JedisClientConfiguration
.builder();
jedisClientConfigurationBuilder.readTimeout(Duration.ofMillis(timeout));// 读取超时单位毫秒
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setDatabase(database);
jedisConnectionFactory.setHostName(host);
jedisConnectionFactory.setPassword(password);
jedisConnectionFactory.setPort(port);
jedisConnectionFactory.setPoolConfig(jedisPoolConfig);
return jedisConnectionFactory;
}
/**
* @Title: 对象操作
* @Description: 操作对象类型数据
* @author zch
* @date 2019年6月26日 下午2:51:55
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory)
{
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(
Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setConnectionFactory(jedisConnectionFactory);
// key序列化方式
template.setKeySerializer(redisSerializer);
// value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
// value hashmap序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);
// 自行百度查找更完善的序列化设置
return template;
}
/**
* @Title: 字符串操作
* @Description: 操作字符串类型数据
* @author zch
* @date 2019年6月26日 下午2:52:09
*/
@Bean
public StringRedisTemplate stringRedisTemplate(JedisConnectionFactory jedisConnectionFactory)
{
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(jedisConnectionFactory);
return stringRedisTemplate;
}
}
4. 使用RedisTemplate和StringRedisTemplate进行操作
注入使用
RedisTemplate对5种数据结构的操作
redisTemplate.opsForValue(); //操作字符串
redisTemplate.opsForHash(); //操作hash
redisTemplate.opsForList(); //操作list
redisTemplate.opsForSet(); //操作set
redisTemplate.opsForZSet(); //操作有序set
stringRedisTemplate.opsForValue().set("test", "100",60*10,TimeUnit.SECONDS);//向redis里存入数据和设置缓存时间
stringRedisTemplate.boundValueOps("test").increment(-1);//val做-1操作
stringRedisTemplate.opsForValue().get("test")//根据key获取缓存中的val
stringRedisTemplate.boundValueOps("test").increment(1);//val +1
stringRedisTemplate.getExpire("test")//根据key获取过期时间
stringRedisTemplate.getExpire("test",TimeUnit.SECONDS)//根据key获取过期时间并换算成指定单位
stringRedisTemplate.delete("test");//根据key删除缓存
stringRedisTemplate.hasKey("546545");//检查key是否存在,返回boolean值
stringRedisTemplate.opsForSet().add("red_123", "1","2","3");//向指定key中存放set集合
stringRedisTemplate.expire("red_123",1000 , TimeUnit.MILLISECONDS);//设置过期时间
stringRedisTemplate.opsForSet().isMember("red_123", "1")//根据key查看集合中是否存在指定数据
stringRedisTemplate.opsForSet().members("red_123");//根据key获取set集合
补充:
应业务场景要求,配置多数据库的redis
使用@Bean( name = "xxxx")区分多个RedisTemplate
@Bean(name = "xxxxRedisTemplate")
public RedisTemplate<String, Object> dataRedisTemplate(JedisPoolConfig jedisPoolConfig)
{
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setDatabase(database);
jedisConnectionFactory.setHostName(host);
jedisConnectionFactory.setPassword(password);
jedisConnectionFactory.setPort(port);
jedisConnectionFactory.setTimeout(timeout);
jedisConnectionFactory.setPoolConfig(jedisPoolConfig);
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(
Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setConnectionFactory(jedisConnectionFactory);
// key序列化方式
template.setKeySerializer(redisSerializer);
// value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
// value hashmap序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}