基于Redis商品库存扣减方案
import redis
# 假设已经有了Redis连接对象redis_conn
redis_conn = redis.StrictRedis(host='localhost', port=6379, db=0)
# 商品key的前缀
KEY_PREFIX = 'inventory:'
def decrease_inventory(product_id, decrement):
"""
扣减指定商品的库存
:param product_id: 商品ID
:param decrement: 扣减数量
:return: 实际扣减后的库存量,如果库存不足则返回-1
"""
key = f'{KEY_PREFIX}{product_id}'
# 使用Lua脚本来原子性地减少库存
lua_script = """
if (redis.call('exists', KEYS[1]) == 1) then
local stock = tonumber(redis.call('get', KEYS[1]))
if (stock >= ARGV[1]) then
return redis.call('decrby', KEYS[1], ARGV[1])
else
return -1
end
else
return -1
end
"""
# 调用EVAL命令执行Lua脚本
result = redis_conn.eval(lua_script, 1, key, decrement)
# 如果返回-1,说明库存不足;否则返回实际剩余库存量
return -1 if result == -1 else result
# 假设产品ID为1001,我们要减少1个库存
new_stock = decrease_inventory(1001, 1)
print(f'新库存为: {new_stock}')
这段代码使用了Redis的Lua脚本来保证扣减操作的原子性。这是一种常见的方法,用于确保多个命令的执行以原子方式进行,从而避免并发问题。在实际应用中,你需要替换redis_conn
为你的Redis连接对象,并确保你的Redis服务器正在运行。
评论已关闭