高性能优惠叠加计算框架 Q-calculator 发布!


https://github.com/CyrilFeng/Q-calculator

优惠是营销转化链路的重要抓手,对刺激用户消费起到至关重要的作用,目前市场上的优惠主要包含活动(如拼多多的砍一刀、天猫农场、新用户首购、复购、积分等)和券(如折扣券、代金券、商品券、买A赠B等),复杂的优惠规则让用户很难自行计算优惠叠加的顺序,或许用户在复杂的优惠规则中降低购买商品的欲望,对于参加了多个活动、有多个优惠券情况尤为明显。

优惠的计算顺序可以分为平行式和渐进式,其中平行式优惠之间没有依赖关系,而渐进式优惠之间则存在依赖关系,即下一个优惠取决于上一步的优惠结果,假设小明消费了100元,有一个8折优惠券和一个满100-20的优惠券,则这2个优惠的使用顺序有以下两种情况:

Q-calculator采用很多新颖的设计实现了高性能求解优惠最优排列。

核心计算类 Permutation

Permutation是一个抽象类,是Q-calculator的核心,在Permutation中使用了很多优化策略来保证性能,这些策略包括:

  • 预存的排列数结果集

这么设计的原因是在业务场景中需要频繁的计算排列,对于某个长度的序列,其排列结果是固定的。在Permutation类中的PERMUTATIONS属性存放了7以内的排列数结果集,这里使用了Byte来存储,因此占用的内存空间非常小。

private final static Map<Integer,Collection<List<Byte>>> PERMUTATIONS = Maps.newHashMap();

这个动作在类加载即完成,如果对7不满意,可以调整SUPPORTEDSIZE的大小,7是我们在实现中摸出来的兼顾业务和性能的参数,大家可以根据自己的需要来调整。

  •  \(A_n^3\) 级别缓存

相对于传统的Key-Value结构,求解 \(A_n^n\) 问题的缓存需要特殊设计,对一个优惠集合而言 \(A_n^3\) 意味着缓存 n x (n-1) x (n-2) 条数据,默认n为7则需要缓存210条数据,兼顾内存大小和缓存带来的性能收益, \(A_n^3\) 是最为合适的。

Permutation的成员变量cache来实现高性能缓存。

private final Map<Integer, CalcState<T>> cache = Maps.newHashMap();

可能你已经注意到,cache的键是Integer类型的,的确,通常String会更常用,然而在万次计算的场景下,String的拼接已经成了瓶颈。 为了实现高性能的键,Permutation通过位移对Byte数组的前3位进行扰动,确保键的唯一性和性能。

private static Integer calcKey(List<Byte> a){
 returna.size()>=3?(a.get(0) << 6)+ (a.get(1) << 3) + a.get(2):0;
}

Permutation提供了保存点来实现 \(A_n^3\) 级别缓存,CalcState 记录了计算到第3步的状态,包括当前订单优惠金额和计算过程、已享用优惠的商品等,这些属性的保存和回放Permutation已经帮你做好了,Permutation额外提供了抽象的保存和回放方法来满足你的个性化诉求。

优惠计算是有优先级的,必须保证属性calculateGroup值小的在前面运算,当backToSnapshot发生时,需要额外判断缓存中最后一个优惠和当前准备计算优惠之间的关系,若不满足则直接跳出。checkIfWakeUpJump方法将在缓存被使用后立刻判断是否需要继续下去。

上下文类 DiscountContext

DiscountContext是上下文,也是Permutation的成员变量,DiscountContext同样包含很多优化策略:

  • CalcStage数组

在变更最频繁也是最重要的计算步骤对象CalcStage使用数组存储,该数组随着上下文创建而创建,在Permutation中使用

Arrays.fill(arr,null);

将该数组清空并让它投入下一次计算,这样一次全排列过程中,数组只会被创建一次,避免了频繁创建数组带来的性能损耗。

  • 预计算

DiscountContext的初始化方法是静态的create方法,该方法将商品和优惠进行绑定,同时执行一些用户自定义的逻辑,我们称之为预计算,预计算的结果会被保存在DiscountContextpreCompute属性,可以在后续的计算中直接取用,一劳永逸,避免了在后续的高速迭代中做相同的事情,比如商品分组、求和等等。

预计算 PreCompute

预计算提供了接口,要使用预计算首先需要实现PreCompute接口

public interface PreCompute<T extends GoodsItem> {
/**
 * 判断符合条件的活动类型,符合才会执行preComputeItems
 */
Set<String> matchTypes();

/**
 * 对商品做一些复杂集合操作
 * @param items 当前参与优惠的商品
 * @param discount 当前优惠
 * @param preCompute 存储计算的结果
 */
 void preComputeItems(List<T> items, DiscountWrapper discount, Map<String,Object> preCompute);
}

计算器 Calculator

Calculator是单个优惠的计算接口,它有calcWarp一个方法,负责具体的优惠计算,但calcWarp需要承担一些内部的事情,因此我们提供了抽象类AbstractCalculator实现了calcWarp,并最终暴露了一个更简单的calc方法给使用者。最终用户继承AbstractCalculator,需要在Component注解中指定一个值,而CalculatorRouter将通过这个值来路由到具体的优惠计算器。这个值和DiscountWrapper中的type属性是对应的。

@Component("manjian")
public class ManjianCalc extends AbstractCalculator<GoodsItem> {
......
}

用户列表(部分):


相關推薦

2023-11-01

与任何活动,设置的商品销售价格 折后:是指通过各种优惠叠加(平台优惠券、会员优惠、店铺优惠)等试算的最终价格(即与优惠促销中显示的是同一数值) 模块展示逻辑 显示:该商品有对应的参数则显示对应数据

2024-09-22

和提供开发方向,经过一些日子打磨,我们很高兴见到,优惠券/现金券发放和核销功能(POS端+后端)功能已经完成并且上线!欢迎各位下载或关注ICEPOS系统。 附上Gitee码云源码下载链接:https://gitee.com/xmosnewone/icepos  POS前端源码

2022-12-01

,点击购物车直接购买商品!   (3)客户组折扣优惠功能 配置路径:营销推广→会员组折扣→添加(编辑) 该功能可以让运营人员,轻松的对不同的客户群,设置不同的折扣优惠力度 该功能还可以选择折扣生效的“

2023-01-13

立站系统升级到了v4.1.1.1,这次更新了浏览器采集插件、优惠码、连连支付等好用的新功能 接下来看向大家详细介绍一下这次OpenCart_v4.1.1.1升级了哪些功能!   ✦✦ 一、新增功能 (1)重要功能 | 浏览器采集插件 跨境卖

2023-02-18

序增加函数 UPCOLOR,DOWNCOLOR,XMOVE,YMOVE 11725 分时图修正叠加指标指标框架没有同步GlobalOption配置项 11723 叠加指标支持DRAWTEXT,DRAWICON 支持VALIGN0,VALIGN1,VALIGN2,ALIGN0,ALIGN1,ALIGN2 11722 DRAWICON,DRAWTEXT增加 XMOVE(), YMOVE()扩展函数 &nbs

2023-11-12

文件(swd_msg,swd_msg_log,swd_msg_template 中的msg改为sms) 优化优惠券模块,调整优惠券数据库字段结构等 优化服务端平台后台选择秒杀商品弹窗,过滤(灰度显示)失效的促销商品 修复移动端/电脑端客服聊天页面报([i].to is undefine

2023-09-06

集成电路企业增值税加计抵减政策,协调解决企业在享受优惠政策中的问题。着力提升芯片供给能力,积极协调芯片企业与应用企业的对接交流。面向数字经济等发展需求,优化集成电路、新型显示等产业布局并提升高端供给水

2022-08-05

已发布 3.3 版本,带来如下内容: 一般更新 在 Steam 叠加层中添加了“成就”和“指南”页面。 温度超出安全操作范围时添加通知 添加了预定夜间模式功能,允许玩家选择何时自动开启夜间模式 添加了一个按钮以清除

2022-09-12

Preact Signals 支持 Preact DevTools 显式渲染 404 页面 支持叠加中间件 实验性支持 Deno.serve 增加 Showcase & "Made with Fresh" 徽章 详情查看发布公告。

2022-11-18

收到点击事件后立即获取到焦点,以方便被拖拽。 具有叠加标题栏样式的窗口: 具有透明标题栏样式的窗口(使用窗口背景色): 详情查看发布公告。

2022-09-10

bsp;                     优惠券管理页                 更新内容 【新增】webIM 移动端和 PC 端 【新增】商家管理端可以独立发布商家端小程序/APP 【新增

2023-04-30

选项 增加会员权益配置管理 积分消耗类型增加”兑换优惠券抵扣” 产品增加售罄安全数量 增加商品小程序码的生成功能 图片公开请求增加partner头像的支持 预览 图一 后台 社区版相关地址 下载地址:https://githu

2024-02-23

规模排名全球第二位。但从结构看,通用算力占了大半,高性能算力占比有待提升。浪潮信息高级副总裁刘军表示,高质量算力采用先进的计算架构,具备高算效、高能效、可持续、可获得、可评估五大特征。其中,高算效是实

2023-07-14

加新页面 diy 可视化组件编辑页面,发布新的页面。 7. 优惠券新增领券页面,增加作废操作 ... ... ... PC 端预览 商家管理预览 自定义页面装修预览 演示体验 后台体验: https://v4.shopwind‍.net/admin 平台管理