laravel redis锁如何优化下

redis锁我加上了,
$script = “return redis.call(‘SET’, KEYS[1], ARGV[1], ‘NX’, ‘EX’, ARGV[2])”;
$lock = Redis::eval($script, 1,$lockkey, $lockval, 20);

当我现在有个问题,假设我有10000张票,很多人我加这个redis锁,每次就只能有一个人执行后面的抢票流程,能不能开始一段时间能很多人一起抢票,到最后100张的时候,因为要控制票数再加上redis锁,但此时最初的时间如何保证不会去重复写数据什么的?
我这样做感觉效率太慢了,有没有好的方案呢?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

我的想法是 10000張票 可以給redis 設置一個長度為10000的list 裡面的值隨便是啥 默認給1就好了 然後從這個list裡面 用redis 的 lpop 取值並刪除第一個元素 如果為nil 就是已經搶完了 如果拿到了值 就往下面走 如果失敗了 看是否是沒有了庫存 如果沒有庫存 可以直接刪除list 如果是業務邏輯出錯 或數據庫修改失敗的情況 就rpush 給list添加一個值 瞎想的....

1年前 评论
讨论数量: 10

你这执行效率得有多低,直接用乐观锁不行?

1年前 评论
donggan (楼主) 1年前
MArtian (作者) 1年前
donggan (楼主) 1年前
MArtian (作者) 1年前

可以使用漏斗哦,先放一部分人进来,正常抢票,在人数到达峰值以后在一个一个来

1年前 评论

file

redis 锁就好了(可以看下 laravel 的 cache lock),mysql 的 乐观锁 也可以加

1年前 评论

我的想法是 10000張票 可以給redis 設置一個長度為10000的list 裡面的值隨便是啥 默認給1就好了 然後從這個list裡面 用redis 的 lpop 取值並刪除第一個元素 如果為nil 就是已經搶完了 如果拿到了值 就往下面走 如果失敗了 看是否是沒有了庫存 如果沒有庫存 可以直接刪除list 如果是業務邏輯出錯 或數據庫修改失敗的情況 就rpush 給list添加一個值 瞎想的....

1年前 评论

加锁 + 队列 楼上的方法也是可参考的

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!