Redis 주문 자동 만료 기능의 예제 코드
앞말
사용자가 주문한 후 XX분 후에 자동으로 "이미 만료됨"으로 설정하여 더 이상 지불을 개시할 수 없습니다.프로젝트와 유사한'만기'의 수요는 필자는 Redis를 사용하는 해결 방향을 제공하고 Redis의 구독, 발표와 키 공간 알림 메커니즘(Keyspace Notifications)을 결합시켜 실현한다.
redis를 설정합니다.confg
notify-keyspace-events 옵션은 기본적으로 사용하지 않습니다. notify-keyspace-events "Ex"로 변경합니다.인덱스 비트 i의 라이브러리를 다시 시작하면 만료된 요소가 삭제될 때마다**keyspace@:expired ** 채널에서 알림을 보냅니다.
E는 키 이벤트 알림을 나타냅니다. 모든 알림은__keyevent@__:expired 접두사;
x는 만료된 이벤트를 나타냅니다. 만료된 이벤트가 삭제될 때마다 발송됩니다.
SpringBoot과 통합
① JedisConnectionFactory 등록
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@Configuration
public class RedisConfig {
@Value("${redis.pool.maxTotal}")
private Integer maxTotal;
@Value("${redis.pool.minIdle}")
private Integer minIdle;
@Value("${redis.pool.maxIdle}")
private Integer maxIdle;
@Value("${redis.pool.maxWaitMillis}")
private Integer maxWaitMillis;
@Value("${redis.url}")
private String redisUrl;
@Value("${redis.port}")
private Integer redisPort;
@Value("${redis.timeout}")
private Integer redisTimeout;
@Value("${redis.password}")
private String redisPassword;
@Value("${redis.db.payment}")
private Integer paymentDataBase;
private JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(maxTotal);
config.setMinIdle(minIdle);
config.setMaxIdle(maxIdle);
config.setMaxWaitMillis(maxWaitMillis);
return config;
}
@Bean
public JedisPool jedisPool() {
JedisPoolConfig config = this.jedisPoolConfig();
JedisPool jedisPool = new JedisPool(config, redisUrl, redisPort, redisTimeout, redisPassword);
return jedisPool;
}
@Bean(name = "jedisConnectionFactory")
public JedisConnectionFactory jedisConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setDatabase(paymentDataBase);
redisStandaloneConfiguration.setHostName(redisUrl);
redisStandaloneConfiguration.setPassword(RedisPassword.of(redisPassword));
redisStandaloneConfiguration.setPort(redisPort);
return new JedisConnectionFactory(redisStandaloneConfiguration);
}
}
② 등록 감청기
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service(value ="paymentListener")
public class PaymentListener implements MessageListener {
@Override
@Transactional
public void onMessage(Message message, byte[] pattern) {
//
}
}
③ 구독 객체 구성
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
@Configuration
@AutoConfigureAfter(value = RedisConfig.class)
public class PaymentListenerConfig {
@Autowired
@Qualifier(value = "paymentListener")
private PaymentListener paymentListener;
@Autowired
@Qualifier(value = "paymentListener")
private JedisConnectionFactory connectionFactory;
@Value("${redis.db.payment}")
private Integer paymentDataBase;
@Bean
RedisMessageListenerContainer redisMessageListenerContainer(MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
// paymentDataBase
String subscribeChannel = "__keyevent@" + paymentDataBase + "__:expired";
container.addMessageListener(listenerAdapter, new PatternTopic(subscribeChannel));
return container;
}
@Bean
MessageListenerAdapter listenerAdapter() {
return new MessageListenerAdapter(paymentListener);
}
}
paymentDataBase 라이브러리 요소가 만료되면 PaymentListener의 onMessage(Message message,byte[] pattern) 방법으로 넘어갑니다.이 Redis가 주문 자동 만료 기능을 실현하는 예시 코드에 관한 글은 여기에 소개되어 있습니다. 더 많은 Redis 주문 자동 만료 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
그래프 구조를 무상으로 취급할 수 없는 것은 싫기 때문에, redisgraph를 WSL2에 극치고 설치해 보았습니다.제목은 만우절이므로. 그렇다, 역시, 앞으로는 그래프 구조 데이터베이스라고 생각했다. 생각한 것은 몇 년 전인가. 전부터 Neo4j는 시험하고 있지만, 영업 분들로부터 상용 라이센스가 높다고 가르쳐 주었으므로, 전전...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.