目录
Redis中的自动过期机制
一、使用Redis Key自动过期机制
二、SpringBoot整合key失效监听
首页 数据库 Redis Redis中的自动过期机制怎么使用

Redis中的自动过期机制怎么使用

May 28, 2023 pm 09:40 PM
redis

Redis中的自动过期机制

实现需求:处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态

1.使用Redis Key自动过期出发事件通知
2.使用定时任务30分钟后检查
3.按照每分钟轮训检查

1

2

3

4

5

6

7

8

CREATE TABLE `order_number` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `order_name` varchar(255) DEFAULT NULL,

  `order_status` int(11) DEFAULT NULL,

  `order_token` varchar(255) DEFAULT NULL,

  `order_id` varchar(255) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

登录后复制

一、使用Redis Key自动过期机制

当我们的key失效时,可以执行我们的客户端回调监听的方法。
需要在Redis中配置:

1.打开redis.conf配置文件

1

vi redis.conf

登录后复制

Redis中的自动过期机制怎么使用

2. 在配置文件中查找notify-keyspace-events

1

/notify-keyspace-events

登录后复制

Redis中的自动过期机制怎么使用

3. 修改为notify-keyspace-events Ex

Redis中的自动过期机制怎么使用

4.重启redis

Redis中的自动过期机制怎么使用

二、SpringBoot整合key失效监听

1

2

3

4

5

6

7

8

9

@Configuration

public class RedisListenerConfig {

    @Bean

    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();

        container.setConnectionFactory(connectionFactory);

        return container;

    }

}

登录后复制

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

@Component

public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {

    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {

        super(listenerContainer);

    }

 

    @Resource

    private OrderMapper orderMapper;

 

    /**

     * 待支付

     */

    private static final Integer ORDER_STAYPAY = 0;

 

    /**

     * 失效

     */

    private static final Integer ORDER_INVALID = 2;

 

    /**

     * 使用该方法监听 当我们的key失效的时候执行该方法

     *

     * @param message

     * @param pattern

     */

    @Override

    public void onMessage(Message message, byte[] pattern) {

        String expiraKey = message.toString();

        System.out.println("该key:expiraKey:" + expiraKey + "失效啦~");

        // 前缀判断 orderToken

        OrderEntity orderNumber = orderMapper.getOrderNumber(expiraKey);

        if (orderNumber == null) {

            return;

        }

        // 获取订单状态

        Integer orderStatus = orderNumber.getOrderStatus();

        // 如果该订单状态为待支付的情况下,直接将该订单修改为已经超时

        if (orderStatus.equals(ORDER_STAYPAY)) {

            orderMapper.updateOrderStatus(expiraKey, ORDER_INVALID);

            // 库存加上1

        }

    }

}

登录后复制

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

@RestController

public class MemberController {

    @Autowired

    private UserMapper userMapper;

 

    /**

     *

     * @return

     */

    @RequestMapping("/getListMember")

    @Cacheable(cacheNames = "member", key = "'getListMember'")

    public List<MemberEntity> getListMember() {

        return userMapper.findMemberAll();

    }

}

登录后复制

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

@Data

public class OrderEntity {

    private Long id;

    private String orderName;

    /**

     * 0 待支付 1 已经支付

     */

    private Integer orderStatus;

 

    private String orderToken;

    private String orderId;

 

    public OrderEntity(Long id, String orderName, String orderId, String orderToken) {

        this.id = id;

        this.orderName = orderName;

        this.orderId = orderId;

        this.orderToken = orderToken;

    }

}

登录后复制

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

public interface OrderMapper {

 

    @Insert("insert into order_number values (null,#{orderName},0,#{orderToken},#{orderId})")

    int insertOrder(OrderEntity OrderEntity);

 

 

    @Select("SELECT ID AS ID ,order_name AS ORDERNAME ,order_status AS orderstatus,order_token as ordertoken,order_id as  orderid FROM order_number\n" +

            "where order_token=#{orderToken};")

    OrderEntity getOrderNumber(String orderToken);

 

    @Update("\n" +

            "\n" +

            "update order_number set order_status=#{orderStatus} where order_token=#{orderToken};")

    int updateOrderStatus(String orderToken, Integer orderStatus);

}

登录后复制

1.访问addOrder接口

Redis中的自动过期机制怎么使用

2.查看数据库数据

Redis中的自动过期机制怎么使用

3. 10s后redis过期,执行回调机制

Redis中的自动过期机制怎么使用

4.再次查看数据库,状态已被修改

Redis中的自动过期机制怎么使用

以上是Redis中的自动过期机制怎么使用的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章

两个点博物馆:邦格荒地地点指南
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章

两个点博物馆:邦格荒地地点指南
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Windows11安装10.0.22000.100跳出0x80242008错误解决办法 Windows11安装10.0.22000.100跳出0x80242008错误解决办法 May 08, 2024 pm 03:50 PM

Windows11安装10.0.22000.100跳出0x80242008错误解决办法

redis如何修改密码 redis如何修改密码 Apr 20, 2024 am 03:00 AM

redis如何修改密码

剖析 PHP 函数瓶颈,提升执行效率 剖析 PHP 函数瓶颈,提升执行效率 Apr 23, 2024 pm 03:42 PM

剖析 PHP 函数瓶颈,提升执行效率

redis是内存缓存吗 redis是内存缓存吗 Apr 20, 2024 am 05:26 AM

redis是内存缓存吗

Golang API缓存策略与优化 Golang API缓存策略与优化 May 07, 2024 pm 02:12 PM

Golang API缓存策略与优化

redis是非关系型数据库吗 redis是非关系型数据库吗 Apr 20, 2024 am 05:36 AM

redis是非关系型数据库吗

PHP开发中的缓存机制与应用实战 PHP开发中的缓存机制与应用实战 May 09, 2024 pm 01:30 PM

PHP开发中的缓存机制与应用实战

erlang和golang性能哪个好? erlang和golang性能哪个好? Apr 21, 2024 am 03:24 AM

erlang和golang性能哪个好?

See all articles