V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
godleon
V2EX  ›  程序员

redis 链表存数据,怎么给每个下标设置过期时间?

  •  
  •   godleon · 2023-04-20 11:14:37 +08:00 · 1921 次点击
    这是一个创建于 562 天前的主题,其中的信息可能已经有所发展或是发生改变。

    详细需求

    现在想往 redis 存数据, 首先数据是一条一条写入,Key 是相同的,想每次新增时追加 value ,但是每个 value 过期时间不同。

    14 条回复    2023-04-21 17:03:37 +08:00
    coderxy
        1
    coderxy  
       2023-04-20 11:21:37 +08:00
    你可以用 zset ,把 score 设置为过期时间,自己代码检查过期删除
    godleon
        2
    godleon  
    OP
       2023-04-20 11:24:56 +08:00
    @coderxy zset 会覆盖相同的 key 呀 , 比如第一次 zSet key1:value1, 第二次 zSet key1:value2
    Chinsung
        3
    Chinsung  
       2023-04-20 11:36:25 +08:00
    存进去的时候 value 带个时间,每次写的时候把过期的节点删掉再存
    或者使用 subscribe ,应该也可以做到
    dqzcwxb
        4
    dqzcwxb  
       2023-04-20 11:39:11 +08:00
    官方不提供对 zset hash set list 数据结构中每个元素单独设置过期时间的接口,只能通过其他方式实现例如 lua 扩展或者自行维护
    Haaaaaat
        5
    Haaaaaat  
       2023-04-20 11:41:48 +08:00
    可不可以 把 key 带上时间,
    key1[时间 1]: value1, key1[时间 2]:value2
    Haaaaaat
        6
    Haaaaaat  
       2023-04-20 11:43:56 +08:00
    错了 是 value 带上时间,score 为过期时间
    fgwmlhdkkkw
        7
    fgwmlhdkkkw  
       2023-04-20 11:45:20 +08:00
    `key:0`, `key:1`, `key:2`...
    这样可以吗……
    cnoder
        8
    cnoder  
       2023-04-20 14:29:24 +08:00
    就 1 楼的方法可以的,zadd + zrangebyscore 完全够用
    Red998
        9
    Red998  
       2023-04-20 14:36:58 +08:00
    list 结构 + string 结构

    list key + string key , 获取数据可以管道批量获取、string 可以设置过期时间。
    OldCarMan
        10
    OldCarMan  
       2023-04-20 17:41:51 +08:00
    一楼+1 ,具体伪代码:

    ```add: ```
    int expireSeconds=3600;
    ZADD myDataZset (now1+expireSeconds) member1;

    ```get and remove: ```
    long timeLimit1=ZSCORE myDataZset member1 ;
    if(timeLimit1-now2<0){
    ZREM myDataZset member1
    }

    如果你 #2 楼说的 key1 是指一个 set 里可能存在 value 相同的 member 的话,你可以在添加时给每个 value 添加一个唯一标识(比如 hash )?
    1018ji
        11
    1018ji  
       2023-04-20 18:22:14 +08:00
    LostPrayers
        12
    LostPrayers  
       2023-04-20 18:57:37 +08:00
    如果是 java ,用 redisson 就行,已经封装好了
    lotusgrm
        13
    lotusgrm  
       2023-04-21 12:46:32 +08:00
    redis 中,list 类型的数据结构没办法直接给每个元素设置过期时间,不过可以借助于有序集合实现,把 list 中的元素作为 sorted set 的 member ,把当前时间戳作为成员的 score ,然后在需要删除元素的时候使用 zrangebyscore 命令查找过期成员,然后使用 zrem 删除过期的元素
    NoKey
        14
    NoKey  
       2023-04-21 17:03:37 +08:00
    1 楼的办法好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2518 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 10:22 · PVG 18:22 · LAX 03:22 · JFK 06:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.