建材秒知道
登录
建材号 > 设计 > 正文

利用Redis设计库存系统的苦与乐

狂野的画笔
安静的芒果
2022-12-30 04:32:23

利用Redis设计库存系统的苦与乐

最佳答案
认真的火车
不安的战斗机
2026-04-13 19:55:43

在秒杀等高并发场景下,既要保证库存安全,也要拥有极高的系统性能。从存储结构上,很多同学会选用Redis,毕竟Redis的单线程操作特性,很好地避免了线程安全的问题,同时具备极高的读写性能。

我们先来看下库存系统设计的几大核心要点:

1. 库存安全:既要保证线程安全,也要防止出现超卖

2. 同步响应:业务场景基本不允许异步响应库存扣减结果

3. 性能极限:在seckill场景下,性能总是被要求越高越好

我们来看下如何利用Redis来解决上面的三个问题。

一.库存安全

利用Redis来做库存扣减,避免超限的"方法"很多,坑也很多,我们先来看下常用的陷阱有哪些。

1. 先获取当前库存值进行比较,再进行扣减

defdecr_stock():conn=redis_conn()key="productA"current_storage=conn.get(key)current_storage_int=int(current_storage)ifcurrent_storage_int<=0 :return0result=conn.decr(key)returnresult

我们先在Redis中拿到当前的库存值,然后check是否已经扣减到了零,如果已经扣减到了零,则直接return;否则,就利用Redis的decr原子操作进行扣减,同时返回扣减后的库存值。

这种方法的问题很明显,在并发条件下,会出现脏读,设想一个场景,AB两个请求进来,A获取的库存值为1,B获取的库存值为1,然后两个请求都被发到redis中进行扣减操作,然后这种场景下,A最后得到的库存值为0;但是B最后得到的库存值为-1,超限。

2. 先扣减库存,再做比较,跟进情况是否做回滚

defdecr_stock():conn=redis_conn()key="productA"current=conn.decr(key)ifcurrent>=0:returncurrentelse:          #回滚库存conn.incr(key)return0

直接先对库存值进行扣减,得到当前的库存值;然后,对此库存值进行check,如果库存>=0,则返回库存值,如果库存<0,则回滚库存,以便于防止负库存量的存在。

Redis Decr命令:DECR 命令会返回键 key 在执行减1操作之后的值。

这种做法引入了两个新的问题:

1).如果大批量的并发请求过来,redis承受的写操作的量,是加倍的,因为回滚库存的存在导致的。所以这种情况下,高并发量进来,极有可能将redis的写操作打出极限值,然后会出现很多redis写失败的错误警告

2). Redis的Decr操作和回滚操作无法保证原子性,在宕机情况下,容易产生数据不一致

3.先扣库存,然后通过整数溢出控制,根据情况进行回滚

defdecr_stock():conn=redis_conn()key="productA"current=conn.decr(key)      #通过整数控制溢出的做法ifcheck_overflow(current):returncurrentelse:          #回滚库存conn.incr(key)return0  defcheck_overflow(stock):      #如果当前库存未被递减到0,则check_number为int类型,isinstance方法检测结果为true      #如果当前库存已被递减到负数,则check_number为long类型,isinstance方法检测结果为falsecheck_number=sys.maxint - stockcheck_result=isinstance(check_number,int)returncheck_result

这种做法和方法2类似,只是比对部分由直接和0比对,变成了通过检测integer是否溢出的方式来进行。这样就彻底解决了高并发情况下,直接和零比对,限制不住的问题了。

虽然此种做法,相对于做法二说来,要靠谱很多,但是仍然解决不了在高并发情况下,redis写并发量加倍的问题,极有可能某个促销活动,在开始的那一刻,直接将redis的写操作打出问题来。

4.基于分布式锁的库存扣减

defdecr_stock():key ="productA"    lock = getLock(key)iflocked ==1:        current_storage = conn.get(key)        current_storage_int = int(current_storage)ifcurrent_storage_int<=0:return0        result = conn.decr(key)returnresultelse:return"someone in it"

Redis在2.8以后支持Lua脚本的原子性操作,可以用来做分布式锁,解决超限的问题。

5. All in Lua

defstorage_scenario_six():        conn = redis_conn()lua ="""                local storage = redis.call('get','storage_seckill')                if  storage ~= false then                    if tonumber(storage) >0 then                        return redis.call('decr','storage_seckill')                    else                        return 'storage is zero now, can't perform decr action'                    end                else                    return redis.call('set','storage_seckill',10)                end              """result = conn.eval(lua,0)        print(result)

二、同步响应

如果只用Redis来进行存储,处理完数据直接返回前端即可。如果还要持久化到DB,要尽量避免直接操作DB,因为DB往往是最大的IO瓶颈,如果要异步落库到DB,比如使用MQ。要注意处理Redis扣减和消息发送的原子性处理。

三、性能

官网上redis的读写性能能到10W/QPS左右,这个量级应该可以解决绝大部分的场景。

但是经常有同学在压测的时候达不到这个性能,主要还是卡在网络环境上,在5W/QPS的时候,带宽就超过10M/s了。所有想追求Redis的极致性能,最好还是在同机房进行调用。

最新回答
精明的书包
还单身的火龙果
2026-04-13 19:55:43

库存管理系统毕设设计不难。会做表格,懂管理,就可以做库存管理系统毕设设计,很容易上手。库存管理系统是一个企业、单位用于决策和管理的数据库系统。库存管理系统可广泛适用于批发、零售、生产的商业企业、商店、门市、仓库等,对商品的进货、销售、库存,财务的收付款、客户账进行一体化管理。只要针对其中一个行业进行数据统计,并做成表格,统一管理,就可以做库存管理系统毕设设计。所以库存管理系统毕设设计不难。

无辜的酒窝
贤惠的刺猬
2026-04-13 19:55:43
既然是商品库存系统,那么最少有各种商品的单件信息,1:需要有商品的进货价格,卖出价格,剩余数量,每月的销售数量,进货时间等,在对应的数据库表创建相应的字段。2:商品管理就是对多种商品的管理,所以还要有各种商品的分类,比如烟酒类,饮料类,小吃类,将其分类好管理,同样数据库里面建立相对的数据表。具体需要根据自己需求来编写。3:界面的设计,这里可分为登陆界面,其中一个是用户登陆后查看的界面,和管理员登陆后查看的界面,用户登录只能查看对应的商店的物品管理,并且能进行修改自家商品。管理员登陆可查看所有的用户的商店物品,及修改物品信息。而物品分类栏就可以用jQuery来实现局部的刷新界面。左边为物品分类栏,右边为选中物品类的信息。点击右边分类物品的某件物品,可跳转到该类物品的单个信息,如第1点提到的。

陶醉的小懒猪
奋斗的小馒头
2026-04-13 19:55:43

首先要创建数据库啊,也就是一个txt文件,要让里面有内容啊。其次是你的增加删除商品种类,修改指定商品的数目之类的,具体看老师的要求。

例程(基本框架,具体的操作需进一步开发):

#include <stdio.h> 

#include <stdlib.h> 

#include <conio.h> 

#include <memory.h>

int count=0

struct commodity

{

int id  

int number  

int price   

char name[20]  

char indate[9]  

char deadline[9] 

}a[100]

void page_title(char *menu_item) 

printf("【商品库存管理系统】\n",menu_item) 

void return_confirm(void) 

printf("\n按任意键返回……\n") 

getch() 

}

void insert(void)     

int search(void)     

}

void del(void)       

void sort()        

}

int modify(void)    

{

}

int main(void)

{ menu: page_title("操作选单") 

printf("\t\t\t 1 信息查询\t2 全部商品\n\n") 

printf("\t\t\t 3 商品增加\t4 商品删除\n\n") 

printf("\t\t\t 5 信息修改\t0 退出程序\n\n ")

switch(getch()) 

case '1' : search()break 

case '2' : sort()break 

case '3' : insert()break 

case '4' : del()break

case '5' : modify()break

case '0' : exit(0) 

goto menu

   return 0

}

甜甜的蜡烛
魔幻的小海豚
2026-04-13 19:55:43
如果要问WMS 最核心的模块是哪个,那一定是库存中心, 库存中心的结构直接影响到其他模块的设计。

本人设计库存中心时,考虑业务场景如下:

1. 订单进入之后,可以同步验证批次库存是否够。

    为什么要到批次库存呢?像2C 电商平台,基本都是验证到货量是否足够,不验证批次。但是如果只验证到货量,那么在当库存中有残品,过期的,那么就会造成后面的无库存可出库, 所以这里会验证到批次是否足够。

2. 要能支持多批次属性管理。

    根据商品的属性,考虑管理到何种批次的颗粒度,比如生鲜的商品要管理到生产日期,药品的管理到批次号等。

3. 可以追溯到产品的入库源头,库内所有的变化,出库方向。 就是说当消费者投诉到这个商品有问题时,不仅能查到库内的转移轨迹,也要能管理到这个货是经过哪个入库单入库的,根据入库单号跟踪到上游的轨迹,这个食品追溯中尤为重要,因为现在还没有做到每个商品都有唯一流通的条码进行全供应链管理。

满足上述的要求转换设计思路如下

1. 可以进行预分配 ,在订单进入之后就可以预分配库存,分配到库存的批次级别。

2. 在入库时根据批次不同生成唯一的批次ID ,这个批次ID 跟随库存变化全过程。

3. 可扩展的库存批次管理 。

4.参考预分配结果进行分配到库位库存

   问题:为什么不直接分配到库位上,这样不是更简单?

  答:因为2C 订单是陆陆续续进入到系统的,如果每个订单进来就分配,会造成分配的库存位置不集中,在波次拣货的时候浪费拣货路径。2,有的仓库使用存拣分离,订单进入的时候库存还没有补货完成,也不能占用到存储位置上,那就没有办法占用了。结合上面两个情况所以占用批次级别比较合适。

作为库存的主表,记录库存的批次ID 和占用情况。

记录物理位置的库存表,使用批次ID 作为外键链接库存批次表

作为库存批次表, 记录库存不同库存批次的情况,结合上面两个表就可以查看每个预占或者占用的库存对应的批次情况,查看库位上库存的批次情况。 

库存表设计后,还要有对应的分配表

这里的为了区分不同场景下的分配,定义只占用批次的时候要预占,分配到库位上库存时叫做分配。

库存预占表

库存分配表

分配逻辑说明

预分配

在库存分配时如果需要预分配,先进行预分配,分配结果记录到库存表和预分配表中,前者记录库存的变化,防止超量预占(本设计不考虑超量分配的场景),后者记录预分配的结果和订单的关系。

分配

分配数量参考订单的预分配结果,按照预分配分配的批次ID 到库存中找到对应的批次ID.分配的数量记录到分配字段中。

如图

库存批次ID 变化

总结:增加了预分配的概念,同时通过批次ID 记录库存变化过程。这样就不仅仅可以在库存分配的验证库存,也可以事后追踪库存。

傲娇的微笑
畅快的灯泡
2026-04-13 19:55:43
(一)开题报告应包含以下内容

(1)毕业设计课题名称

(2)课题背景

(3)课题研究意义

(4)课题研究内容

(5)实现的目标

(6)拟采用的实现方法与技术手段

(7)预期成果

(8)进度计划

(9)小组成员

(二)书写要求

(1)采用A4稿纸

(2)手写

(3)封皮书写

开题报告

组长:XXX(班级)

小组成员:XXXX (班级)

XXXX(班级)

日期:XXXXX年XX月XX日

指导教师:(签字)

设计(研究)内容和意义:

1 选题背景

当今时代,世界经济正在从工业经济向知识经济转变。我们说知识经济的两个重要特征就是信息化和全球化,要实现信息化和全球化,就必须依靠完善的网络和完善的数据库。在这样一个飞速发展的信息时代,在各行各业中离不开信息处理,这正是计算机被广泛应用于管理信息系统的环境。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。计算机进行信息管理与信息管理系统的开发密切相关,系统的开发是系统管理的前提。

尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。计算机进行信息管理与信息管理系统的开发密切相关,系统的开发是系统管理的前提。本系统就是为了管理好企业的库存信息而设计的。

2 选题意义

企业的库存物资管理往往是很复杂、很繁琐的。由于所掌握的物资种类众多,订货、管理、发放的渠道各有差异,各个企业之间的管理体制不尽相同,各类统计报表繁多,因此仓库的库存管理必须编制一套库存管理信息系统,实现计算机化操作,而且必须根据企业的具体情况制定相应的方案。

一个完整的企业物资供应管理系统应包括采购计划管理,合同收托管理、仓库库存管理、定额管理、统计管理、财务管理等模块。其中仓库的库存管理是整个物资供应管理系统的核心。因此有必要开发一套独立的库存管理系统来提高企业工作效率,而所使用的这套库存管理系统是企业生产经营管理活动中的核心,此系统必须可以用来控制合理的库存费用、适时适量的库存数量,使企业生产活动效率最大化。

现在我国的企事业特别是中小型生产企业的库存管理水平还停留在纸介质的基础上,这样的机制已经不能适应时代的发展,因为它浪费了许多人力和物力,在信息时代这种传统的管理方法必然被计算机为基础的信息管理所取代。而购买大型通用库存管理系统,对中小型企业来说,又需要付出昂贵的代价,而且库存管理项目不一定完全符合企业库存管理的要求。因此根据企业目前实际的库存管理情况开发一套库存管理系统是十分必要的。

3设计内容

库存管理信息系统研究的内容涉及库存管理的全过程,包括入库、出库、退货、订货、库存统计查询等等。

根据上述工作流程,库存管理系统将包含以下内容:

1)登录信息的输入,密码的修改。

2)基本信息的输入,包括成品信息,原材料信息,供应商信息,客户信息。

3)仓库管理的各种信息的输入,包括采购入库,销售出库等。

4)对库存管理的各种信息的查询,修改,维护和报表打印。

5)对各种功能的编码管理。

6)权限管理。

由于两个人分工合作,我负责成品仓库管理模块,原材料仓库模块,报表查询模块和高级管理模块等部分。在此对这几个模块的业务流程简单做下介绍。

原材料采购回来之后,要对原材料进行入库管理,对它采购的数量,单价等基本信息进行录入,系统会自动结算出本次采购的金额。若要对这次的采购的供应商进行结算,那么就可以到原材料付款界面,选择此次的交易记录,然后进行结算。生产部门若要领用这些原材料进行生产需要,那么就到原材料领用界面去进行登记,记录会自动保存到库存当中去。

成品是本公司生产出来的产品,也要对它进行入库,操作跟原材料的入库类似。

所有这些操作的结果都会保存到库存当中去,要想对原材料和成品的库存信息进行查询那么你在库存一览中,我们可以看到它们的详细情况,可以知道现在库存中各个成品的原材料的数量和它们所价值的金额。想对原材料的结算情况进行查看,可以到采购付款报表查看,那里可以发现已清帐和未清帐的具体情况,可以看到具体的欠款金额。同样的,在销售收款报表中也可以看到各个客户的欠款情况。

高级编码模块是对系统功能的一个补充,可以让系统变的更加的完整,有入库信息的修正,一些编码的添加删除及编辑和系统的初始化功能。

研究解决方法及思路:

要对库房管理系统的进行功能需求分析、数据库需求分析,并由此设计了功能模块结构和数据库的设计,并对库房管理系统进行设计开发。

对数据库进行简明的介绍,并分析了库房管理系统所应进行的工作。对数据库的设计和SQL语言的使用进行了系统分析,为深入理解数据库应用打下了基础。

学习画图工具visio 2003和开发工具Delphi,对其数据库组件,SQL语言在Delphi中的应用等数据库编程关键技术进行了系统的介绍。并按照数据库设计理论一步一步地给出了系统需求说明书,建立了数据库,并完成数据的设计。最后完成各个模板的设计。

根据我国国内库存管理信息系统在企业中应用普及时出现的各种问题,我用我所学知识,利用当前管理信息系统科学的、实用的理论,开发这套基于delphi的库存管理系统,以求能对我国库存管理现代化水平的提高贡献一份微薄的力量

年轻的歌曲
陶醉的大侠
2026-04-13 19:55:43
仓库管理系统

目录

第一章 系统概述 1

1.1绪论 2

1.1.1系统开发的目的与意义 3

1.1.2系统开发背景

1.1.3系统任务概述

1.1.4系统实现的方法与目标

第二章 可行性研究与需求分析 4

2.1可行性研究 5

2.1.1技术可行性 6

2.1.2经济可行性

2.1.3操作可行性

2.1.4社会因素可行性

2.1.5可行性研究结论

2.2需求分析

2.2.1系统的目的

2.2.2系统功能及用户需求分析

2.2.3系统流程图

2.2.4数据描述

第三章 项目设计的基本原理和采用的主要方法与技术

3.1项目设计的基本原理

3.2项目设计采用的主要方法与技术

3.2.1项目设计采用的主要方法

3.2.2项目设计采用的主要技术

第四章 总体设计

4.1总体设计原理

4.2系统功能模块设计

4.3系统流程图

4.4软硬件环境:

4. 5运行设计

第五章 详细设计

5.1数据库的概念设计

5.1.1数据抽象

5. 1.2系统概念数据模型(CDM):

5. 1.3系统物理数据模型(PDM):

5.2程序描述

5. 2.1身份验证系统

5. 2.2借出系统

5.3程序流程图:

第六章 系统的实现与调试

6.1货物仓库数据库的建立

6.2货物仓库数据库的建立

6.2.1登录界面

6.2.2主界面

6.2.3点击菜单中的“供应商信息”,出现如下界面

6.2.4点击菜单中的“购货商信息”,出现如下界面

6.2.5点击菜单中的“货物信息”,出现如下界面:

6.2.6点击“库存操作”中的“入库”,出现如下界面:

6.2.7点击“库存操作”中的“出库”,出现如下界面:

6.2.8点击“库存操作”中的“库存”,出现库存信息的界面

第七章个人遇到的困难与获得的主要成果

第八章测试与运行记录

8.1测试目的

8.2测试目标

8.3测试计划

8.3.1测试方案

8.3.2测试项目

8.3.3测试准备

8.4测试与运行记录

8.4.1用户登录操作

8.4.2供货商信息查询操作

8.4.3指定供货商信息查询操作

8.4.4添加供货商信息操作

8.4.5购货商信息查询操作

8.4.6指定购货商信息查询操作

8.4.7添加购货商信息操作

8.4.8商品信息查询操作

8.4.9指定商品信息查询操作

8.4.10商品信息添加操作

8.4.11查询入库信息操作

8.4.12查询指定商品入库信息操作

8.4.13入库信息添加

8.4.14查询出库信息操作

8.4.15查询指定商品出库信息操作

8.4.16出库信息添加

8.4.17库存信息查询操作

8.5评价

参考文献

附录

这是目录,有问题请发站内信我