日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

RedisTemplate無(wú)法根據(jù)key 獲取值的問(wèn)題

作者:神筆碼靚 更新時(shí)間: 2022-07-13 編程語(yǔ)言

說(shuō)明

最近的項(xiàng)目中用到了兩個(gè)定時(shí)任務(wù),一個(gè)用于處理數(shù)據(jù)的一階段處理,處理后的數(shù)據(jù)存入redis中,等待第二個(gè)任務(wù)運(yùn)行,做第二階段的處理。兩個(gè)任務(wù)之間通過(guò)zSet中存儲(chǔ)的id值關(guān)聯(lián)。
奇怪的是第一個(gè)任務(wù)可以正常存儲(chǔ)主鍵ID 到zSet 中,但第二個(gè)任務(wù)通過(guò)key 獲取zSet中的值時(shí),返回結(jié)果為空。

存值代碼:


@Resource(name = "stringRedisTemplate")
private RedisTemplate<String, String> redisTemplate;

private void setKey(){
	redisTemplate.opsForZSet().add(CscConstants.TASK_KEY, monitorTask.getTaskNo(), monitorTask.getTaskEndTime().getTime());
}

取值代碼


@Autowired
private RedisTemplate<String, String> redisTemplate;

private void setKey(){
	Set<String> taskNoSet = redisTemplate.opsForZSet().rangeByScore(CscConstants.TASK_KEY, 0, System.currentTimeMillis());
}

原因說(shuō)明

在spring 容器中,存在兩個(gè)RedisTemplate :


@Configuration
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
    public RedisAutoConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean(
        name = {"redisTemplate"}
    )
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    @Bean
    @ConditionalOnMissingBean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

名稱(chēng)為 redisTemplate 的bean 內(nèi)部 使用 JdkSerializationRedisSerializer 序列化 key和vaue。
名稱(chēng)為 stringRedisTemplate 的bean 內(nèi)部使用 RedisSerializer 序列化 key 和value。

public RedisTemplate() {
    }

    public void afterPropertiesSet() {
        super.afterPropertiesSet();
        boolean defaultUsed = false;
        if (this.defaultSerializer == null) {
            this.defaultSerializer = new JdkSerializationRedisSerializer(this.classLoader != null ? this.classLoader : this.getClass().getClassLoader());
        }

        if (this.enableDefaultSerializer) {
            if (this.keySerializer == null) {
                this.keySerializer = this.defaultSerializer;
                defaultUsed = true;
            }

            if (this.valueSerializer == null) {
                this.valueSerializer = this.defaultSerializer;
                defaultUsed = true;
            }

            if (this.hashKeySerializer == null) {
                this.hashKeySerializer = this.defaultSerializer;
                defaultUsed = true;
            }

            if (this.hashValueSerializer == null) {
                this.hashValueSerializer = this.defaultSerializer;
                defaultUsed = true;
            }
        }

        if (this.enableDefaultSerializer && defaultUsed) {
            Assert.notNull(this.defaultSerializer, "default serializer null and not all serializers initialized");
        }

        if (this.scriptExecutor == null) {
            this.scriptExecutor = new DefaultScriptExecutor(this);
        }

        this.initialized = true;
    }


public class StringRedisTemplate extends RedisTemplate<String, String> {
    public StringRedisTemplate() {
        this.setKeySerializer(RedisSerializer.string());
        this.setValueSerializer(RedisSerializer.string());
        this.setHashKeySerializer(RedisSerializer.string());
        this.setHashValueSerializer(RedisSerializer.string());
    }

    public StringRedisTemplate(RedisConnectionFactory connectionFactory) {
        this();
        this.setConnectionFactory(connectionFactory);
        this.afterPropertiesSet();
    }

    protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {
        return new DefaultStringRedisConnection(connection);
    }
}

在使用redisTemplate 實(shí)列,如果取數(shù)據(jù)失敗,很有可能是存值和取值時(shí)使用不同的redisTemplate 實(shí)列。 @Resource(name = “stringRedisTemplate”)

原文鏈接:https://blog.csdn.net/daxues_/article/details/125664523

欄目分類(lèi)
最近更新