电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java使用Redis實現(xiàn)秒殺功能

瀏覽:7日期:2022-08-23 14:24:44

秒殺功能

秒殺場景現(xiàn)在已經(jīng)非常常見了,各種電商平臺都有秒殺的產品,接下來我們模擬一個秒殺的項目,最終能夠確保高并發(fā)下的線程安全。界面比較簡單,但是功能基本實現(xiàn)。

界面

Java使用Redis實現(xiàn)秒殺功能

點擊“秒殺點我”按鈕后臺就會輸出秒殺結果。

Java使用Redis實現(xiàn)秒殺功能

第一版

使用Redis緩存數(shù)據(jù)庫,使用一個key-value存儲秒殺商品數(shù)量,使用set集合存儲秒殺成功的用戶。我們以商品0101為示例,設置商品的初始數(shù)量為200件。不考慮并發(fā)問題,實現(xiàn)功能。

html、jsp、servlet文件不重要省略。

package com.redis.secondskill; import java.util.List; import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.Transaction; public class SS0 { public static boolean doSecKill(String uid,String prodid) { JedisPool jedisPool = JedisPollTool.getInstance(); Jedis jedis = jedisPool.getResource(); String productCountStr = 'sec:'+prodid+':count'; String productUserStr = 'sec:'+prodid+':user'; String productCount = jedis.get(productCountStr); if(null == productCount) { System.out.println('秒殺還沒有開始'); JedisPollTool.distroy(jedisPool, jedis); return false; } if(jedis.sismember(productUserStr, uid)) { System.out.println(uid + '用戶已經(jīng)秒殺成功'); JedisPollTool.distroy(jedisPool, jedis); return false; } int prodCount = Integer.parseInt(productCount); if(prodCount <= 0) { System.out.println('秒殺結束'); JedisPollTool.distroy(jedisPool, jedis); return false; } jedis.decr(productCountStr); jedis.sadd(productUserStr, uid); JedisPollTool.distroy(jedisPool, jedis); System.out.println(uid + '秒殺成功'); return true; }}

使用linux httpd-tools工具進行并發(fā)測試。

ab -n 1000 -c 200 -p /test/file.txt -T 'application/x-www-form-urlencoded' 192.168.0.101:8080/redis-demo/ss

結果

Java使用Redis實現(xiàn)秒殺功能

從結果大致來看,沒有什么問題,來查看一個后臺Redis的數(shù)據(jù)

秒殺的結果里面居然有負數(shù),證明賣超了。

Java使用Redis實現(xiàn)秒殺功能

第二版

使用Redis的事務,保證沒有超賣的情況發(fā)生。

package com.redis.secondskill; import java.util.List; import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.Transaction; public class SS1 { public static boolean doSecKill(String uid,String prodid) { JedisPool jedisPool = JedisPollTool.getInstance(); Jedis jedis = jedisPool.getResource(); String productCountStr = 'sec:'+prodid+':count'; String productUserStr = 'sec:'+prodid+':user'; jedis.watch(productCountStr); //開始監(jiān)視 String productCount = jedis.get(productCountStr); if(null == productCount) { System.out.println('秒殺還沒有開始'); JedisPollTool.distroy(jedisPool, jedis); return false; } if(jedis.sismember(productUserStr, uid)) { System.out.println(uid + '用戶已經(jīng)秒殺成功'); JedisPollTool.distroy(jedisPool, jedis); return false; } int prodCount = Integer.parseInt(productCount); if(prodCount <= 0) { System.out.println('秒殺結束'); JedisPollTool.distroy(jedisPool, jedis); return false; } Transaction transaction = jedis.multi(); transaction.decr(productCountStr); transaction.sadd(productUserStr, uid); List<Object> exec = transaction.exec(); if(exec == null || exec.size() == 0) { System.out.println('秒殺失敗,稍后重試'); JedisPollTool.distroy(jedisPool, jedis); return false; } JedisPollTool.distroy(jedisPool, jedis); System.out.println(uid + '秒殺成功'); return true; }}

結果

Java使用Redis實現(xiàn)秒殺功能

由于使用了watch和事務,每次的并發(fā)線程訪問中只有一個線程能夠提交成功,可以保證不出現(xiàn)超賣的現(xiàn)象,但是對于一些用戶來說是極其不公平的。

第三版

使用Lua腳本來實現(xiàn),因為Redis是單線程的,又是C語言編寫的,可以使用Lua調用Redis的命令,Lua會具有排他性,所以能夠保證安全。

package com.redis.secondskill; import java.util.HashSet;import java.util.Set; import redis.clients.jedis.HostAndPort;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool; public class SS2 { static String luaScript ='local userid=KEYS[1];rn' + 'local prodid=KEYS[2];rn' + 'local qtkey=’sec:’..prodid..':count';rn' + 'local usersKey=’sec:’..prodid..':user';rn' + 'local userExists=redis.call('sismember',usersKey,userid);rn' + 'if tonumber(userExists)==1 then rn' + ' return 2;rn' + 'endrn' + 'local num = redis.call('get' ,qtkey);rn' + 'if tonumber(num)<=0 then rn' + ' return 0;rn' + 'else rn' + ' redis.call('decr',qtkey);rn' + ' redis.call('sadd',usersKey,userid);rn' + 'endrn' + 'return 1' ; public static boolean doSecKill(String uid,String prodid) { JedisPool jedisPool = JedisPollTool.getInstance(); Jedis jedis = jedisPool.getResource(); String sha1 = jedis.scriptLoad(luaScript); Object result= jedis.evalsha(sha1, 2, uid,prodid); String reString=String.valueOf(result); if ('0'.equals( reString ) ) { System.err.println('已搶空!!'); }else if('1'.equals( reString ) ) { System.out.println(uid + '搶購成功!!!!'); }else if('2'.equals( reString ) ) { System.err.println('該用戶已搶過!!'); }else{ System.err.println('搶購異常!!'); } JedisPollTool.distroy(jedisPool, jedis); return true; }}

結果

Java使用Redis實現(xiàn)秒殺功能

這才是我們最希望看到的結果!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Java
相關文章:
主站蜘蛛池模板: 南京种植牙医院【官方挂号】_南京治疗种植牙医院那个好_南京看种植牙哪里好_南京茀莱堡口腔医院 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | China plate rolling machine manufacturer,cone rolling machine-Saint Fighter | 比士亚-专业恒温恒湿酒窖,酒柜,雪茄柜的设计定制 | 软膜天花_软膜灯箱_首选乐创品牌_一站式天花软膜材料供应商! | 深圳品牌设计公司-LOGO设计公司-VI设计公司-未壳创意 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 优秀的临床医学知识库,临床知识库,医疗知识库,满足电子病历四级要求,免费试用 | 氧化锆陶瓷_氧化锆陶瓷加工_氧化锆陶瓷生产厂家-康柏工业陶瓷有限公司 | 高铝轻质保温砖_刚玉莫来石砖厂家_轻质耐火砖价格 | 六维力传感器_六分量力传感器_模腔压力传感器-南京数智微传感科技有限公司 | 喷涂流水线,涂装流水线,喷漆流水线-山东天意设备科技有限公司 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 继电器模组-IO端子台-plc连接线-省配线模组厂家-世麦德 | 压缩空气检测_气体_水质找上海京工-服务专业、价格合理 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 | 五轴加工中心_数控加工中心_铝型材加工中心-罗威斯 | 维泰克Veertek-锂电池微短路检测_锂电池腐蚀检测_锂电池漏液检测 | 恒温槽_恒温水槽_恒温水浴槽-上海方瑞仪器有限公司 | 烽火安全网_加密软件、神盾软件官网 | 大_小鼠elisa试剂盒-植物_人Elisa试剂盒-PCR荧光定量试剂盒-上海一研生物科技有限公司 | 电地暖-电采暖-发热膜-石墨烯电热膜品牌加盟-暖季地暖厂家 | 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | 拉曼光谱仪_便携式|激光|显微共焦拉曼光谱仪-北京卓立汉光仪器有限公司 | 浙江工业冷却塔-菱电冷却塔厂家 - 浙江菱电冷却设备有限公司 | 恒温油槽-恒温水槽-低温恒温槽厂家-宁波科麦仪器有限公司 | Copeland/谷轮压缩机,谷轮半封闭压缩机,谷轮涡旋压缩机,型号规格,技术参数,尺寸图片,价格经销商 CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 全自动包衣机-无菌分装隔离器-浙江迦南科技股份有限公司 | 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 广东佛电电器有限公司|防雷开关|故障电弧断路器|智能量测断路器 广东西屋电气有限公司-广东西屋电气有限公司 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 横河变送器-横河压力变送器-EJA变送器-EJA压力变送器-「泉蕴仪表」 | 合肥触摸一体机_触摸查询机厂家_合肥拼接屏-安徽迅博智能科技 | 分光色差仪,测色仪,反透射灯箱,爱色丽分光光度仪,美能达色差仪维修_苏州欣美和仪器有限公司 | 右手官网|右手工业设计|外观设计公司|工业设计公司|产品创新设计|医疗产品结构设计|EMC产品结构设计 | 快速门厂家-快速卷帘门-工业快速门-硬质快速门-西朗门业 | 贝壳粉涂料-内墙腻子-外墙腻子-山东巨野七彩贝壳漆业中心 | pH污水传感器电极,溶解氧电极传感器-上海科蓝仪表科技有限公司 | 顺景erp系统_erp软件_erp软件系统_企业erp管理系统-广东顺景软件科技有限公司 | 溶氧传感器-pH传感器|哈美顿(hamilton) | 水厂污泥地磅|污泥处理地磅厂家|地磅无人值守称重系统升级改造|地磅自动称重系统维修-河南成辉电子科技有限公司 |