当前位置: 首页 > news >正文

CouponHub项目开发记录-基于责任链来进行创建优惠券模板的参数验证

什么是责任链

责任链是一种设计模式,是让请求沿着一条处理链进行传递,从而让这条责任链上的对象来对该请求进行处理。

Controller层
在这里插入图片描述
进入service层中的创建优惠券模板方法
在这里插入图片描述
首先可以看到他调用了责任链上下文对象的handler处理方法,我们再进入对象内部
在这里插入图片描述

  • 首先可以看到他注入了一个ApplicationContext对象,通过该对象可以获取到SpringIOC当中的Bean。
  • 接着他定义了一个Map作为容器保存一个责任链,key为mark,value创建的责任链对象集合

在这里插入图片描述
接着再看其中的run方法

  • 首先他去通过applicationContext去获取实现了责任链接口的类构成的bean
  • 然后去遍历获取到的这个存放着所有实现了该接口的bean集合,并判断责任链容器中是否有带该mark标识的bean,如果有则直添加到其中,如果没有,创建一个List集合,然后再放入容器当中

在这里插入图片描述
再接着看它的handler方法

  • 首先根据传入的mark到容器中去找这一组责任链
  • 然后遍历这一组责任链上的对象分别调用他们的handler方法

在这里插入图片描述
看这些责任链对象的具体实现
在这里插入图片描述
直接实现MerchantAdminAbstractChainHandler接口,实现里面的handler方法。

// 新增优惠券模板信息到数据库CouponTemplateDO couponTemplateDO = BeanUtil.toBean(requestParam, CouponTemplateDO.class);couponTemplateDO.setStatus(CouponTemplateStatusEnum.ACTIVE.getStatus());couponTemplateDO.setShopNumber(UserContext.getShopNumber());couponTemplateMapper.insert(couponTemplateDO);// 因为模板 ID 是运行中生成的,@LogRecord 默认拿不到,所以我们需要手动设置LogRecordContext.putVariable("bizNo", couponTemplateDO.getId());// 缓存预热:通过将数据库的记录序列化成 JSON 字符串放入 Redis 缓存CouponTemplateQueryRespDTO actualRespDTO = BeanUtil.toBean(couponTemplateDO, CouponTemplateQueryRespDTO.class);Map<String, Object> cacheTargetMap = BeanUtil.beanToMap(actualRespDTO, false, true);Map<String, String> actualCacheTargetMap = cacheTargetMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey,entry -> entry.getValue() != null ? entry.getValue().toString() : ""));String couponTemplateCacheKey = String.format(MerchantAdminRedisConstant.COUPON_TEMPLATE_KEY, couponTemplateDO.getId());// 通过 LUA 脚本执行设置 Hash 数据以及设置过期时间String luaScript = "redis.call('HMSET', KEYS[1], unpack(ARGV, 1, #ARGV - 1)) " +"redis.call('EXPIREAT', KEYS[1], ARGV[#ARGV])";List<String> keys = Collections.singletonList(couponTemplateCacheKey);List<String> args = new ArrayList<>(actualCacheTargetMap.size() * 2 + 1);actualCacheTargetMap.forEach((key, value) -> {args.add(key);args.add(value);});// 优惠券活动过期时间转换为秒级别的 Unix 时间戳args.add(String.valueOf(couponTemplateDO.getValidEndTime().getTime() / 1000));// 执行 LUA 脚本stringRedisTemplate.execute(new DefaultRedisScript<>(luaScript, Long.class),keys,args.toArray());

之后就是将该优惠券模板放入数据库当中,然后再存入到Redis当中进行缓存预热。

在这里插入图片描述
之后还有创建延时修改优惠券的时间,并通过消息队列进行发送,优惠券到期以后自动修改优惠券状态。

还有为了解决缓存穿透问题而将创建的优惠券模板id放入布隆过滤器当中。

布隆过滤器的原理

布隆过滤器是通过N个哈希函数和一个位图数组构成。当将id放入布隆过滤器后,会通过N个哈希函数去计算哈希值,再与位图数组的长度进行取模运算。得到在位图数组中的位置。然后下次再去查询数据库之前会先查看布隆过滤器中是否有该数据。如果每个对应的位置都为一,则可能存在(因为哈希冲突)。如果存在一个为0则一定不存在。


文章转载自:

http://86Eip59g.pxbrg.cn
http://ekQ3Mb3M.pxbrg.cn
http://z8Wto0tU.pxbrg.cn
http://S0dBQJNh.pxbrg.cn
http://cH7Ny5An.pxbrg.cn
http://bIUI1NHp.pxbrg.cn
http://tQltaTVW.pxbrg.cn
http://hUOfBZ6P.pxbrg.cn
http://NwLGMl9H.pxbrg.cn
http://paOwyM1U.pxbrg.cn
http://TUHsGEC6.pxbrg.cn
http://HATzAuAB.pxbrg.cn
http://1rsuocUl.pxbrg.cn
http://MeA0CQkj.pxbrg.cn
http://zQMYMakp.pxbrg.cn
http://oVoX0aZk.pxbrg.cn
http://N61MlyOw.pxbrg.cn
http://hql7hrnZ.pxbrg.cn
http://aPdWbVfz.pxbrg.cn
http://2aB7eVog.pxbrg.cn
http://Tj3kZ3iM.pxbrg.cn
http://1EKiADGF.pxbrg.cn
http://FkMqMLy8.pxbrg.cn
http://SiIbAO1Q.pxbrg.cn
http://b4kn5djq.pxbrg.cn
http://o2rbX150.pxbrg.cn
http://mHRkXpPz.pxbrg.cn
http://NWy71uRj.pxbrg.cn
http://CVjIF9O8.pxbrg.cn
http://6FKygKc2.pxbrg.cn
http://www.dtcms.com/a/364830.html

相关文章:

  • Vue+Echarts饼图深度美化指南:打造卓越数据可视化体验
  • 【串口助手】串口调试助手LTSerialTool v3.12.0发布
  • 打靶日记-SQLi-LABS(二)
  • LeetCode 3132.找出与数组相加的整数2
  • 金融行业数智化转型:如何用企业微信AI实现高效内部协作与外部服务?
  • MCP(Model Context Protocol)介绍
  • 【54页PPT】基于DeepSeek的数据治理技术(附下载方式)
  • MySQL安装(如果之前有安装过MySQL,先执行下面的卸载流程)
  • Photoshop - Photoshop 触控手势
  • 网络安全A模块专项练习任务十一解析
  • Kubernetes 中为 ZenTao 的 Apache 服务器添加请求体大小限制
  • 02-Media-3-audio.py 音频输入输出,录音、播放、实时回放演示
  • nestjs 阿里云服务端签名
  • Spring boot3.x整合mybatis-plus踩坑记录
  • Ansible 核心配置与任务管理:主机清单、剧本,任务的导入、配置并行
  • Jenkins-Ansible部署discuz论坛
  • 如何利用SMS、RDS把服务从阿里云迁移到华为云
  • 嵌入式高薪岗位有哪些?
  • 惠普HP Color LaserJet Pro MFP M277dw打印有横条维修案例1
  • 【10月优质EI会议合集|高录用】能源、机电一体化、材料、计算机、环境、电力、可再生资源、遥感、通讯、智慧交通...
  • SCN随机配置网络时间序列预测Matlab实现
  • 执行一条select语句期间发生了什么?
  • Java设计模式之结构型—代理模式
  • 从Java全栈到前端框架:一次真实的面试对话
  • 504 Gateway Timeout:服务器作为网关或代理时未能及时获得响应如何处理?
  • 找Jenkins代替工具,可以体验下这款国产开源CICD工具
  • 通过SpringCloud Gateway实现API接口镜像请求(陪跑)网关功能
  • 数据库高可用全方案:Keepalived 故障切换 + LVS (DR) 模式 + MariaDB 主主同步实战案例
  • Web 集群高可用全方案:Keepalived+LVS (DR) 负载均衡 + Apache 服务 + NFS 共享存储搭建指南
  • TensorFlow的Yes/No 关键词识别模型训练