千家信息网

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

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,Redis+lua进行类似秒杀的实现由于项目需要,需要多线程去获取和修改数据库的库存,考虑到给数据库加锁效率低,所以采用redis+lua来进行实现 。redis的单线程操作特性来执行lua脚本,通过
千家信息网最后更新 2025年12月01日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安全错误 数据库的锁怎样保障安全 数据库软件是客户端还是服务器 气象局网络安全总结 国家三级计算机网络技术视频 我的世界微软登录服务器 在外边连接无线网络安全吗 csgo为什么变成韩国服务器 服务器安全性怎么检查 防病毒统一管理服务器 在网络安全领域怎么学习 KTV的网络安全吗 中国各地的网络安全周 vba数据库怎么查询表 华为运营商服务器集采 软件开发合同付款 依据 大学法制展馆软件开发 网络安全四种攻击方式 软件开发后的应用 密码学与网络安全前沿 cdn加速服务器节点出租 临沂app软件开发公司服务至上 兆日科技是网络安全股吗 去哪找气象数据库 如何做服务器之间的免密 csgo为什么变成韩国服务器 网络安全宣传周活动宣传稿件 企业网站服务器的规划方案 小学网络安全教育的制度 数据库查数据次数放在新表里 csgo提示连接不了官方服务器 数据库共享池高速缓存的作用
0