抢红包逻辑及核心代码:

  1. 先判断用户有没有抢过红包,如果没有则进行第二步
  2. 判断红包个数,如果>0 则直接返回数量
  3. 判断红包金额,如果>0则直接返回金额

核心代码

说明:这里特别需要说明的,redis的相关操作,全部用的lua脚本,这么做完全是为了提高性能以及降低代码的复杂度。

这需要开发者对lua脚本有一定的理解,如果对lua不懂的,可以简单学习一下,本人也是做此功能的时候现学的。

/*** 抢红包的逻辑* 1.先判断用户有没有抢过红包,如果抢过了直接返回*      1.1判断红包个数,如果>0 则直接返回数量*      1.2判断红包金额,如果>0 则直接返回金额** @param redPacketId* @param uid* @return*/public Map getRedPacket(long redPacketId,int uid){//验证是否获取过红包的keyString CHECK_IS_GET = redPacketId + TOTAL_NUM + "_" + uid;//验证红包总数String CHECK_TOTAL_NUM = redPacketId + TOTAL_NUM;//验证红包金额String CHECK_TOTAL_AMOUNT = redPacketId + TOTAL_AMOUNT;String status = redisService.getStatus(LUA_CHECK, CHECK_IS_GET, CHECK_TOTAL_NUM, CHECK_TOTAL_AMOUNT);if(status != null){return this.checktUseAuthority(status);}return Collections.emptyMap();}

lua脚本

local localExistKey = KEYS[1]
local localTotalKey = KEYS[2]
local localAmountKey = KEYS[3]local existKey = "exist:1"
local totalKey = "total:"
local amountKey = "amount:"local result_1 = redis.call("GET",localExistKey)
if result_1thenreturn existKey
elselocal result_2 = redis.call("GET",localTotalKey)local result_3 = redis.call("GET",localAmountKey)if result_2 == nilthenreturn totalKeyelsereturn  totalKey..result_2endif result_3 == nilthenreturn amountKeyelsereturn result_3..amountKeyend
end

Redis应用项目---抢红包功能(三)相关推荐

  1. Redis应用项目---抢红包功能(四)

    拆红包的核心功能: 拆红包功能是整个功能的核心,红包计算逻辑:剩余金额/剩余红包个数 * 2,这里有个一个点,如果保证剩余金额和剩余红包个数同时等于0,特别是在并发的情况下. 核心代码: public ...

  2. Redis应用项目---抢红包功能(一)

    开篇: 之前也看过一些相关的书籍,最近又在学习redis的相关知识,不过这次偏实战一些,花了几天时间做了一个抢红包的功能,把设计的思路以及最终的源码贴出来给大家分享一下,本人自己自测了一下,能非常清楚 ...

  3. Redis应用项目---抢红包功能(二)

    发红包逻辑及核心代码: 需要保证红包id的唯一性,此次用的是雪花算法,完全能够保证唯一性,关于分布式事务的唯一性ID,可以给大家推进一篇我写的博客,里面有多种唯一性ID的介绍:https://blog ...

  4. 基于Redis实现微信抢红包功能

    使用Redis和Lua的原子性实现抢红包功能 安装Lua(可选) 编写lua脚本 lua脚本学习可以参考 [https://www.runoob.com/lua/lua-basic-syntax.ht ...

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

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

  6. Redis 牛X!竟然能实现抢红包功能!

    原文链接:https://www.cnblogs.com/chenyanbin/p/13587508.html 为啥写这个微信抢红包项目呢,公司 0202 年 08 月 22 日,公司周年庆,抢了10 ...

  7. 【django】用户登录模块实现步骤(三)之QQ用户是否绑定项目用户的处理和QQ用户绑定项目用户功能实现【34】

    一.判断openid是否绑定过⽤户 使⽤openid查询该QQ⽤户是否在芒果头条中绑定过⽤户. openid已绑定⽤户的处理: 如果openid已绑定芒果头条⽤户,直接⽣成状态保持信息,登录成功,并重 ...

  8. Redis在项目中的地位及使用场景剖析

    Redis在项目中的地位及使用场景剖析 一. redis 特点 所有数据存储在内存中,高速读写 提供丰富多样的数据类型:string. hash. set. sorted set.bitmap.hyp ...

  9. Redis在项目中的使用及性能测试

    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan [前言] 在上篇博文中为大家分享了<SCPPO:C#中Redis封装的类>,有了这个 ...

最新文章

  1. Kirito 的博客崩了,这次是因为...
  2. java.lang.date_无法将java.lang.String类型的值转换为必需类型java.util.Date
  3. HTML5 网站大观:12个优秀的 HTML5 黑色风格网站设计
  4. CAS存在的问题以及解决方案
  5. PHP中过滤常用标签的正则表达式
  6. Python入门100题 | 第002题
  7. [2019.3.4]BZOJ1213 [HNOI2004]高精度开根
  8. C# OpenTK教程 - 1.2 你好三角形
  9. bluetooth记录
  10. mysql 多表删除
  11. vue跳转传参刷新后参数消失
  12. python-ImageDraw
  13. Kepware 安装CD光盘教程
  14. JDK安装 Java环境配置
  15. 利用 Python 进行量化投资分析 - 利率及风险资产的超额收益
  16. 壹沓科技签约全球快消品牌巨头保乐力加,为企业数智化升级注入新动能
  17. js中数组filter过滤奇偶数_js--数组的filter()过滤方法的使用
  18. Terraform指南:安装
  19. web性能测试基础(一)
  20. mysql配置和优化

热门文章

  1. 在html文件中以下使用绝对路径表示的是,JavaWeb——HTML5常用知识点
  2. Vue3.0 + typescript 高仿网易云音乐 WebApp
  3. 为什么用功率谱密度来描述随机信号?
  4. 联想G460笔记本触摸板驱动 For Windows 7 x64
  5. [转] 晚上一般什么时候睡觉?
  6. 【笔记:Spring】
  7. Qualcomm 音频学习一
  8. DICTATOR第一周排序部分作业
  9. 3.4.1 在物理层扩展以太网
  10. html向下滚动条,《html》不显示滚动条,鼠标滑轮可以控制向下滚动是怎么回事?...