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
相关产品推荐
相关产品推荐

