You need to enable JavaScript to run this app. Redis中能否实现按插入顺序排序且自动去重的list-set结构?
优惠活动
大模型
产品
解决方案
定价
更多

Redis中能否实现按插入顺序排序且自动去重的list-set结构?

分布式有序去重列表(List-Set)实现方案

我们需要在分布式系统中实现具备以下两个核心特性的List-Set结构:

  • 按元素实际插入顺序排序,先写入的元素固定排在前列
  • 自带去重能力,重复写入已存在的元素不会修改原有顺序,也不会生成重复存储项

原生Redis有序集合(ZADD)方案无法适配该场景:分布式多节点写入场景下,各节点生成的score无法保证全局时序正确性,最终会导致集合顺序和实际插入顺序不符。

需求示例

写入操作

push("listname", "x")
push("listname", "y")
push("listname", "x")

期望查询返回结果

get_list("listname") => ["x", "y"]
落地实现方案(基于Redis)

用「Set去重标识 + List存有序数据」的组合结构实现,所有写入操作封装为原子Lua脚本避免分布式并发冲突:

  • 每个List-Set对应两组Redis键:{key}:set(Set类型,负责去重判断)、{key}:list(List类型,负责按顺序存去重后的元素)
  • 写入操作push(key, value)的Lua脚本逻辑如下,直接在Redis端原子执行,无并发问题:
-- 入参:KEYS[1]为业务侧传入的list名称,ARGV[1]为待写入的元素值
local set_key = KEYS[1] .. ":set"
local list_key = KEYS[1] .. ":list"
local value = ARGV[1]
-- 仅第一次写入的元素才会追加到列表尾部
if redis.call('SADD', set_key, value) == 1 then
    redis.call('RPUSH', list_key, value)
end
return 0
  • 全量查询操作get_list(key)直接调用LRANGE {key}:list 0 -1即可拿到符合要求的结果
  • 数据删除操作同时删除{key}:set和{key}:list两个键即可

内容的提问来源于stack exchange,提问作者gayavat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 02:36:02