IT袋

当前位置:主页 > 经验教程 > 建站编程 >

Redis如何为List/Set/Hash的元素设置单独的过期时间

Redis如何为List/Set/Hash的元素设置单独的过期时间(2)

时间:2023-12-16 12:47:20 来源:IT袋 作者:马勇
导读:Redis如何为List/Set/Hash的元素设置单独的过期时间,中文翻译如下: 嗨,这是不可能的,要么为该特定字段使用不同的顶级 key,要么与提交的字段一起存储另一个具有过期时间的字段,然后同时获取这两个

Redis如何为List/Set/Hash的元素设置单独的过期时间

Redis如何为List/Set/Hash的元素设置单独的过期时间

中文翻译如下:

嗨,这是不可能的,要么为该特定字段使用不同的顶级 key,要么与提交的字段一起存储另一个具有过期时间的字段,然后同时获取这两个字段,并让应用程序了解它是否仍然有效(基于当前时间)。

大意就是,不可能,除非你同时把 field 和过期时间都存下来,然后在程序里面判断它是否过期。

这真是布袋里失火,很烧包!

2.2. 设置整体过期时间

既然 Redis 创始人都这么说了,Redis 是不可能为单独的 field 设置过期时间,那我们首先考虑的就是给整个 List/Set/Hash 设置过期时间。

这样的做法简单粗暴,但却很难满足每个字段单独设置过期时间的需求。

于是,我思前想后,既然每个订单的过期时间不一样,那我们是否可以根据时间来创建不同的集合,将同一时间过期的订单放在同一个集合里面:

Redis如何为List/Set/Hash的元素设置单独的过期时间

然后,分别为不同的集合设置 TTL,当订单过期未支付时,订单会随着集合的过期而在同一分钟内被删除。

但是这样的问题是,每次新增订单时,都得把过去 30 分钟的集合全部遍历一遍,查询是否有该用户的订单,再判断用户的未支付订单数有没有超量。

并且,以分钟创建集合,可能存在一个问题:用户的订单本来在 01 秒就过期了,但是在 59 秒才被删除。

如果以秒来创建集合,30 分钟又需要创建 1800 个集合,就更难管理了,所以对集合设置整体过期时间不太可行。

那有没有更优雅的实现方式呢?

2.3 zset 结合 score实现

当然是有的!

Redis 除了常用的 List/Set/Hash 结构,它还有一个专门用来排序的数据结构 zset(即 Sorted Set,排序集合)。

而基于 Redis 的 Zset 结构,可以通过 Score 来表示过期时间,我们可以轻松地实现每个 Field 的单独过期。

Redis如何为List/Set/Hash的元素设置单独的过期时间

具体实现为:

  1. 每当新增一个待支付订单,就将当前时间的 Unix timestamp 加上过期时间 30min 作为 score 设置到这个元素上,这样,sorted set 会根据这个过期时间戳对元素排序存储;
  2. 当订单被支付后,根据 userId 和 orderId 去删除 sorted set 里的待支付订单
  3. 同时,在程序里新增一个定时任务,每隔一秒去删除当前时间已过期的订单。

2.4 底层实现

用 Redis 的 zset 一方面可以很方便地实现了对每个字段的单独过期,不再受整个 Key 的过期时间限制,提高了灵活性。

另一方面,Redis 的 zset 操作是十分高效的,不会给系统带来显著的性能压力。

这得益于 zset 底层的数据结构,Zset 底层实现采用了 ZipList(压缩列表)和 SkipList(跳表)两种实现方式,当满足:

  • Zset 中保存的元素个数小于 128(可通过修改 zset-max-ziplist-entries 配置来修改)
  • Zset 中保存的所有元素长度小于 64byte(通过修改 zset-max-ziplist-values 配置来修改)

两个条件时,Zset 采用 ZipList 实现;否则,用 SkipList 实现。

ZipList 实现

相关阅读

  • Python Flask之RESTful讲解与示例演示

    Python Flask之RESTful讲解与示例演示

    您可能不了解Python的教程内容,接下来一起来看看吧。 一、RESTful 概述 REST(Representational State Transfer)风格是一种面向资源的 Web 应用程序设计风格,它遵循一些设计原则,使得 Web 应用程序具

  • 公司网站如何制作设计 公司网页制作流程

    公司网站如何制作设计 公司网页制作流程

    为网友们解答公司网站如何制作设计和公司网页制作流程的IT知识,很不错的方法小知识,建议收藏哦! 公司网站对于大部分企业来说还是一定的用处的,不管是在互联网中充当一张企业名片

  • Nginx的负载均衡模式有哪几种

    Nginx的负载均衡模式有哪几种

    今天分享:Nginx的负载均衡模式有哪几种的相关经验,请看下面详细的介绍。 Nginx负载均衡是一种代理服务,它可以让客户端通过 Nginx 服务器来访问后端的目标服务器,从而实现负载均衡、缓

  • 做网页的网站有哪些 制作网页链接分享

    做网页的网站有哪些 制作网页链接分享

    关于做网页的网站有哪些和制作网页链接分享的相关介绍,继续往下看吧! 疫情期间电商业务量增长屡破记录,不少中小企业也首次建立官方网站及商店,借此吸引网上人流,本文将介绍5个受