網站首頁 編程語言 正文
說明
最近的項目中用到了兩個定時任務,一個用于處理數據的一階段處理,處理后的數據存入redis中,等待第二個任務運行,做第二階段的處理。兩個任務之間通過zSet中存儲的id值關聯。
奇怪的是第一個任務可以正常存儲主鍵ID 到zSet 中,但第二個任務通過key 獲取zSet中的值時,返回結果為空。
存值代碼:
@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());
}
原因說明
在spring 容器中,存在兩個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;
}
}
名稱為 redisTemplate 的bean 內部 使用 JdkSerializationRedisSerializer 序列化 key和vaue。
名稱為 stringRedisTemplate 的bean 內部使用 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 實列,如果取數據失敗,很有可能是存值和取值時使用不同的redisTemplate 實列。 @Resource(name = “stringRedisTemplate”)
原文鏈接:https://blog.csdn.net/daxues_/article/details/125664523
相關推薦
- 2021-11-28 jQuery實現全部購物車功能實例_jquery
- 2023-11-26 (有效解決)Android Studio 運行項目時報 Package install error:
- 2022-12-12 Android?Google?AutoService框架使用詳解_Android
- 2022-01-21 什么是前端開發?什么是后端開發?
- 2022-10-02 C/C++寬窄字符轉換與輸出的多種實現方法_C 語言
- 2022-08-22 pytorch深度神經網絡入門準備自己的圖片數據_python
- 2022-12-07 python中的eval函數使用實例_python
- 2022-08-18 Qt常用容器類的使用_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支