gpt4 book ai didi

Redis实现订单自动过期功能的示例代码

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Redis实现订单自动过期功能的示例代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

前言 。

用户下单后,规定XX分钟后自动设置为“已过期”,不能再发起支付。项目类似此类"过期"的需求,笔者提供一种使用Redis的解决思路,结合Redis的订阅、发布和键空间通知机制(Keyspace Notifications)进行实现.

配置redis.confg 。

notify-keyspace-events选项默认是不启用,改为notify-keyspace-events “Ex”。重启生效,索引位i的库,每当有过期的元素被删除时,向**keyspace@:expired**频道发送通知。 E表示键事件通知,所有通知以__keyevent@__:expired为前缀; x表示过期事件,每当有过期被删除时发送.

与SpringBoot进行集成 。

①注册JedisConnectionFactory 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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);
  }
}

②注册监听器 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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) {
   // 过期事件处理流程
  }
}

③配置订阅对象 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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 订单自动过期内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://blog.csdn.net/qq_33755556/article/details/87457332 。

最后此篇关于Redis实现订单自动过期功能的示例代码的文章就讲到这里了,如果你想了解更多关于Redis实现订单自动过期功能的示例代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com