Redis如何为List/Set/Hash的元素设置单独的过期时间
Redis如何为List/Set/Hash的元素设置单独的过期时间
本文摘要:Redis如何为List/Set/Hash的元素设置单独的过期时间的相关经验,下面IT袋网为您详细介绍
1. 引言
1.1 消费队列
这天,不念在购买火车票时,发现如果存在一个未支付的订单时,就不能再进行购票了。如果把待支付的订单放在一个队列里面,那么队列的长度就只能是 1.
正好最近用 Redis 比较多,于是,我突发奇想,如何用 Redis 原生的数据结构实现一个简易版的延时消费队列呢?
业务状态图如下:

并且,需要保证队列的长度是可控的,比如,我们只允许用户有 3 个未支付的订单。
1.2 Redis实现
Redis,作为一款高性能的缓存和数据存储数据库,一直以来都是后台开发者的得力助手。
如果用 Redis 作为消费队列,那么我们可以用到的数据结构有:List、Hash 和 Set。在上述的业务场景中,由于我们只需要关注 orderId(订单 ID),因此这三个数据结构都是可用的。
比如,用 hash 来存储时,我们可以将 key 设置为 UnpaidOrder-{userId},每个 field 都是一个订单。

但是,我们现在面临一个挑战:每个订单的存活时长是不同的,分为手动消费和定期删除的逻辑。
- 订单 1 手动支付后,需要将 orderId1 从列表中删除
- 订单 2 在半小时内还未支付,就自动过期,用户还可以继续提交订单到未支付状态
所以在 List、Set 或者 Hash 结构中,每个 field 都需要设置单独的过期时间。
这是一个常见而又棘手的问题,本文将从互联网业务中常见的解决方案入手,来深入探讨一下 Redis 的底层实现。
2. 常见方案
在实际业务中,我们经常会遇到这样的场景:需要统计某些字段的个数,并且这些字段的过期时间各有先后。
就上述场景而言,我们需要统计用户的未支付订单数,但是每个订单数的过期时间是不同的。
在这种情况下,我们需要在业务中手动删除过期的字段,或者让它们自动过期。
2.1 为单独的 field 设置过期?
我们知道,Redis 里面暂时没有接口给 List、Set 或者 Hash 的 field 单独设置过期时间,只能给整个列表、集合或者 Hash 设置过期时间。
这样,当 List/Set/Hash 过期时,里面的所有 field 元素就全部过期了。
但这样并不满足需求。
不念尝试在网上找一些已知方案,其中有一个 Stack Overflow 的问题帖子和我面临的很相似:

接着,帖子下面的回答里无意看到了 Redis 作者的回答:
相关阅读
-
Python Flask之RESTful讲解与示例演示
您可能不了解Python的教程内容,接下来一起来看看吧。 一、RESTful 概述 REST(Representational State Transfer)风格是一种面向资源的 Web 应用程序设计风格,它遵循一些设计原则,使得 Web 应用程序具
-
公司网站如何制作设计 公司网页制作流程
为网友们解答公司网站如何制作设计和公司网页制作流程的IT知识,很不错的方法小知识,建议收藏哦! 公司网站对于大部分企业来说还是一定的用处的,不管是在互联网中充当一张企业名片
-
Nginx的负载均衡模式有哪几种
今天分享:Nginx的负载均衡模式有哪几种的相关经验,请看下面详细的介绍。 Nginx负载均衡是一种代理服务,它可以让客户端通过 Nginx 服务器来访问后端的目标服务器,从而实现负载均衡、缓
-
做网页的网站有哪些 制作网页链接分享
关于做网页的网站有哪些和制作网页链接分享的相关介绍,继续往下看吧! 疫情期间电商业务量增长屡破记录,不少中小企业也首次建立官方网站及商店,借此吸引网上人流,本文将介绍5个受


