凭证卷发放流程优化方案

2024-01-28 17:20

本文主要是介绍凭证卷发放流程优化方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

上周线上有多个大促活动,创建了多个凭证卷模版,并导入了大量劵码,其中有多个卷模版下的劵码超过50w+, 在发放劵的时候,会先查询一次卷码库存,其中劵模版ID是分库分表键,所以在统一模版下的数据量过多了以后,就会导致慢sql

select * from t_coupon_code from templateId = #{templateId} and status = "未发放" limit 20;

Q&A

Q1: 为什么sql 要写limit 20,直接查一个不行吗?

因为发放过程存在并发问题,玩法系统的RT有要求,不能超过100ms,所以营销获取可用劵码的时候多拿了几条,然后随机返回一条,减缓并发过程中的冲突,就算两个用户拿到了同一个劵码了,在后续的更新流程当中,一定会有一方更新失败,所以不存在两个用户抢到同一张劵码的情况

Q2: 为什么同一模版下,劵码量大了会导致慢SQL?

虽然sql,能够命中索引,但是后面的字段区分度不大,会扫描整个索引树,如果还不懂,建议回归校园

优化方案

引入Redis的set结构

为什么是set不是list?

:::success
List: 也是能够实现这样的效果的,但是需要防止出现重复元素,因为劵码是不会重复的
Set: 不仅能够去重,而且也能随机弹出集合内的元素(时间复杂度O(1))
:::

引入redis以后如何发放劵码

这里只是简单给个思路,我很懒不想画流程图了,在公司天天敲,😡

  1. 从redis中pop出
  2. 如果pop的元素不是空,查询数据库 并返回结果
  3. 如果是空,判断当前劵码是否没有库存了(redis中的一个标记位)
  4. 如果有库存 加载DB中的数据到缓存,如果没有加载到,说明没有库存了,缓存中记录标记

引入redis以后数据一致性如何保证

会出现短暂的不一致场景:运营删除劵码库存的时候
但是不会有影响,应为pop,出一个已经被删除的元素以后,后续走正常的发放动作,这个过程中更新DB会出现问题,从而避免了并发问题

这篇关于凭证卷发放流程优化方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/654288

相关文章

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

使用MyBatis TypeHandler实现数据加密与解密的具体方案

《使用MyBatisTypeHandler实现数据加密与解密的具体方案》在我们日常的开发工作中,经常会遇到一些敏感数据需要存储,比如用户的手机号、身份证号、银行卡号等,为了保障数据安全,我们通常会对... 目录1. 核心概念:什么是 TypeHandler?2. 实战场景3. 代码实现步骤步骤 1:定义 E

Python实现繁体转简体功能的三种方案

《Python实现繁体转简体功能的三种方案》在中文信息处理中,繁体字与简体字的转换是一个常见需求,无论是处理港澳台地区的文本数据,还是开发面向不同中文用户群体的应用,繁简转换都是不可或缺的功能,本文将... 目录前言为什么需要繁简转换?python实现方案方案一:使用opencc库方案二:使用zhconv库

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

在DataGrip中操作MySQL完整流程步骤(从登录到数据查询)

《在DataGrip中操作MySQL完整流程步骤(从登录到数据查询)》DataGrip是JetBrains公司出品的一款现代化数据库管理工具,支持多种数据库系统,包括MySQL,:本文主要介绍在D... 目录前言一、登录 mysql 服务器1.1 打开 DataGrip 并添加数据源1.2 配置 MySQL

MyBatis Plus中执行原生SQL语句方法常见方案

《MyBatisPlus中执行原生SQL语句方法常见方案》MyBatisPlus提供了多种执行原生SQL语句的方法,包括使用SqlRunner工具类、@Select注解和XML映射文件,每种方法都有... 目录 如何使用这些方法1. 使用 SqlRunner 工具类2. 使用 @Select 注解3. 使用

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景