Redis应用项目---抢红包功能(三)
抢红包逻辑及核心代码:
- 先判断用户有没有抢过红包,如果没有则进行第二步
- 判断红包个数,如果>0 则直接返回数量
- 判断红包金额,如果>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应用项目---抢红包功能(三)相关推荐
- Redis应用项目---抢红包功能(四)
拆红包的核心功能: 拆红包功能是整个功能的核心,红包计算逻辑:剩余金额/剩余红包个数 * 2,这里有个一个点,如果保证剩余金额和剩余红包个数同时等于0,特别是在并发的情况下. 核心代码: public ...
- Redis应用项目---抢红包功能(一)
开篇: 之前也看过一些相关的书籍,最近又在学习redis的相关知识,不过这次偏实战一些,花了几天时间做了一个抢红包的功能,把设计的思路以及最终的源码贴出来给大家分享一下,本人自己自测了一下,能非常清楚 ...
- Redis应用项目---抢红包功能(二)
发红包逻辑及核心代码: 需要保证红包id的唯一性,此次用的是雪花算法,完全能够保证唯一性,关于分布式事务的唯一性ID,可以给大家推进一篇我写的博客,里面有多种唯一性ID的介绍:https://blog ...
- 基于Redis实现微信抢红包功能
使用Redis和Lua的原子性实现抢红包功能 安装Lua(可选) 编写lua脚本 lua脚本学习可以参考 [https://www.runoob.com/lua/lua-basic-syntax.ht ...
- 基于redis实现抢红包功能(包括余额退回处理)
本文将讲述使用redis实现抢红包功能,采用发红包时将红包拆好存储,解决红包金额平衡问题(两种算法).解决超发现象.将数据通过消息队列传递给另一个服务写入数据库,现阶段不考虑redis宕机的情况. - ...
- Redis 牛X!竟然能实现抢红包功能!
原文链接:https://www.cnblogs.com/chenyanbin/p/13587508.html 为啥写这个微信抢红包项目呢,公司 0202 年 08 月 22 日,公司周年庆,抢了10 ...
- 【django】用户登录模块实现步骤(三)之QQ用户是否绑定项目用户的处理和QQ用户绑定项目用户功能实现【34】
一.判断openid是否绑定过⽤户 使⽤openid查询该QQ⽤户是否在芒果头条中绑定过⽤户. openid已绑定⽤户的处理: 如果openid已绑定芒果头条⽤户,直接⽣成状态保持信息,登录成功,并重 ...
- Redis在项目中的地位及使用场景剖析
Redis在项目中的地位及使用场景剖析 一. redis 特点 所有数据存储在内存中,高速读写 提供丰富多样的数据类型:string. hash. set. sorted set.bitmap.hyp ...
- Redis在项目中的使用及性能测试
强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan [前言] 在上篇博文中为大家分享了<SCPPO:C#中Redis封装的类>,有了这个 ...
最新文章
- Kirito 的博客崩了,这次是因为...
- java.lang.date_无法将java.lang.String类型的值转换为必需类型java.util.Date
- HTML5 网站大观:12个优秀的 HTML5 黑色风格网站设计
- CAS存在的问题以及解决方案
- PHP中过滤常用标签的正则表达式
- Python入门100题 | 第002题
- [2019.3.4]BZOJ1213 [HNOI2004]高精度开根
- C# OpenTK教程 - 1.2 你好三角形
- bluetooth记录
- mysql 多表删除
- vue跳转传参刷新后参数消失
- python-ImageDraw
- Kepware 安装CD光盘教程
- JDK安装 Java环境配置
- 利用 Python 进行量化投资分析 - 利率及风险资产的超额收益
- 壹沓科技签约全球快消品牌巨头保乐力加,为企业数智化升级注入新动能
- js中数组filter过滤奇偶数_js--数组的filter()过滤方法的使用
- Terraform指南:安装
- web性能测试基础(一)
- mysql配置和优化
热门文章
- 在html文件中以下使用绝对路径表示的是,JavaWeb——HTML5常用知识点
- Vue3.0 + typescript 高仿网易云音乐 WebApp
- 为什么用功率谱密度来描述随机信号?
- 联想G460笔记本触摸板驱动 For Windows 7 x64
- [转] 晚上一般什么时候睡觉?
- 【笔记:Spring】
- Qualcomm 音频学习一
- DICTATOR第一周排序部分作业
- 3.4.1 在物理层扩展以太网
- html向下滚动条,《html》不显示滚动条,鼠标滑轮可以控制向下滚动是怎么回事?...