通过复述的脚本lua实现抢红包功能的方法

  介绍

这篇文章主要讲解了通过复述的脚本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);
  ListkeyList=new ArrayList ();/* *
  *产生的小红包键
  */keyList.add(“信封:redEnvelopeId:“;+ redEnvelopeId);/* *
  *红包领取记录的关键
  */keyList.add(“信封:记录:“;+ redEnvelopeId);
  keyList.add (“;“+ userId);
  keyList.add (String.valueOf (userId));/* *
  * 1已经抢到红红包2包已经完了,其余是抢到红包并返回红包余额
  */=stringRedisTemplate字符串结果。执行(redisScript keyList);
  返回结果;
  }

通过复述的脚本lua实现抢红包功能的方法