php为例 hash实现数据库水平分表问题
1.redis记录最大ID(单线程高并发下保持原子性)
2.注册时取出当前最大ID,使用 $num = sprintf("%u", crc32($id)) % 100(100为假设分的表数量,这里为100张),得到存储到哪个表里。
3.维护一张索引表,记录uname 和 id,登录时查询出id,再算出那张表,然后进行登录操作。
4.其他查询时候,通过关联id得出存储到那张表里的用户
支付数据库设计
// 订单表:order_id, total_amount, pay_status(支付状态012)(下单先生成,支付成功回调中修改订单状态),支付方式,user_id, 等其他信息
// 订单产品关系表(可能一张订单有多个产品一起下单):order_id, product_id, product_name(冗余技巧),price(冗余技巧),等其他信息
// 支付订单表(收款单表):每次支付或者退款生成的表,payment_id(为order_id+随机6位数字组成),money(总价),user_id,status('ready','pay_success','refun_success'),支付方式,用户账户名,currency,paycost(支付多少,配合分期支付使用)...
(每次提交支付的时候,通过关联表与支付订单表检查是否存在该条记录,时间不超过3分钟(支付时间,防止重复支付,在回callback修改状态之前再次付款),如果存在则返回‘已经支付或正在支付’,若没有或时间过时则重新生成支付订单记录,幂等操作。)
// 支付订单关联表:订单id,类型(是付款还是退款),payment_id,money...
生成订单信息(状态为未支付) - (生成支付订单和支付订单关联表) - 发送支付订单ID吊起支付服务 - 支付完成后通过callback接收支付结果 - 该callback更改订单状态(已支付),同时更改支付订单表状态status为已完成,(扩展可以更新用户表花费额度,用于计算共消费多少)。
本文由 litblc 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Aug 5, 2022 at 05:05 pm

