SpringCloud+SpringBoot 项目搭建 (二) Redis
本篇文章接上一篇:SpringCloud+SpringBoot 项目搭建 (一) Eureka
SpringCloud+SpringBoot 项目搭建 (二) Redis
配置环境
版本环境:
redis:3.2.1
添加pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
配置文件properties
#redis 通用配置
spring.redis.database=7
spring.redis.lettuce.pool.max-wait=100000
spring.redis.lettuce.pool.max-idle=10
spring.redis.lettuce.pool.max-active=100
spring.redis.timeout=5000
#redis集群配置
#spring.redis.cluster.nodes= localhost:6379,127.0.0.1:6379,192.168.1.7:6379
#spring.redis.cluster.max-redirects=3
#redis单机配置
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=dongyue
配置RedisConfig
@Configuration
@EnableAutoConfiguration
public class RedisConfig {
@Bean
public KeyGenerator keyGenerator() {
return (target, method, params) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
};
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
//初始化一个RedisCacheWriter
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
//设置CacheManager的值序列化方式为json序列化
RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair.fromSerializer(jsonSerializer);
RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair);
//设置默认超过时期是1天
defaultCacheConfig.entryTtl(Duration.ofDays(1));
//初始化RedisCacheManager
return new RedisCacheManager(redisCacheWriter, defaultCacheConfig);
}
@Bean
public StringRedisSerializer stringRedisSerializer() {
return new StringRedisSerializer();
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setKeySerializer(stringRedisSerializer());
template.afterPropertiesSet();
return template;
}
}
上面代码使用了jackson做序列化所以需要引入jackjson
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
简单封装redis
public interface RedisService {
/**
* Gets key.
*
* @param key the key
*
* @return the key
*/
String getKey(String key);
/**
* Delete key.
*
* @param key the key
*/
void deleteKey(String key);
/**
* Sets key.
*
* @param key the key
* @param value the value
*/
void setKey(String key, String value);
/**
* Sets key.
*
* @param key the key
* @param value the value
* @param timeout the timeout
* @param unit the unit
*/
void setKey(String key, String value, final long timeout, final TimeUnit unit);
}
@Slf4j
@Service
public class RedisServiceImpl implements RedisService {
@Resource
private StringRedisTemplate rt;
@Override
public String getKey(String key) {
String value = null;
ValueOperations<String, String> ops = rt.opsForValue();
if (rt.hasKey(key)) {
value = ops.get(key);
}
log.info("getKey. [OK] key={}, value={}", key, value);
return value;
}
@Override
public void deleteKey(String key) {
rt.delete(key);
log.info("deleteKey. [OK] key={}", key);
}
@Override
public void setKey(String key, String value) {
Preconditions.checkArgument(StringUtils.isNotEmpty(key), "Redis key is not null");
ValueOperations<String, String> ops = rt.opsForValue();
ops.set(key, value);
rt.expire(key, GlobalConstant.REDIS_DEFAULT_EXPIRE, TimeUnit.MINUTES);
log.info("setKey. [OK] key={}, value={}, expire=默认超时时间", key, value);
}
@Override
public void setKey(String key, String value, long timeout, TimeUnit unit) {
Preconditions.checkArgument(StringUtils.isNotEmpty(key), "Redis key is not null");
Preconditions.checkArgument(unit != null, "TimeUnit is not null");
ValueOperations<String, String> ops = rt.opsForValue();
ops.set(key, value);
rt.expire(key, timeout, unit);
log.info("setKey. [OK] key={}, value={}, timeout={}, unit={}", key, value, timeout, unit);
}
}
测试效果
项目目录:
至此redis集成完毕
下一篇:SpringCloud+SpringBoot 项目搭建 (三) MyBatis-Push