现在想往 redis 存数据, 首先数据是一条一条写入,Key 是相同的,想每次新增时追加 value ,但是每个 value 过期时间不同。
1 coderxy 2023-04-20 11:21:37 +08:00 你可以用 zset ,把 score 设置为过期时间,自己代码检查过期删除 |
2 godleon OP @coderxy zset 会覆盖相同的 key 呀 , 比如第一次 zSet key1:value1, 第二次 zSet key1:value2 |
3 Chinsung 2023-04-20 11:36:25 +08:00 存进去的时候 value 带个时间,每次写的时候把过期的节点删掉再存 或者使用 subscribe ,应该也可以做到 |
4 dqzcwxb 2023-04-20 11:39:11 +08:00 官方不提供对 zset hash set list 数据结构中每个元素单独设置过期时间的接口,只能通过其他方式实现例如 lua 扩展或者自行维护 |
5 Haaaaaat 2023-04-20 11:41:48 +08:00 可不可以 把 key 带上时间, key1[时间 1]: value1, key1[时间 2]:value2 |
6 Haaaaaat 2023-04-20 11:43:56 +08:00 错了 是 value 带上时间,score 为过期时间 |
![]() | 7 `key:0`, `key:1`, `key:2`... 这样可以吗…… |
![]() | 8 cnoder 2023-04-20 14:29:24 +08:00 就 1 楼的方法可以的,zadd + zrangebyscore 完全够用 |
![]() | 9 Red998 2023-04-20 14:36:58 +08:00 list 结构 + string 结构 list key + string key , 获取数据可以管道批量获取、string 可以设置过期时间。 |
![]() | 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 )? |
11 1018ji 2023-04-20 18:22:14 +08:00 |
![]() | 12 LostPrayers 2023-04-20 18:57:37 +08:00 如果是 java ,用 redisson 就行,已经封装好了 |
13 lotusgrm 2023-04-21 12:46:32 +08:00 redis 中,list 类型的数据结构没办法直接给每个元素设置过期时间,不过可以借助于有序集合实现,把 list 中的元素作为 sorted set 的 member ,把当前时间戳作为成员的 score ,然后在需要删除元素的时候使用 zrangebyscore 命令查找过期成员,然后使用 zrem 删除过期的元素 |
14 NoKey 2023-04-21 17:03:37 +08:00 1 楼的办法好 |