redis---失效key的监听操作

SpringBoot整合Redis实践
本文详细介绍了如何在SpringBoot项目中整合Redis,并实现键值过期监听,包括配置类、序列化工具及监听处理类的代码示例。

应用场景:

红包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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值