我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么用Redis做预定库存缓存功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么用Redis做预定库存缓存功能

这篇文章主要介绍了怎么用Redis做预定库存缓存功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Redis做预定库存缓存功能文章都会有所收获,下面我们一起来看看吧。

一、业务背景

为了略去我们公司项目背景,我决定把这次的问题类比成一个考卷上的问题。至于业务细节,大家也无需关注~看题目就可以了:

假设你是某国最牛的收藏家,手里有各种价值连成的宝物。知道有一天,你觉得做收藏太没意思了,打算把这些宝物卖掉换点现金。

不过把这些值钱的宝贝放在菜市场上卖实在太low了。在“互联网+”时代,我们当然要玩一些不一样的卖法:在你名下有一栋300个房间的大楼(编号为001至300),每个房间放着一个密码锁保险箱,在下个月(12月1日至12月31日)的每一天,你都会挑选300件最好的“极品宝物”(也称作A类宝物),分别放入这300个房间的保险箱里,每天每个房间放什么宝物已经定好了,所有想买宝物的人必须至少提前一天在网上预定,到时候凭借预定码自己打开保险箱取货。没有被预定的宝物将会被你收回,不再售卖。

要做这样一个网络预定系统,它的前端界面大概是这样的:

怎么用Redis做预定库存缓存功能

上图中三个要填的控件,单击后可以出现选择框。现在的问题是,一个房间只有一个宝物,不能被重复预定。所以当买家选择了宝物类型和房间号之后,在选择预定日期时,要在日期选择框给用户一个提示。比如12月3日051号房间已被预定,现在又有另一位用户选择了051号房间,那么在弹出日期选择框时,12月3日要置为不可选。如下图(12月3日显示为“缺”):

怎么用Redis做预定库存缓存功能

那么,这样一个简单的库存系统,如何在redis中存储呢?

二、库存管理方案(Redis)

最粗暴的想法是,我们的库存其实就是一个很大的三维数组,第一维宝物类型,第二维房间号,第三维即预定日期。Redis支持5种存储类型:String,Hash,List,Set,Sorted Set。目前的场景中Hash和Set类型都可以满足要求,在此我们选择使用Hash类型做存储。

Redis的key设置为 宝物类型+房间号(例如 A:205,A代表极品宝物,205为房间号),Redis的value为hash类型,hash key为日期(例如 2016-12-05),hash value为true或false,表示已经被预定或没有被预定。用图表示为:

怎么用Redis做预定库存缓存功能

如果A类宝物158房间在12月8日已经被预定,则存储为

1

2

3

Redis Key —— A:158

 

Redis Value —— hash table ['2016-12-08' => 1]

三、进阶场景&库存管理方案

你所推出的A类极品宝物很受欢迎,刚推出去不久即被预定出去很多。然而,动辄数十万元的价格也让很多有收藏兴趣、却没那么富裕的中产阶级望而却步。于是,你又从自己的收藏中挑选出了比A类宝物稍次一些的B类宝物(也称作“优质宝物”),价格更加亲民。

由于B类宝物比A类宝物多一些,你打算换一种玩法,在这300个房间中,每个房间又放入了一个保险箱,这次,你每隔一个小时都会向300个房间的箱中各放入一件B类宝物,没有被预定的宝物在这一个小时过后会被收回,换成下一个小时的宝物。买家预订后,按照所预定的小时来取走宝物。对于B类宝物,你的预定系统会多了一个选项,即取货时间。如下图:

怎么用Redis做预定库存缓存功能

现在由于多了一个预定条件(取货时间),那在做库存存储的时候,粗暴的方式想一下,库存其实就是一个大的四维数组。第一维宝物类型,第二维房间号,第三维预定日期,第四维取货时间。在Redis中怎样存储这类宝物呢?

其实仔细想一下,在存储A类极品宝物的时候,我们在Redis中的存储是有浪费维度的情况的,

当时hashValue只存了一个true表示有预定,这个维度其实是被浪费掉了。考虑到取货时间全是整点,一整天也就是0至1点,1至2点,……,23至24点共计24种情况,所以我们完全可以使用二进制整数表示被预定的时间。例如1表示0至1点,2表示1至2点,4表示2至3点,……,

8388608 (= 2^23)表示23至24点。多个时间段被预定,只需要将数值取逻辑或操作即可。

这样,我们的Redis结构变成了这样子:

怎么用Redis做预定库存缓存功能

例如,B类宝物103房间,12月5日和6日的上午8点至12点被预定,在redis中存储为

1

2

3

Redis Key  —— B:103

 

Redis Value —— hash table ['2016-12-05' => 3840, '2016-12-06' => 3840]

对于B类宝物,在做新增预定时,需要注意先将原有的hash value取出,和新的预定取货时间做逻辑或操作,然后再把结果写回Redis中,而不能像A类宝物一样直接调用hSet去设置hash value;取消预定时,要注意先将原有的hash value取出,把要取消的时间段从hash value中扣除掉(异或+逻辑与操作),然后重新将剩余的已预订取货时间写回Redis中,而不能直接调用hDel去删除。

四、再次进阶&库存管理方案

自从推出了B类宝物之后,你的生意又比以往火爆了许多。于是新的需求又来了,现在有大量的游客、学生党等没什么丰厚积蓄的人表示对你的宝物非常感兴趣,来这个城市旅游的人都希望带一些纪念品回去。然而,B类宝物的价格虽然比A类便宜一些,对于这些人来讲还是有点贵。于是,你决定把自己余量最多的实惠宝物(C类宝物)拿出来售卖。

这部分宝物数量是最多的,于是你在这300个房间中,每个房间新增了100个宝箱,专门用于存放C类宝物。这100个宝箱分别被编号为1号,2号,……,100号。同样的,每天的每个小时,你都会向这300个房间中,每个房间的100个宝箱中分别放入一件C类宝物(也就意味着,整个大楼每小时C类宝物会更新30000件)。如果没有人预定,则下一个小时宝物更换。终于,这下可以满足所有人的需求了。

对于C类宝物,你的预定界面成了下面的样子:

怎么用Redis做预定库存缓存功能

我们又多了一个预定条件。此时,又面临着库存存储的问题。照例,这个库存其实就是一个大的五维数组,宝物类型、房间号、预定日期、取货时间、宝箱编号各自占有一个维度。不过前面我们的Redis各个维度基本上已经占满了,这次应该怎么存储呢?

这次的Redis库存存储必须要结合业务特点来了。首先,宝箱编号和取货时间这两个维度,能取的值范围并不太多,宝箱编号只有100个,只要把hash value变成一个长度为100的数组,数组的每个位置都存有INT类型表示的取货时间即可。然而hash value只能是string……于是乎,只好做一个数组的序列化操作,读取的时候再反序列化回来即可。好在长度只有100,序列化效率并不会成为系统的瓶颈。

例如,C类宝物,12月23日、24日,258房间,97和99号宝箱在11点至13点被预定,则存储为:

1

2

3

Redis Key —— C:258

 

Redis Value —— hash table ['2016-12-23' => '[97 => 6144, 99 => 6144]''2016-12-24' => '[97 => 6144, 99 => 6144]' ]

其中6144用二进制表示为‘110000000000’,hash value为数组序列化以后的字符串,实际项目中可以使用json格式。好了,现在Redis对于三种宝物的存储都有了。

怎么用Redis做预定库存缓存功能

对于C类宝物,在用户取消预定、新增预定时,同样不能简单地调用hSet和hDel进行覆盖设置和删除,要取出已经预定的情况,与已经预定的取货时间做位运算。

五、存储优化

库存理论上就是一个多维数组,我们所做的主要工作就是怎样把各个维度合理的存储起来,并能够方便地进行增加、删除、查询操作。从节约使用内存的角度讲,在最开始还没有任何人预定的时候,Redis整个可以是空的,对于A类宝物来说,hash value等于false和根本不存在对应的redis key或hash key是等效的。

另外,宝物类型和房间号合起来做redis key,会导致我们在redis中和宝物库存相关的key的数量比较多,为了方便统一管理这些key,可以再增加一条redis缓存,专门用来存储和宝物库存相关的所有redis key值,如下图所示。需要注意的是,这次我们并不需要hash数据类型了,set类型就已经足够,增删改查复杂度都是O(1)。里面存储了所有redis中已经存在的库存key值。

怎么用Redis做预定库存缓存功能

这么做的一个好处是,万一哪天碰到一些特殊情况,需要把所有库存相关缓存全部清空的话,我们可以很容易地取出所有的库存key并做删除操作。另外一个好处是,给我们提供了继续扩展的思路……设想一下,现在最复杂的情况是C类宝物,一共5个维度。假设未来,你不再使用一幢楼的300个房间去售卖宝物,而是多幢楼,那么用户在下订单的时候又要多出一个维度——楼栋编号。碰到这种情况,我们完全可以将这个多出来的库存Key集合退化为楼栋编号来使用,保证了可能出现的更复杂情况下的扩展性。

在做了这次扩展之后,每次新增预定记录时,需要注意检测库存key集合中是否已经存在对应的redis key值,如果不存在需要将redis key值加入库存key集合中。删除操作也类似。

关于“怎么用Redis做预定库存缓存功能”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么用Redis做预定库存缓存功能”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么用Redis做预定库存缓存功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么用Redis做预定库存缓存功能

这篇文章主要介绍了怎么用Redis做预定库存缓存功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Redis做预定库存缓存功能文章都会有所收获,下面我们一起来看看吧。一、业务背景为了略去我们公司项目背景,
2023-06-29

java redis怎么做缓存

使用JavaRedis缓存可以提高应用程序性能,因为它允许快速存储和检索数据。通过使用RedisTemplate类与Redis交互,可以轻松地存储、检索并管理缓存。SpringFramework还提供了方便的注解,用于自动管理缓存。此外,需要考虑缓存失效策略,例如时间到期、写时失效和最近最少使用,以确保缓存中的数据保持最新。
java redis怎么做缓存
2024-04-02

java 怎么做redis缓存

Redis是一种高性能键值存储数据库,广泛用作缓存系统。在Java中集成Redis可通过Redis客户端库或SpringBoot集成。Redis配置包括创建实例、配置连接池和选择缓存策略。常见操作包括存储和检索数据、设置过期时间、使用管道和事务。最佳实践建议选择适当的数据类型、优化过期时间、处理缓存失效、监控和调整性能。遵循这些实践可确保有效使用Redis缓存,提高应用程序性能、减少数据库负载、增强可用性和简化数据访问。
java 怎么做redis缓存
2024-04-02

redis怎么做缓存机制

Redis是一个开源的、高性能的键值数据库,它可以用作缓存机制来提高系统的访问速度。以下是使用Redis作为缓存机制的一些步骤:1. 安装和配置Redis:首先需要在服务器上安装Redis,并进行相关的配置。可以参考Redis官方网站或其他
2023-09-06

SpringBoot中怎么使用Redis做缓存

在SpringBoot中使用Redis做缓存可以通过以下步骤实现:添加依赖:首先在pom.xml文件中添加Spring Data Redis的依赖,如下所示:org.springframework.
SpringBoot中怎么使用Redis做缓存
2024-04-09

redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。原因:高性能:在内存中存储数据以实现快速访问。低延迟:优化的数据结构和操作以最小化延迟。可扩展性:易于分片和集群,适应高负载。持久性:
redis怎么做缓存服务器
2024-04-08

redis在Java中怎么做缓存

Java中使用Redis进行缓存Redis是一种高性能内存数据库,在Java中使用它进行缓存可以提升应用程序性能。连接Redis:使用RedisJava客户端(如Jedis或Lettuce)建立连接。存储和获取值:使用set方法设置键值对。使用get方法获取键的值。设置过期时间:使用expire方法为缓存值设置过期时间。使用命令管道:使用命令管道提高性能,在一次操作中执行多个Redis命令。处理Redis异常:处理连接异常和数据异常,以防应用程序崩溃。其他功能:Redis还提供哈希表、列表、集合和有序集合
redis在Java中怎么做缓存
2024-04-02

Redis的缓存预热和缓存降级怎么实施

缓存预热和缓存降级是在使用Redis作为缓存时常用的两种策略,可以提高系统性能和稳定性。缓存预热:缓存预热是指在系统启动或服务升级时,提前将一部分热门数据加载到缓存中,以提高系统的响应速度和性能。实施缓存预热可以通过以下几种方式:定时任务
Redis的缓存预热和缓存降级怎么实施
2024-05-07

如何利用Redis和Scala开发缓存预热功能

如何利用Redis和Scala开发缓存预热功能缓存预热是一种常用的优化策略,通过预先将热点数据加载到缓存中,可以减少用户请求时的延迟。在开发过程中,利用Redis和Scala实现缓存预热功能是一种常见的方式。本文将介绍如何使用这两种技术来开
2023-10-22

如何使用Redis和Objective-C开发缓存预热功能

如何使用Redis和Objective-C开发缓存预热功能在开发互联网应用时,为了提高性能和响应速度,我们通常会使用缓存来存储频繁访问的数据。而缓存预热是一种常见的优化策略,通过预先将热门数据加载到缓存中,可以避免用户第一次访问时的等待时间
2023-10-22

如何使用Redis和Rust语言开发缓存预取功能

如何使用Redis和Rust语言开发缓存预取功能引言:随着Web应用的增长和用户量的增加,缓存成为提高性能的重要手段之一。为了进一步提升缓存的效果,我们可以使用缓存预取功能,即在需要使用缓存的数据之前就提前将其加载到缓存中。本文将介绍如何使
2023-10-22

redis怎么在项目中做缓存层

在项目中使用Redis作为缓存层的步骤如下:1. 引入Redis依赖:在项目的pom.xml(如果使用Maven)中添加Redis的依赖。例如:```xmlredis.clientsjedis3.7.0```2. 创建Redis连接池:在项
2023-09-04

thinkphp中怎么利用redis实现秒杀缓存功能

thinkphp中怎么利用redis实现秒杀缓存功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1,安装redis,根据自己的php版本安装对应的redis扩
2023-06-19

使用注解实现Redis缓存功能

本文实例为大家分享了使用注解实现Redis缓存功能的具体代码,供大家参考,具体内容如下非关系型内存数据库,有持久化操作,C语言编写的key,value存储系统(区别于mysql的二维表格的形式存储。)rdb:周期性的持久化aof:以
2022-07-28

redis怎么缓存整个数据库

要将整个数据库缓存到Redis中,可以使用Redis的持久化机制。Redis提供了两种持久化方法:RDB(Redis Database)和AOF(Append-Only File)。RDB是Redis默认的持久化方式。它会在指定的时间间隔内
2023-08-23

Redis缓存在系统中用来做什么

本篇内容介绍了“Redis缓存在系统中用来做什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、缓存在系统中用来做什么?1. 少量数据存储
2023-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录