应用场景:
红包24小时内有效,代金券过期等问题。
springboot整合redis:
pom.xml引入依赖:
<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>
配置类config:
import xx.utils.JsonUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import javax.annotation.Resource;
@Configuration
public class RedisConfig {
@Resource
RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisMessageListenerContainer messageListenerContainer() {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(redisConnectionFactory);
return container;
}
@Bean
public RedisTemplate<String, Object> dataPointRedisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
jackson2JsonRedisSerializer.setObjectMapper(JsonUtils.getObjectMapper());
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//序列化设置 ,这样计算是正常显示的数据,也能正常存储和获取
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
return redisTemplate;
}
}
JsonUtils类:
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import java.text.SimpleDateFormat;
/**
* json序列化和反序列号类
*/
@Slf4j
public class JsonUtils {
private static ObjectMapper objectMapper;
static {
getObjectMapper();
}
public static ObjectMapper getObjectMapper() {
if(objectMapper == null) {
synchronized (JsonUtils.class) {
if(objectMapper == null) {
objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
objectMapper.registerModule(new JavaTimeModule());
objectMapper.registerModule(new Jdk8Module());
objectMapper.registerModule(new ParameterNamesModule());
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
}
}
}
return objectMapper;
}
/**
* 对象转json字符串
* @param t
* @return
*/
public static String toJsonString(Object t) {
if (t == null) {
return null;
} else {
try {
return objectMapper.writeValueAsString(t);
} catch (Exception e) {
log.error("beanToString转换失败", e);
}
}
return null;
}
/**
* json字符串转对象
* @param json
* @param clazz
* @param <T>
* @return
*/
public static <T> T toBean(String json, Class<T> clazz) {
if (StringUtils.isEmpty(json)) {
return null;
} else {
try {
return objectMapper.readValue(json, clazz);
} catch (Exception e) {
log.error("stringToBean转换失败", e);
}
}
return null;
}
}
key失效监听处理类:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;
@Component
public class RedisKeyFailListener extends KeyExpirationEventMessageListener {
@Autowired
private RedisTemplate<String,String> redisTemplate;
public RedisKeyFailListener(RedisMessageListenerContainer redisMessageListenerContainer) {
super(redisMessageListenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
String key = message.toString();
if (key.startsWith("diudiudiu")) {
System.out.println("-----------------------------");
System.out.println(key + "失效了");
System.out.println("-----------------------------");
//业务处理
}
}
}
redis数值的写入,10秒过期:
redisTemplate.opsForValue().set("diudiudiu-----------","xxxxxxxxxxxxx",10, TimeUnit.SECONDS);
SpringBoot整合Redis实践
本文详细介绍了如何在SpringBoot项目中整合Redis,并实现键值过期监听,包括配置类、序列化工具及监听处理类的代码示例。
902

被折叠的 条评论
为什么被折叠?



