>  기사  >  데이터 베이스  >  자동 주문 만료 기능 구현을 위한 Redis용 소스 코드 공유

자동 주문 만료 기능 구현을 위한 Redis용 소스 코드 공유

王林
王林앞으로
2020-12-25 09:30:361966검색

자동 주문 만료 기능 구현을 위한 Redis용 소스 코드 공유

글 배경

우리의 목적은 사용자가 주문한 후 지정된 시간이 지나면 자동으로 주문이 "만료"로 설정되어 더 이상 결제가 시작될 수 없도록 하는 것입니다.

(비디오 공유 학습: redis 비디오 튜토리얼)

아이디어:

Redis의 구독, 게시 및 키스페이스 알림 메커니즘(키스페이스 알림)을 결합하여 구현되었습니다.

redis.confg 구성

notify-keyspace-events 옵션은 기본적으로 활성화되어 있지 않습니다. 이를 inform-keyspace-events "Ex"로 변경하세요. 다시 시작하면 적용됩니다. 인덱스 위치가 i인 라이브러리는 만료된 요소가 삭제될 때마다 **keyspace@:expired** 채널에 알림을 보냅니다.
E는 주요 이벤트 알림을 나타내며 모든 알림에는 __keyevent@__:expired 접두사가 붙습니다.
x는 만료 및 삭제될 때마다 전송되는 만료 이벤트를 나타냅니다.

SpringBoot와 통합

1. 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);
	}
}

2. 리스너 등록

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) {
		// 过期事件处理流程
	}

}

3. 구독 객체 구성

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);
    }
}

결제DataBase가 만료되면 PaymentListener의 onMessage(메시지 메시지, byte[])로 이동합니다. 패턴) 방법.

관련 권장 사항: redis 데이터베이스 튜토리얼

위 내용은 자동 주문 만료 기능 구현을 위한 Redis용 소스 코드 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제