目录

1.什么是lua

2.为什么是lua

3.抢令牌的业务场景 + 代码实现


1.什么是lua

撸啊(Lua)是一门小巧的脚本语言,它的主要特点是轻量级、可扩展。主要应用场景是:游戏开发、独立应用脚本、Web 应用脚本。lua还有一个重要的特点是可以轻松嵌入到其他开发语言中。lua脚本语句比较简单,语句风格和C语言类似,可以通过Lua在线工具进行语言试验。 Redis 2.6.0 版本开始的,使用内置的 Lua 解释器,可以对 Lua 脚本进行求值。

2.为什么是lua

介绍了这么多究竟为什么要使用redis+lua实现秒杀场景呢?

因为在秒杀场景中需要有优惠券信息列表、已成功抢券用户表,采用redis存储的优势是读取快。而Lua操作是原子性的,只要将1. 验证用户是不是已经成功抢券 、2.券数量减一 、3.在已成功抢券用户表中添加当前用户 这三个逻辑放到lua脚本中便可以保证数据的准确性,能够合理的避免高并发下一券多发、库存错误等情况。所以redis+lua二者结合可以完美实现秒杀的业务需求。

3.抢令牌的业务场景 + 代码实现

redis+lua的配方不止适用于秒杀场景,本文实战的场景是一个抽象的抢令牌模型,实现的语言是java+redis+lua

完整的业务是这样滴:

乐淘商城有10个客服,后台需要保证每次前台请求都返回一个客服的id,且每个客服服务的客户数量要平均。

具体实现方案:

1.每天凌晨将客服id放到reids list中

2.请求时返回第一个id,同时将此id插入到list队尾,同时删除此id(维护一个循环队列)

代码实现:

lua脚本,将脚本保存到以.lua结尾的文件中,保存到系统能加载的路径下

--- Created by Administrator.
--- DateTime: 2020/04/20 19:46
--- 获取队尾第一个数据,并删除,将删除的数插入队头local key = KEYS[1]
if (redis.call("EXISTS", key) == 0 ) thenreturn "defaultErrorCode"
elselocal val = redis.call("RPOP", key)redis.call("LPUSH",key,val)return val
end

lua文件要在redisConfig中做为资源配置

@Configuration
public class RedisConfig {@Beanpublic DefaultRedisScript<Long> redisScript() {DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/employeeAgent.lua")));redisScript.setResultType(Long.class);return redisScript;}
}

java代码需要调用RedisTemplate和DefaultRedisScript两个对象,lua脚本是以资源文件的形式引入的。

@Autowired
private RedisTemplate redisTemplate;
@Resource
private DefaultRedisScript<Long> redisScript;public void getEmployeeAgent() {String redisKey = "testKey";if(!redisTemplate.hasKey(redisKey)){List<String> employeeInfoList = Arrays.asList("1","2","3","4","5","6","7","8","9","10");if(EmptyUtil.isNotEmpty(employeeInfoList)){redisTemplate.opsForList().leftPushAll(redisKey,employeeInfoList);redisTemplate.expire(redisKey,Constant.FORTY_EIGHT, TimeUnit.HOURS);}}ArrayList<String> keys = Lists.newArrayList();keys.add(redisKey);String result = (String)redisTemplate.execute(redisScript, keys);}

经过测试后id是有序且平均分配。看看!用这么少的代码就可以实现那么有挑战性的需求,所以lua+redis可真是一个宝藏组合!

下次面试官再问你如何实现秒杀,大声的告诉他撸啊!

参考资料:

Lua 教程
Redis EVAL简介

Lua在线工具


“撸啊”不止能秒杀!| lua+redis实现高并发抢令牌相关推荐

  1. Java高并发秒杀API(四)之高并发优化

    Java高并发秒杀API(四)之高并发优化 1. 高并发优化分析 关于并发 并发性上不去是因为当多个线程同时访问一行数据时,产生了事务,因此产生写锁,每当一个获取了事务的线程把锁释放,另一个排队线程才 ...

  2. Nginx与Redis解决高并发问题

    Nginx与Redis解决高并发问题 参考文章: (1)Nginx与Redis解决高并发问题 (2)https://www.cnblogs.com/nucdy/p/5516511.html 备忘一下.

  3. Redis面试 - 如何保证 redis 的高并发和高可用?

    面试题 如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍一下么?redis 的哨兵原理能介绍一下么? 面试官心理分析 其实问这个问题,主要是考考你,redis 单机能承载多高并 ...

  4. 【5. Redis的高并发高可用】

    Redis的高并发高可用 复制 ​ 在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求.Redis也是如此,它为我们提供了复制功能,实现了相同数据的多 ...

  5. Redis解决高并发(秒杀抢红包)

    1,Redis 丰富的数据结构(Data Structures) 字符串(String) Redis字符串能包含任意类型的数据 一个字符串类型的值最多能存储512M字节的内容 利用INCR命令簇(IN ...

  6. php redis incr秒杀,Redis瞬时高并发秒杀方案总结

    1.Redis 丰富的数据结构(Data Structures) 字符串(String) Redis字符串能包含任意类型的数据;: 一个字符串类型的值最多能存储512M字节的内容: 利用INCR命令簇 ...

  7. 利用redis + lua解决抢红包高并发的问题

    转自 http://blog.csdn.net/hengyunabc/article/details/19433779/ 抢红包的需求分析 抢红包的场景有点像秒杀,但是要比秒杀简单点. 因为秒杀通常要 ...

  8. redis + lua解决抢红包高并发的问题

    原文:http://blog.csdn.net/hengyunabc/article/details/19433779/ 抢红包的场景有点像秒杀,但是要比秒杀简单点. 因为秒杀通常要和库存相关.而抢红 ...

  9. redis解决“高并发定时秒杀”库存误差问题

    前言:高并发的秒杀活动中,通过查询数据库判断是否还有库存,然后对库存字段进行增减,极易出现库存超出或者库存为负的情况,一般来说有3中解决办法(数据库表加锁,memche缓存,redis队列): 我们这 ...

最新文章

  1. 全球IP地址数周内用完,或现无法上网情况
  2. 关于FluentNhibernate数据库连接配置,请教
  3. cd linux盒上盖子不休眠,CDLinux 自动休眠功能的关闭方法
  4. python俄罗斯方块课程设计报告_用python实现俄罗斯方块
  5. html字符串生成器源代码
  6. mPaaS:全新移动开发平台,只为打造性能更优越的App
  7. git如何查看和切换账号
  8. 使用 pandas读取 excel 文件的数据
  9. Warning the user/local/mysql/data directory is not owned by the mysql user
  10. DatePickerDialog的确定和取消按钮
  11. php挂马攻击,PHP批量挂马脚本
  12. 恢复Visual SourceSafe已删除的文件
  13. 积极主动沟通说话交流的重要性和案例以及技巧
  14. 博客9-16CSS 三大特性
  15. 什么是高并发?高并发解决方案
  16. windows11 git 安装SSH密钥
  17. 用python实现词语接龙游戏
  18. FFmpeg从视频中提取音频保存为mp3文件
  19. 联想拯救者R7000P开箱检查测试
  20. android+信号强度,Android信号强度计算方式

热门文章

  1. Web API 之 — Beacon
  2. 研发效能度量的正确姿势与落地实践(演讲PPT分享版)
  3. 树莓派瞎折腾[1]-实现简单的命令行音乐播放器
  4. H5 移动APP - 面包店
  5. 用计算机弹天空之城谱子,最简单的钢琴曲_天空之城超简单版本钢琴谱
  6. 关于《冬天时我喜欢靠近温暖的事》这首歌 (民谣在路上)
  7. hiho1718(LIS)
  8. 网络直播不应只是秀场,新的场景机会在哪?
  9. 基于SpringBoot架构的心理健康测试系统(免费获取源码+项目介绍+运行介绍+运行截图+论文)
  10. 蚂蚁金服副CTO胡喜ATEC上宣布:蚂蚁金服技术全面开放