目录

1. 活动的配置

2. 触发抢红包动作时,有4台机器并行处理抢红包业务


1. 活动的配置

抢红包可以支持3种类型

  • 固定的总金额,固定的红包数,每个红包金额随机,但总和必须等于总金额(总计100元,10个红包-二倍均值算法)
  • 指定每一个红包的金额,以及红包个数(5个1元,6个2元,7个3元...)
  • 指定总金额,以及单个红包金额的上下限(资金池100元,每个红包1-2元)

每个人可以抢的次数有以下两种情况

  • 一人一次
  • 一人多次

完成配置后

  • 数据库中生成一条活动信息记录(活动id+活动开始时间+活动结束时间+每个人可抢次数),以及若干条红包信息记录(红包id+归属活动id+是否经redis处理标记位+归属人)
  • 以活动id作为key,在redis中申请一个list作为队列,取20条红包信息记录使用lpush加入redis队列
  • 以活动id+"info"作为key,在redis中申请一个hash,并把活动信息存入(活动id+活动开始时间+活动结束时间+每个人可抢次数)

2. 触发抢红包动作时,有4台机器并行处理抢红包业务

客户端发起请求(时间戳+用户手机号+参与活动id)

  1. 每台机器尝试获取redis的分布式锁,基于stringRedisTemplate.putIfAbsent,并设置超时时间为10s防止死锁
  2. 若每人只允许抢一次,可以考虑适用布隆过滤器
  3. 若每人允许抢多次,则:使用redisTemplate.opsForHash.putIfAbsent,key为活动id+“info”,field为用户手机号,value为用户可抢次数
    1. 若返回true,表示该用户还未抢过

      1. 使用lpop获取redis队列中的元素(红包id+红包信息)
      2. 使用redisTemplate.opsForHash.increment,key为活动id+“info”,field为用户手机号,delta为-1(用户剩余可抢次数-1)
      3. 直接返回客户端成功,并通过rocketMq异步发送手机号+红包id,更新数据库
    2. 若返回false,则说明该用户已经抢过一次,获取用户剩余可抢次数
      1. 若>0,说明该用户仍可以抢,重复3.1.1步骤
      2. 若<=0,说明该用户不可以抢了,直接返回客户端失败
  4. 使用llen判断redis中队列长度,若<10,则重新查询20条库表中redis处理标记位为空的记录,使用lpush加入redis队列
  5. 释放分布式锁

业务场景 基于mysql+redis的抢红包活动业务场景相关推荐

  1. 如何基于MySQL及Redis搭建统一的kv存储服务 | 秦波

    一.MySQL+Redis常用部署方式 1.1  拓扑 1.2  特点 业务层通过双写同时写MySQL及Redis.读通常在Redis,若读取不到,则从MySQL读取,然后将数据同步到Redis,Re ...

  2. 来个硬货——长文解读:基于业务场景的MySQL千万级大表优化

    千万级大表如何优化,这是一个很有技术含量的问题,通常我们的直觉思维都会跳转到拆分或者数据分区,在此我想做一些补充和梳理,想和大家做一些这方面的经验总结,也欢迎大家提出建议. 从一开始脑海里开始也是火光 ...

  3. 基于springboot+redis+bootstrap+mysql开发一套属于自己的分布式springcloud云权限架构(七)【权限架构生产者(数据字典)】

    在我们的编码中我们经常会存放一些静态常量,而这些静态变量我们通常都是写死的,如果我们需要改变这些静态变量的值那么我们必须要修改代码,并重新发布程序,这很明显很不符合我们现实中的业务场景,我们现实中的业 ...

  4. Redis核心数据结构List应用场景-商品列表、缓存击穿、PV阅读量、抢红包、推送帖子、普通分布式锁、Redis可重入锁与红锁

    List应用场景 Redis之List 一. Redis list命令实战 二.商品列表 高并发的淘宝聚划算实现技术方案 SpringBoot+Redis实现商品列表功能 二.缓存击穿 什么是缓存击穿 ...

  5. 什么业务场景适合使用Redis?

    Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言 ...

  6. 解读:在什么业务场景适合使用Redis?

    Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言 ...

  7. B2C商城项目源码,基于Java开发的高可用分布式B2C商城系统,Java+Spring MVC+Dubbo+Zookeeper+MySQL+Redis+FastDFS+Nginx+Solr

    目录 前言 B2C商城-AIYOU 一.项目总体架构 二.系统软硬件设施总体规划 1.系统服务规划 2.应用服务规划 3.应用系统域名规划 三.系统运行环境构建 四.项目数据库创建 五.项目拉取 六. ...

  8. MySQL 和 Redis 的区别以及应用场景

    目录 一.mysql 和 redis 的区别 1. 数据类型 2. 本质区别 二.redis 优缺点及使用场景 1. 使用redis有哪些好处? 2. redis 相比memcached 有哪些优势? ...

  9. 基于redis实现抢红包功能(包括余额退回处理)

    本文将讲述使用redis实现抢红包功能,采用发红包时将红包拆好存储,解决红包金额平衡问题(两种算法).解决超发现象.将数据通过消息队列传递给另一个服务写入数据库,现阶段不考虑redis宕机的情况. - ...

最新文章

  1. Python3中装饰器介绍
  2. 苏大JAVA题库_苏州大学Java程序设计课程试卷含答案(B)
  3. phpword 模板 多页_高中数学:各题型答题模板,吃透,灵活运用数学公式,解题更快!...
  4. 最小可行产品是什么_无论如何,“最小可行产品”到底意味着什么?
  5. Beyond Compare 4
  6. 从1.5k到18k, 一个程序员的5年成长之路 2019-03-15
  7. 回顾2017系列篇(二):移动端APP设计趋势
  8. 计算机c语言知识点txt,计算机二级C语言(重要知识点)
  9. 创意十足!25个酷炫的服饰行业网站设计
  10. jquery 弹出层
  11. python3连接redis
  12. 红外接收头图片_红外接收头引脚定义图解
  13. Zhuperb!朱婷登顶知名排球网站年度搜索热度榜
  14. qt 获取用户缩放,Qt-如何创建随窗口缩放并保持纵横比的图像?
  15. 《 没有业绩怎么写好年终总结.ppt 》
  16. geoserver样式(SLD方式)—— 图层元素在不同比例尺显示不同样式
  17. 赛百味的中英文菜单对照
  18. BLE_BQB Test_Intermodulation Performance, uncoded data at 1 Ms/s_RF-PHY/RCV/BV-05-C
  19. 网易2017春招 魔力手环 矩阵快速幂
  20. 看这篇就够了!能源企业数字化升级,推动绿色低碳发展

热门文章

  1. redis的哨兵模式测试
  2. 软件项目管理 8.1.软件质量基本概念
  3. 【机器学习】基于A股新闻共现网络的股票收益分析
  4. python还是c++量化_从Python到C++,对量化回测的一点思考
  5. css伪类last,css 伪类:last-child等不起作用(示例代码)
  6. 一款轻量级项目工时统计系统,源码分享
  7. Latent Dirichlet Allocation (LDA)
  8. Java中 Controller、Service 、Dao/Mapper层的区别
  9. Python安装教程(Windows10)
  10. 字符串的模式匹配(KMP)算法