iT邦幫忙

1

Node.js Redis 商品秒殺問題

  • 分享至 

  • xImage

小弟剛接觸 Redis,對 Sorted Set 的機制有點不太清楚
因為先前看到有文章說可以用下面的方法來實現 Redis 商品秒殺問題:

  1. 先把秒殺活動要用的庫存同步到 Redis Sorted Set(有序集合)
  2. 用戶購買的庫存放入有長度限制的 Sorted Set
  3. 秒殺到指定數量後,Sorted Set 不再接受請求
  4. 活動結束後將 Redis 數據同步到關聯式資料庫

我這邊也嘗試用 Node.js 的 Redis 來呈現步驟 2、3 的邏輯,但都會有超賣的結果,想詢問如何修正呢?

const redis = require("redis");
var client = redis.createClient();

client.on("error", function (error) {
    console.error(error);
});
const max = 20;//最大筆數(商品庫存)

function add () {
    client.watch("item", function (err) {
        if (err) throw err;
        client.zcard('item', function (err, reply) {
            if (err) throw err;
            if (reply < max) {
                client.multi().
                    zadd("item", new Date().getTime(), JSON.stringify({ "guid": "GG", "time": new Date().getTime() })).
                    exec(function (err, results) {
                        if (err) throw err;
                        console.log(results);
                    });
            }
        });
    });
}
function main () {
    for (var i = 0; i < 999; i++) {
        add();
    }
}

main();

https://ithelp.ithome.com.tw/upload/images/20210818/20103256EChpZYp4Vj.png

最後我是用這種方式解決:https://medium.com/dean-lin/e814fe26a0f2
如果描述有誤,或是有更好的解決方式,再麻煩版上大神不吝賜教,感謝。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友回答

立即登入回答