亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

通過redis的腳本lua如何實現搶紅包功能

2020-10-28 21:27:52
字體:
來源:轉載
供稿:網友

redis 腳本介紹

Redis從2.6版本開始,通過內嵌支持Lua環境

好處

  • 減少網絡開銷??梢詫⒍鄠€請求通過腳本的形式一次發送,減少網絡延遲
  • 原子操作。redis將整個腳本當作一個整體去執行,中間不會被其他命令插入,無需擔心腳本執行過程中會出現競態條件
  • 復用。客戶端發送的腳本會永久保存在redis中,可以復用這一腳本

數據庫表設計

簡單兩張表,一個紅包表,一個紅包領取記錄表

CREATE TABLE `t_red_envelope` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', `amount` decimal(10,2) DEFAULT NULL COMMENT '金額', `num` int(11) DEFAULT NULL COMMENT '數量(分割成幾分)', `create_time` datetime DEFAULT NULL COMMENT '創建時間', `update_time` datetime DEFAULT NULL COMMENT '更新時間', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COMMENT='紅包'CREATE TABLE `t_red_envelope_record` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `user_id` bigint(20) DEFAULT NULL COMMENT '用戶id', `reward` decimal(10,2) DEFAULT NULL COMMENT '領取到獎勵', `red_envelope_id` bigint(20) DEFAULT NULL COMMENT '紅包id', `create_time` datetime DEFAULT NULL COMMENT '創建時間', `update_time` datetime DEFAULT NULL COMMENT '更新時間', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COMMENT='紅包領取記錄'

代碼編寫

首先,生成一個紅包,將其分成指定數量的隨機小紅包,以list結構(envelope:redEnvelopeId:紅包id作為key)存儲在reids中(以便搶紅包彈出數據)

 public Long divideRedEnvelope(int amount, int num) {  /**   * 每個人至少分到一分錢,如果有2000分,6人,隨機得到五個小于1994(2000-6)的數   * 比如 a1=4,a2=120,a3=324,a4=500,a5=700(隨機拿到的五個數進行排序),那么紅包錢分別為: a1+1,a2-a1+1,a3-a2+1,a4-a3+1,a5-a4+1,1994-a5+1(總和剛好為2000)   */  RedEnvelope redEnvelope = new RedEnvelope();  redEnvelope.setAmount(new BigDecimal(amount));  redEnvelope.setNum(num);  redEnvelope.setCreateTime(new Date());  redEnvelope.setUpdateTime(new Date());  redEnvelopeDao.insert(redEnvelope);  /**   * 拿來隨機分的,按分來算   */  int totalAmount = amount * 100 - num;  /**   * 隨機數   */  int[] randomNum = new int[num - 1];  /**   * 紅包金額   */  int[] redEnvelopeAmount = new int[num];  for (int i = 0; i < num - 1; i++) {   int rand = new Random().nextInt(totalAmount);   randomNum[i] = rand;  }  Arrays.sort(randomNum);  /**   * 條件語句分別分配的第一個、最后一個、中間的紅包   */  for (int i = 0; i < num; i++) {   if (i == 0) {    redEnvelopeAmount[i] = randomNum[i] + 1;   } else if (i == num - 1) {    redEnvelopeAmount[i] = totalAmount - randomNum[i - 1] + 1;   } else {    redEnvelopeAmount[i] = randomNum[i] - randomNum[i - 1] + 1;   }  }  /**   * 產生的小紅包key,以list存儲在reids中   */  String key = "envelope:redEnvelopeId:" + redEnvelope.getId();  Boolean flag = stringRedisTemplate.hasKey(key);  if (!flag) {   for (Integer i : redEnvelopeAmount) {    stringRedisTemplate.opsForList().leftPush(key, i + "");   }  }  return redEnvelope.getId(); }

搶紅包時,根據用戶userId和紅包id,生成KEYS[1]、KEYS[2]、KEYS[3] (存儲小紅包的key、領取紅包記錄的key、用戶userId的key)傳入腳本中。

​     1、先判斷該用戶是否搶過紅包,有則返回-1,沒有則從紅包列表取出一個小紅包

​     2、步驟1的小紅包如果為空,則表明紅包已經沒搶光,返回 -2

​     3、否則返回取出的小紅包金額

 public String grabRedEnvelope(Long userId, Long redEnvelopeId) {  DefaultRedisScript<String> redisScript = new DefaultRedisScript<>();  redisScript.setResultType(String.class);  redisScript.setScriptText(LuaScript.redLua);  List<String> keyList = new ArrayList();  /**   * 產生的小紅包key   */  keyList.add("envelope:redEnvelopeId:" + redEnvelopeId);  /**   * 紅包領取記錄key   */  keyList.add("envelope:record:" + redEnvelopeId);  keyList.add("" + userId);  keyList.add(String.valueOf(userId));  /**   * -1 已經搶到紅包 -2 紅包已經完了 ,其余是搶到紅包并返回紅包余額   */  String result = stringRedisTemplate.execute(redisScript, keyList);  return result; }

實現搶紅包的Lua腳本

public class LuaScript { /**  * -1 已經搶到紅包 -2 紅包被搶光 re 紅包金額 ,keys[1]、keys[2]、keys[3]分別為存儲小紅包的key、紅包領取記錄key、用戶id  */ public static String redLua = "if redis.call('hexists',KEYS[2],KEYS[3]) ~=0 then /n" +   " return '-1';/n" +   " else /n" +   "local re=redis.call('rpop',KEYS[1]);/n" +   "if re then/n" +   "redis.call('hset',KEYS[2],KEYS[3],1);/n" +   "return re;/n" +   "else/n" +   "return '-2';/n" +   "end/n" +   "end";}

測試

首先通過接口分配紅包生成一個100塊、份額為10份的紅包,并將其mysql數據庫和redis

通過jmeter進行壓測搶紅包

結果

github代碼鏈接

鏈接

總結

到此這篇關于通過redis的腳本lua如何實現搶紅包功能的文章就介紹到這了,更多相關redis的腳本lua實現搶紅包內容請搜索武林網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩午夜剧场| 欧美成人免费大片| 大荫蒂欧美视频另类xxxx| 日韩欧美在线免费观看| 全色精品综合影院| 欧美亚洲日本网站| 欧美二区在线播放| 精品毛片三在线观看| 日本高清视频精品| 在线视频国产日韩| 青青草国产精品一区二区| 2019亚洲日韩新视频| 国产+成+人+亚洲欧洲| 日韩精品在线视频| 日韩精品极品视频免费观看| 日韩国产欧美精品一区二区三区| 欧美激情一级精品国产| 亚洲天堂av在线播放| 九九热精品视频| 亚洲欧美国产日韩天堂区| 丝袜美腿亚洲一区二区| 久久久久久久999| 在线播放日韩欧美| 亚洲第一区第一页| 性色av一区二区三区红粉影视| 国产日韩视频在线观看| 中文字幕在线看视频国产欧美在线看完整| 视频在线观看一区二区| 日韩欧美国产黄色| 欧美理论电影网| 精品日本美女福利在线观看| 欧美在线一级va免费观看| 日韩精品有码在线观看| 成人综合网网址| 国产欧美va欧美va香蕉在线| 日韩女优在线播放| 亚洲品质视频自拍网| 精品久久久久久久大神国产| 亚洲天堂av在线免费观看| 国产精品一区二区三区毛片淫片| 欧美性高跟鞋xxxxhd| 国产成人福利视频| 国产精品爽爽爽| 26uuu亚洲国产精品| xx视频.9999.com| 欧美日韩中文字幕在线| 久久久久久国产免费| 亚洲精品久久视频| 国产日韩精品入口| 亚洲香蕉成人av网站在线观看| 中文字幕欧美视频在线| 日韩av电影在线免费播放| 成人久久18免费网站图片| 精品久久久久久久久久久久久| 久久精品电影网| 色婷婷成人综合| 奇米成人av国产一区二区三区| 亚洲免费福利视频| 一夜七次郎国产精品亚洲| 国产精品十八以下禁看| 亚洲新中文字幕| 91在线高清免费观看| 亚洲精品一区二区久| 欧美亚洲另类视频| 国产91对白在线播放| 国产精品精品视频一区二区三区| 欧美性猛交xxxx乱大交| 国产精品偷伦免费视频观看的| 日韩中文字幕免费视频| 日韩av在线免播放器| 欧美激情一级精品国产| 久久露脸国产精品| 成人美女免费网站视频| 国产精品国模在线| 国产精品亚洲欧美导航| 亚洲精品国产精品自产a区红杏吧| 欧美大秀在线观看| 68精品国产免费久久久久久婷婷| 国产xxx69麻豆国语对白| 日韩精品极品在线观看播放免费视频| 亚洲电影中文字幕| 9.1国产丝袜在线观看| 91精品国产综合久久香蕉922| 欧美插天视频在线播放| 韩剧1988免费观看全集| 欧美电影免费观看| 久久香蕉国产线看观看av| 欧美韩日一区二区| 欧美激情亚洲精品| 欧美国产日韩一区二区在线观看| 欧美性开放视频| 国产成人自拍视频在线观看| 日韩av电影免费观看高清| 国产精品白丝av嫩草影院| 久久综合免费视频影院| 国产69精品久久久久9999| 性欧美xxxx视频在线观看| 精品久久久久久久久久久久久久| 欧美怡红院视频一区二区三区| 日韩av综合中文字幕| 色综合伊人色综合网站| 国产在线视频不卡| 欧美一乱一性一交一视频| 亚洲自拍av在线| 91免费看国产| 国产精品色悠悠| 不卡av在线网站| www.精品av.com| 97视频网站入口| 丝袜一区二区三区| 精品视频9999| 亚洲欧美日韩精品| 26uuu日韩精品一区二区| 亚洲人成在线播放| 中文字幕日本欧美| 日韩电影免费观看在线观看| 亚洲综合第一页| 91精品久久久久久久久久久久久久| 亚洲aaa激情| 91九色国产社区在线观看| 成人免费视频网| 欧美日韩免费区域视频在线观看| 欧美多人乱p欧美4p久久| 久久久久久久av| 91久久国产精品91久久性色| 亚洲**2019国产| 亚洲成人精品久久| 精品女厕一区二区三区| 亚洲日韩第一页| 国产精品亚洲一区二区三区| 欧美成人精品一区| 久久久精品2019中文字幕神马| 91精品久久久久久综合乱菊| 亚洲欧洲成视频免费观看| 欧美激情二区三区| 韩国19禁主播vip福利视频| 亚洲国产精品va在线观看黑人| 97精品国产97久久久久久免费| 国产拍精品一二三| 欧美成人在线影院| 日韩在线免费视频观看| 日韩专区在线观看| 中文字幕精品久久久久| 国产精品大片wwwwww| 欧美极品少妇xxxxⅹ免费视频| 国产精品久久久久久一区二区| 欧美极度另类性三渗透| 亚洲成成品网站| 日韩中文字幕不卡视频| 亚洲第一综合天堂另类专| 亚洲va欧美va国产综合久久| 久久久久久久久国产| 欧美一级在线亚洲天堂| 久久综合久久美利坚合众国| 九九热在线精品视频| 夜夜狂射影院欧美极品| 国产精品夜色7777狼人| 色偷偷噜噜噜亚洲男人的天堂| 日韩精品亚洲元码| 92国产精品久久久久首页| 亚洲电影免费观看高清完整版在线观看| 亚洲国产一区二区三区四区| 粗暴蹂躏中文一区二区三区| 亚洲第一精品自拍|