【校招VIP】Java电商平台之订单功能和支付功能实现

01月02日 收藏 0 评论 0 java开发

【校招VIP】Java电商平台之订单功能和支付功能实现

转载声明:文章来源https://blog.csdn.net/weixin_42354197/article/details/118150830

下单支付流程

1.选择商品添加至购物车。

2.点击支付,创建订单。

3.将订单写入数据库。

4.同时扣减库存,将订单数据同时同步到redis,并且设置过期时间。

5.取消订单(超时未支付),退回商品库存。

6.定时清理未支付异常订单,退回商品库存。

订单中遇到的问题:

1.重复下单,恶习重复下单,

采取的接口的幂等性+token验证机制,自定义token注解,实现token的创建和删除功能,创建拦截器继承处理器拦截适配器,重写prehandle方法,在下单之后请求处理钱完成拦截处理,下单生成自定义token将其存储在redis缓冲中的session中,并且将其返回响应给客户端,客户端下次请求会携带token作为请求头发送请求,请求进入到拦截器进行前端请求获取token,如果token不存在则进行创建token,同时成功创建订单,保存在redis缓冲中等待库存的扣减和订单超时管理删除订单,如果存在,则处理拦截适配器进行拦截,返回不允许重复下单。

2.如何安全扣减库存,不超卖不少卖

采用springboot操作redisbution实现对库存字段分布式锁机制,利用redission框架,set key value nx方法设置延时时间,当有很多请求发过来时,会一个一个请求来执行,因为redis是单线程架构,系统宕机完成自动释放库存锁。解决了由于系统宕机锁未释放,还有释放锁异常采用try cath final。释放锁和删除锁。

@RestController
public class IndexController {
@Autowired
private Redisson redisson;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@RequestMapping("/deduct_stock")
public String deductStock(){
String lockKey="lockKey";
RLock redisId=redisson.getLock(lockKey);//拿到锁对象
try { //问题一
redisId.lock();//j加锁
int stock=Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));//jedis.get("stock");
if(stock>0){
int realStock=stock-1;
stringRedisTemplate.opsForValue().set("stock",realStock+"");//jedis.set(key,value)
}else{
System.out.println("扣减失败,库存不足");
}
}finally {
redisId.unlock();
}
return "end";
}

}

序列化和反序列化

多线程问题

spring中的事务控制

事务管理器transactionmanager

订单支付中重复支付问题解决(幂等性分布式锁)

订单支付中支付失败订单处理

订单支付中支付成功但是订单无变化

订单提交时由于本地bug或者意外故障导致用户钱支付了但是订单不成功,采用对账方式来解决

1.mybatis在项目中的使用

持久化框架封装了jdbc数据库链接,ssm框架整合mybatis,首先配置全局文件applicationcontext.xml文件,整合mybatis,完成数据源source配置,编写mapper映射文件,加载全局配置文件,生成sqlsessionfactory对象,builde方法创建sqlsession对象调用mapper映射文件中的sql语句,完成对数据库的操作。

2.mysql数据库主从集群的配置,实现高可用

配置修改主节点数据库服务器的etc/my.cnf文件,设置号server-id和二进制日志文件启名字 重启服务器让配置生效
从节点服务器也去配置etc/my.cnf文件在mysqld范围里内配置server-id保证和主节点服务器不一样。从节点删除uuid文件,在配置主节点的ip,port,username,password等信息,执行挂载命令完成主从高可用服务器配置。

3.nginx实现动静分离和负载均衡

启动nginx 设置配置ningx.conf文件中的https server 中的端口号 location server_name location 
实现动静分离()负载均衡 利用ip_hash算法实现

4.redis实现session共享和热点数据缓存

redis-cluster实现session共享验证用户+热点数据缓存+防止雪崩(大量热点数据过期+用户高并发访问直接到达数据库服务器压力打死)+

穿透(有人故意访问redis中不从在数据+数据库也不存在+大量请求导致数据库打死)+击穿(热点数据过期+高并发访问)

5.mycat中间件在项目中的使用

mycat是目前最流行的分布式数据库中间件,是一个开源的分布式数据库系统,解决系统中数据库大量存储问题,解决了表的容量问题,解决了查询表的性能问题,解决了mysql服务器宕机问题。可以实现读写分离。
mycat读写分离,schema.xml文件编写。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/" >
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100">
<table name="tb_user" dataNode="dn1" primaryKey="id"/>
<table name="t_product" primaryKey="product_id" dataNode="easymall_dn1"/>
</schema>
<dataNode name="dn1" dataHost="localhost1" database="mstest"/>
<dataNode name="easymall_dn1" dataHost="localhost1" database="easydb"/>
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select now()</heartbeat>

<writeHost host="hostM2" url="10.9.182.139:3306" user="root" password="tarena2017Up;"/>
<writeHost host="hostM1" url="10.42.17.191:3306" user="root" password="tarena2017Up;"/>
</dataHost>
</mycat:schema>
schema中的name TESTDB 没变
C 0条回复 评论

帖子还没人回复快来抢沙发