Alice52 / database

ddf13ad8d4be76a80a336418b5cf5727bf6e3059
gitee.com
MIT License
0 stars 0 forks source link

[redis] string #64

Closed Alice52 closed 3 years ago

Alice52 commented 3 years ago

1. 减库存

  1. 可以使用 tryLock() 对 get 和 decr 加锁操作;
  2. 可以使用 lua 脚本进行原子控制;

    • hash
    if(redis.call('hexists', KEYS[1],  KEYS[2]) == 1) then
        local stock = tonumber(redis.call('hget', KEYS[1],  KEYS[2]));
        if(stock > 0) then
            redis.call('hincrby',  KEYS[1],  KEYS[2], 1)
            return stock;
        end;
    
        return 0;
    end;
    • string
    local function isempty(s)
      return s == nil or s == ''
    end
    
    if(redis.call("exists", ARGV[1]) == 1) then
        local stock = tonumber(redis.call('get', ARGV[1]));
        local delta;
        -- ARGV[2] 为空时才执行
        if isempty(ARGV[2]) then
            delta = -1;
        else
            delta = ARGV[2];
        end;
    
        if(stock > 0) then
            redis.call('incrby', ARGV[1], delta)
            return true;
        end;
    
        return false;
    else
        return false;
    end;

2. 一人一单

  1. 查询数据库看是否存在: 高并发下会有问题
  2. 高并发: 使用 redis 锁, 针对个人<抢占到锁才可以下单>
  3. 可以使用 bitmap 维护是否下单: 成功下单后则进行标识修改

在指定时间过期

  1. expireAt(key, long)
  2. expire 计算出下次时间