JAVA 秒杀10W/s高并发 热点商品 Redis 减库存方案

业务背景:抢茅台 ,一个商品id 可能 有 100W库存。这个id 根据redis hash后存储到一台机器上,一台redis 做递减减库存 ,能 抗住 10 W/s吗?

解决方案 :将库存同步到 多个Redis 分片库存算法。

在Lua中编写一个脚本来实现多个key的负载均衡获取,通常这样的场景是在Redis中使用Lua脚本来保证操作的原子性。以下是一个Lua脚本的示例,它实现了你所描述的功能:

  1. 尝试获取指定的key,并将其值减1。
  2. 如果该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 

————————————————

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/455604.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阅读笔记——《RapidFuzz: Accelerating fuzzing via Generative Adversarial Networks》

【参考文献】Ye A, Wang L, Zhao L, et al. Rapidfuzz: Accelerating fuzzing via generative adversarial networks[J]. Neurocomputing, 2021, 460: 195-204.【注】本文仅为作者个人学习笔记,如有冒犯,请联系作者删除。 目录 摘要 一、介绍 二、相关…

【PDF加密】PDF文件如何设置打开密码

想要给PDF文件设置加密,打开密码是个很好的选择,每个PDF编辑器的设置方法都有些不同,不过都大同小异。今天我们给刚刚接触PDF文件的朋友再次分享pdf打开密码的设置方法。 打开pdf编辑器,我们点击工具栏中的【文件】功能&#xff…

消息中间件(消息队列)简介

MQ(message queue)消息队列,也叫消息中间件。消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。它是类似于数据库一样需要独立部…

如何利用边缘计算网关进行机床数据采集,以提高数据采集的效率和准确性-天拓四方

边缘计算网关集成了数据采集、处理和传输功能的嵌入式设备。它位于传感器和执行器组成的设备层与云计算平台之间,能够实时处理和响应本地设备的数据请求,减轻云平台的压力,提高数据处理的速度和效率。同时,边缘计算网关还可以将处…

零售行业供应商数据分发,怎样提高安全性和效率?

零售行业是我国经济发展的重要组成,零售行业包罗万象,如包括汽车零售、日化零售、快消品零售等,不同细分行业的运营模式各不相同,但大体来说,零售行业都具备最基础的供应商和零售商,供应商将商品或服务卖给…

素数取りゲーム(线性筛、连续异或、博弈论

小结博弈论题型素数的特性连续异或 代码 题目:素数取りゲーム 临摹的题解:AT_ttpc2019d题解 这题真的看题解都断断续续看了两天才看懂这一个题解 : ( 小结 本题一下遇到了我好多没了解过的点,博弈论、素数的一些特性,连续异或的…

一,凸包------9,Graham Scan:正确性

正确性可以用数学归纳法 如果前K个点是当前最好的凸包的话,那么,当所有点遍历后,必然是最好的凸包。 当k 3时,是个三角形,成立。 如果当K>3时,比如由点1-9组成兔凸包后,判断10号点是否凸…

VR视频编辑解决方案,全新视频内容创作方式

随着科技的飞速发展,虚拟现实(VR)技术正逐渐成为各个领域的创新力量。而美摄科技,作为VR技术的引领者,特别推出了一套全新的VR视频编辑方案,为企业提供了一个全新的视频内容创作方式。 美摄科技的VR视频编…

UML之在Markdown中使用Mermaid绘制类图

1.UML概述 UML(Unified modeling language UML)统一建模语言,是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路。 类图是描述类与类之间的关系的,是UML图中最核心的。类图的是用于…

第二十四回 王婆计啜西门庆 淫妇药鸩武大郎-Numpy索引和切片操作示例

郓哥被王婆打了,就去找武大郎。将情况一说,两人商定去抓奸。一天武大郎只做了两三扇炊饼,约好了时间,郓哥进去顶住大门不让王婆关,武大郎直接跑进去,西门庆刚开始躲到床底下,后被潘金莲提醒&…

C++——stl,string容器详解

目录 1.string是什么 2.string的构造 代码示例: 3.string的赋值操作 代码示例: 4.string字符串拼接 ​编辑 代码示例: 5.string查找和替换 代码示例: 6.字符串比较 代码示例: 7.string字符存取 代码示例…

springboot与Elasticsearch版本兼容对比

首先 大家在下载 Elasticsearch 时 最好先弄清楚版本 因为 如果 Spring Boot 版本 不兼容 Elasticsearch 那就是到头一场空了 Elasticsearch 版本 6.x 可以兼容 Spring Boot 2.x Elasticsearch 版本 7.x 可以兼容 Spring Boot 2.x 3.x 4x Elasticsearch 版本 7.x 以及 8.x 可以…