业务背景:抢茅台 ,一个商品id 可能 有 100W库存。这个id 根据redis hash后存储到一台机器上,一台redis 做递减减库存 ,能 抗住 10 W/s吗?
解决方案 :将库存同步到 多个Redis 分片库存算法。
在Lua中编写一个脚本来实现多个key的负载均衡获取,通常这样的场景是在Redis中使用Lua脚本来保证操作的原子性。以下是一个Lua脚本的示例,它实现了你所描述的功能:
- 尝试获取指定的key,并将其值减1。
- 如果该key不存在或库存为0,则查找所有key中库存最多的一个,并将其值减1。
假设我们的key前缀是stock:
,并且我们已知要查询的key列表。请注意,这个示例可能需要根据你的实际使用场景进行调整。
lua复制代码
-- 已知的key列表 | |
local keys = {'stock:item1', 'stock:item2', 'stock:item3'} | |
-- 要查询的key | |
local targetKey = KEYS[1] | |
-- 尝试获取并减少目标key的库存 | |
local targetStock = redis.call('GET', targetKey) | |
if targetStock and tonumber(targetStock) > 0 then | |
redis.call('DECR', targetKey) | |
return targetKey | |
end | |
-- 如果目标key不存在或库存为0,查找库存最多的key | |
local maxStock = 0 | |
local maxStockKey = nil | |
for _, key in ipairs(keys) do | |
local stock = redis.call('GET', key) | |
if stock and tonumber(stock) > maxStock then | |
maxStock = tonumber(stock) | |
maxStockKey = key | |
end | |
end | |
-- 减少找到的最大库存key的值 | |
if maxStockKey then | |
redis.call('DECR', maxStockKey) | |
return maxStockKey | |
end | |
-- 如果没有找到任何key,返回nil | |
return nil |
要使用这个脚本,你需要通过EVAL
命令将其传递给Redis,并提供要查询的key作为参数。例如:
sh复制代码
redis-cli EVAL "$(cat script.lua)" 1 stock:item1 |
这里,script.lua
是包含上述Lua脚本的文件,1
是传递给脚本的key数量(在这个例子中,我们只传递了一个key),stock:item1
是我们要查询的key。
请注意,这个脚本假设所有的key都存储了整数值作为库存。如果你的库存是以其他方式存储的,你可能需要修改脚本来适应你的数据结构。
此外,这个脚本在处理大量key时可能不是最高效的,因为它需要遍历整个key列表来查找库存最多的key。如果你的应用有大量的key,你可能需要考虑使用其他数据结构或方法来优化这个过程。
------------------------------------------------------------------------------------------------------------
还有很多就不一一介绍了。下面是整理的一些面试题大纲,需要的来领取。
-------------------------------------------------------------------------------------------------
链接:https://pan.baidu.com/s/1KmlUj81iMT3KbxBheSEYcA?pwd=pkju
提取码:pkju
————————————————