介绍
这篇文章主要讲解了通过复述的脚本lua实现抢红包功能的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
复述,从2.6版本开始,通过内嵌支持lua环境
- <李>减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络延迟李> <李>原子操作.redis将整个脚本当作一个整体去执行,中间不会被其他命令插入,无需担心脚本执行过程中会出现竞态条件李> <李>复用。客户端发送的脚本会永久保存在复述中,可以复用这一脚本李>
简单两张表,一个红包表,一个红包领取记录表
创建表“t_red_envelope”( “id”bigint (20) NOT NULL AUTO_INCREMENT评论& # 39;id # 39; 数量的小数(10,2)默认空评论& # 39;金额& # 39;, “num”int(11)默认空评论& # 39;数量(分割成几分)& # 39;, create_time的datetime默认空评论& # 39;创建时间& # 39;, update_time的datetime默认空评论& # 39;更新时间& # 39;, 主键(“id”) )引擎=InnoDB AUTO_INCREMENT=10默认字符集=utf8mb4评论=& # 39;红包& # 39; 创建表“t_red_envelope_record”( “id”bigint (20) NOT NULL AUTO_INCREMENT评论& # 39;id # 39; user_id的bigint(20)默认空评论& # 39;用户id # 39;, “奖励”十进制(10,2)默认空评论& # 39;领取到奖励& # 39;, red_envelope_id的bigint(20)默认空评论& # 39;红包id # 39;, create_time的datetime默认空评论& # 39;创建时间& # 39;, update_time的datetime默认空评论& # 39;更新时间& # 39;, 主键(“id”) )引擎=InnoDB AUTO_INCREMENT=11默认字符集=utf8mb4评论=& # 39;红包领取记录& # 39;
首先,生成一个红的包,将其分成指定数量的随机小红的包,以列表结构(信封:redEnvelopeId:红作包id为键)存储在里德中(以便抢红包弹出数据)
公共字符串grabRedEnvelope (userId,长redEnvelopeId) { DefaultRedisScript,redisScript=new DefaultRedisScript<的在(); redisScript.setResultType (String.class); redisScript.setScriptText (LuaScript.redLua); List keyList=new ArrayList ();/* * *产生的小红包键 */keyList.add(“信封:redEnvelopeId:“;+ redEnvelopeId);/* * *红包领取记录的关键 */keyList.add(“信封:记录:“;+ redEnvelopeId); keyList.add (“;“+ userId); keyList.add (String.valueOf (userId));/* * * 1已经抢到红红包2包已经完了,其余是抢到红包并返回红包余额 */=stringRedisTemplate字符串结果。执行(redisScript keyList); 返回结果; } 通过复述的脚本lua实现抢红包功能的方法