一、Redis应用场景之抢红包系统(一)
1、业务流程
- 信息流:包括用户操作背后的请求通信和红包信息在不同用户与用户群中的流转等
- 业务流:主要包括发红包、点红包和抢红包等业务逻辑
- 资金流:主要包括红包背后的资金转账和入账等流程
1.1、业务系统流程图

1.2、业务流程分析
系统整体业务流程包括2大业务组成:发红包和抢红包。其中的拆红包又可以拆分2个小业务,用户点红包和用户拆红包。
1.2.1、发红包整体业务流程

1.2.2、抢红包整体业务流程

2、业务模块划分

- 缓存中间件Redis模块:主要用来发红包时缓存红包个数和由随机数算法产生的红包随机金额列表,同时将借助Redis单线程特性和操作的原子性实现抢红包时锁的操作
- 引入Redis一方面是大大减少高并发情况下频繁查询数据库的操作,减少数据库的压力。
- 另一方面是提供系统整体响应性能和保证数据的一致性。
3、数据库表设计与环境搭建
主要有3张表,发红包记录红包的信息表,发红包时对应的随机金额信息表,抢红包时用户抢到红包的金额记录表
3.1、实体类Model
发红包记录表RedRecord
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
48package com.victor.model.redpacket;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.ToString;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Description: 发红包记录表
* @Author: VictorDan
* @Version: 1.0
*/
(name = "red_record")
public class RedRecord {
(strategy = GenerationType.IDENTITY)
(name = "id")
private Integer id;
/**
* 用户id
*/
private Integer userId;
/**
* 红包全局唯一标识串
*/
private String redPacket;
/**
* 红包指定可以抢的总人数
*/
private Integer total;
/**
* 红包总金额
*/
private BigDecimal amount;
/**
* 是否有效
*/
private Boolean isActive;
(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date createTime;
}红包明细金额表RedDetail
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
40package com.victor.model.redpacket;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.ToString;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Description: 红包明细金额表
* @Author: VictorDan
* @Version: 1.0
*/
(name = "red_detail")
public class RedDetail {
(strategy = GenerationType.IDENTITY)
(name = "id")
private Integer id;
/**
* 红包记录id
*/
private Integer recordId;
/**
* 红包随机金额
*/
private BigDecimal amount;
/**
* 是否有效
*/
private Boolean isActive;
(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date createTime;
}抢红包记录表RedRobRecord
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
46package com.victor.model.redpacket;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.ToString;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Description: 抢红包记录表
* @Author: VictorDan
* @Version: 1.0
*/
(name = "red_record")
public class RedRobRecord {
(strategy = GenerationType.IDENTITY)
(name = "id")
private Integer id;
/**
* 用户id
*/
private Integer userId;
/**
* 红包全局唯一标识串
*/
private String redPacket;
/**
* 抢到红包的金额
*/
private BigDecimal amount;
/**
* 是否有效
*/
private Boolean isActive;
/**
* 抢到时间
*/
(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date robTime;
}
3.2、持久层Repository
发红包记录表RedRecordRepo
1
2
3
4
5
6
7
8
9
10
11
12
13
14package com.victor.repository.redpacket;
import com.victor.model.redpacket.RedRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* @Description:
* @Author: VictorDan
* @Version: 1.0
*/
public interface RedRecordRepo extends JpaRepository<RedRecord,Long> {
}红包明细金额RedDetailRepo
1
2
3
4
5
6
7
8
9
10
11
12
13
14package com.victor.repository.redpacket;
import com.victor.model.redpacket.RedDetail;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* @Description:
* @Author: VictorDan
* @Version: 1.0
*/
public interface RedDetailRepo extends JpaRepository<RedDetail,Long> {
}抢红包记录表RedRobRecordRepo
1
2
3
4
5
6
7
8
9
10
11
12
13
14package com.victor.repository.redpacket;
import com.victor.model.redpacket.RedRobRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* @Description:
* @Author: VictorDan
* @Version: 1.0
*/
public interface RedRobRecordRepo extends JpaRepository<RedRobRecord,Long> {
}
- 本文作者: Victor Dan
- 本文链接: https://victorblog.github.io/2018/06/18/Redis应用场景之抢红包系统/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
