網(wǎng)站首頁(yè) 編程語(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
相關(guān)推薦
- 2023-07-10 Gateway服務(wù)網(wǎng)關(guān)
- 2022-09-17 python生成requirements.txt文件的推薦方法_python
- 2024-03-01 【websocket】前端websocket 實(shí)時(shí)通信
- 2022-07-13 Docker的數(shù)據(jù)管理
- 2022-08-04 Docker?Desktop更改鏡像存儲(chǔ)位置的實(shí)現(xiàn)_docker
- 2022-04-03 Android?PopUpWindow實(shí)現(xiàn)卡片式彈窗_Android
- 2022-08-01 Flask-Sqlalchemy的基本使用詳解_python
- 2022-07-03 DatePicker動(dòng)態(tài)設(shè)置picker-options 中的disabledDate屬性操作;
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支