• 请不要在回答技术问题时复制粘贴 AI 生成的内容
godleon
V2EX  ›  程序员

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

  •  
  •   godleon · Apr 20, 2023 · 2814 views
    This topic created in 1125 days ago, the information mentioned may be changed or developed.

    详细需求

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

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

    list key + string key , 获取数据可以管道批量获取、string 可以设置过期时间。
    OldCarMan
        10
    OldCarMan  
       Apr 20, 2023
    一楼+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  
       Apr 20, 2023
    LostPrayers
        12
    LostPrayers  
       Apr 20, 2023
    如果是 java ,用 redisson 就行,已经封装好了
    lotusgrm
        13
    lotusgrm  
       Apr 21, 2023
    redis 中,list 类型的数据结构没办法直接给每个元素设置过期时间,不过可以借助于有序集合实现,把 list 中的元素作为 sorted set 的 member ,把当前时间戳作为成员的 score ,然后在需要删除元素的时候使用 zrangebyscore 命令查找过期成员,然后使用 zrem 删除过期的元素
    NoKey
        14
    NoKey  
       Apr 21, 2023
    1 楼的办法好
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3000 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 69ms · UTC 13:27 · PVG 21:27 · LAX 06:27 · JFK 09:27
    ♥ Do have faith in what you're doing.