千家信息网

Redis+lua进行类似秒杀的实现

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,Redis+lua进行类似秒杀的实现由于项目需要,需要多线程去获取和修改数据库的库存,考虑到给数据库加锁效率低,所以采用redis+lua来进行实现 。redis的单线程操作特性来执行lua脚本,通过
千家信息网最后更新 2026年10月31日Redis+lua进行类似秒杀的实现

Redis+lua进行类似秒杀的实现

由于项目需要,需要多线程去获取和修改数据库的库存,考虑到给数据库加锁效率低,所以采用redis+lua来进行实现 。

redis的单线程操作特性来执行lua脚本,通过lua脚本来保证原子性。如果通过单纯的redis指令来进行更改,在读和写之间会存在多线程并发更新的问题。

1.首先定义redis数据结构

goodId: { "total":100, "released":0; }
  • 其中goodId为商品id号,可根据此来查询相关的数据结构信息,total为总数,released为发放出去的数量,可使用数为total-released

    2.编写lua脚本
    local n = tonumber(ARGV[1])if not n or n == 0 thenreturn 0endlocal vals = redis.call("HMGET", KEYS[1], "total", "released");local total = tonumber(vals[1])local blocked = tonumber(vals[2])if not total or not blocked thenreturn 0endif blocked + n <= total thenredis.call("HINCRBY", KEYS[1], "released", n)return n;endreturn 0
- 执行脚本命令`EVAL script_string 1 goodId apply_count`- 若库存足够则返回申请的数量,否则返回0,不返回可满足的剩余数3.spring boot 调用 - pom dependency 

org.springframework.boot
spring-boot-starter-data-redis
2.0.1.RELEASE

- java code```java        long count = redisHelper.getStrCache().execute(new RedisCallback() {            @Nullable            @Override            public Long doInRedis(RedisConnection redisConnection) throws DataAccessException {                long ret = redisConnection.eval(script.getScriptAsString().getBytes(), ReturnType.INTEGER, 1, key.getBytes(), String.valueOf(count).getBytes());                return ret;            }        });

4.redis->database

针对redis到databases的更新,思考了很久,没有找到较好的解决办法,先采用定时任务异步更新。至于数据是否丢失的问题,如果redis挂了,重启后redis会恢复数据,等下次定时任务就可以将数据库中的数据保持一致,缺点是redis挂了秒杀活动会失败。

至于redis到database更新的如何驱动,列出两种愚见:

  • redis存一份相关hash键名单表,通过读取名单表来读取更新
  • 通过流式读取databases中的表来读取更新。

欢迎各位提出问题,谢谢您的阅读

数据 更新 脚本 数据库 线程 问题 任务 名单 库存 数据结构 数量 结构 一致 之间 信息 办法 原子 命令 商品 总数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 有格互联网科技 互联网科技工作委员会副主任毛军 科技和互联网公司 金融科技与互联网金融 互联网金融 科技金融 科技创新互联网企业 奔汉互联网科技 兼蜜互联网科技 金融科技和互联网金融 互联网科技股午盘股票涨跌 华中科技有哪些互联网大佬 互联网科技与管理 晓花互联网科技有限公司网址 滨湖区互联网智能科技产品有哪些 互联网方面的科技前沿 山东子淼互联网科技有限公司 风投北京互联网科技 35岁以上互联网科技行业 互联网科技包装股份有限公司上市 济南小医互联网科技有限公司招聘 广东万易互联网科技有限公司惠州分公司 深圳九邦互联网科技有限公司 高科技互联网 深圳互联网络科技有限公司 艾特科技互联网 互联网科技视频素材 玖二柒互联网科技公司待遇 互联网科技和信息 玉溪新华互联网科技好不好 互联网科技平台产品运营
0