Spring Boot中Redis的配置与使用
安装
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置
application配置
单机模式
spring:
redis:
password: redis-password
port: 6379
host: localhost
database: 0
lettuce:
pool:
# 在给定时间池可以分配的最大连接数,使用负值表示没有限制。
max-active: 200
# 池中“空闲”连接的最大数量,使用负值表示无限数量的空闲连接。
max-idle: 50
# 当池耗尽时,在抛出异常之前连接分配应该阻塞的最长时间,使用负值无限期阻止
max-wait: 5s
# 池中要维护的最小空闲连接数的目标,此设置仅在为正值时才有效。
min-idle: 5
# 空闲对象退出线程的运行之间的时间。当为正时,空闲对象逐出线程启动,否则不执行空闲对象逐出
time-between-eviction-runs: 30s
timeout: 5s
集群模式+sentinel模式
以上为redis单机模式的常规配置,连接池配置视情况配置,以下为集群模式配置
spring:
redis:
password: redis-password
cluster:
#host:port,host:port,host:port
nodes: 127.0.0.1:6379,127.0.0.1:6380,127.0.0.1:6381
# 跨集群执行命令时要遵循的最大重定向数。
max-redirects: 3
database: 0
lettuce:
pool:
# 在给定时间池可以分配的最大连接数,使用负值表示没有限制。
max-active: 200
# 池中“空闲”连接的最大数量,使用负值表示无限数量的空闲连接。
max-idle: 50
# 当池耗尽时,在抛出异常之前连接分配应该阻塞的最长时间,使用负值无限期阻止
max-wait: 5s
# 池中要维护的最小空闲连接数的目标,此设置仅在为正值时才有效。
min-idle: 5
# 空闲对象退出线程的运行之间的时间。当为正时,空闲对象逐出线程启动,否则不执行空闲对象逐出
time-between-eviction-runs: 30s
timeout: 5s
#-------------sentinel模式与cluster模式不同时使用-------------#
sentinel:
# Redis 服务器的名称。
master: sentinel-master
#host:port,host:port,host:port
nodes: 127.0.0.1:6379,127.0.0.1:6380,127.0.0.1:6381
序列化配置
序列化配置一般针对使用RedisTemplate
的或者自定义的项目,StringRedisTemplate
的序列化全部使用的是String
方式序列化,一般使用StringRedisTemplate
的也不会再去配置,因为字符串序列化就已经是最快的序列化方式了。
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(RedisSerializer.string());
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
jackson2JsonRedisSerializer.setObjectMapper(new ObjectMapper()
.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY)
.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL));
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
@Autowired
private RedisTemplate<String, Object> redisTemplate;
}
Redis操作工具类
提供一个工具类,这个工具类并不是很全面但是都是比较常用的操作,有需要还可以自行添加。
@Configuration
@Slf4j
public class RedisUtil {
@Autowired
private StringRedisTemplate redisTemplate;
/**
* 用于隔开缓存前缀与缓存键值
*/
private static final String KEY_SPLIT = "-";
/**
* 设置缓存
*
* @param key 缓存key
* @param value 缓存value
*/
public void set(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}
/**
* 设置缓存
*
* @param prefix 缓存前缀(用于区分缓存,防止缓存键值重复)
* @param key 缓存key
* @param value 缓存value
*/
public void set(String prefix, String key, String value) {
set(prefix + KEY_SPLIT + key, value);
}
/**
* 设置缓存,并且自己指定过期时间
*
* @param key key
* @param value value
* @param expireTime 过期时间(秒)
*/
public void set(String key, String value, int expireTime) {
redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.SECONDS);
}
/**
* 设置缓存,并且自己指定过期时间
*
* @param prefix key前缀
* @param key key
* @param value value
* @param expireTime 过期时间(秒)
*/
public void set(String prefix, String key, String value, int expireTime) {
set(prefix + KEY_SPLIT + key, value, expireTime);
}
/**
* 获取指定key的缓存
*
* @param prefix key前缀
* @param key key
* @return string value
*/
public String get(String prefix, String key) {
return get(prefix + KEY_SPLIT + key);
}
/**
* 获取指定key的缓存
*
* @param key key
*/
public String get(String key) {
return redisTemplate.opsForValue().get(key);
}
/**
* 1、根据指定key获取value,如果获取到key直接返回value
* 2、如果key不存在,设置key的值为vluae
*
* @param key key
* @param value value
* @return string value
*/
public String getset(String key, String value) {
Optional<Boolean> isExists = Optional.ofNullable(redisTemplate.opsForSet().isMember(key, value));
if (isExists.isPresent()) {
return value;
}
redisTemplate.opsForSet().add(key, value);
return value;
}
/**
* 设置指定key的过期时间
*
* @param key key
* @param seconds 秒
*/
public Boolean expire(String key, int seconds) {
return redisTemplate.expire(key, seconds, TimeUnit.SECONDS);
}
/**
* 删除指定key的缓存
*
* @param prefix key前缀
* @param key key
*/
public void deleteWithPrefix(String prefix, String key) {
delete(prefix + KEY_SPLIT + key);
}
/**
* 删除一个key
*
* @param key key
*/
public void delete(String key) {
redisTemplate.delete(key);
}
/**
* 删除多个key
*
* @param keyPrefix key的前缀
*/
public void delKeys(String keyPrefix) {
Set<String> stringSet = redisTemplate.keys(keyPrefix + "*");
Optional.ofNullable(stringSet).ifPresent(x -> {
redisTemplate.delete(stringSet);
});
}
/**
* 在HashKey中设置值
*
* @param key key
* @param field hashKey
* @param value value
*/
public void hashSet(String key, String field, String value) {
redisTemplate.opsForHash().put(key, field, value);
}
/**
* 从HashKey中获取字符串值
*
* @param key key
* @param field hashKey
* @return string value
*/
public String hashGet(String key, String field) {
return (String) redisTemplate.opsForHash().get(key, field);
}
}