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

2023-04-20 11:14:37 +08:00
 godleon

详细需求

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

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

list key + string key , 获取数据可以管道批量获取、string 可以设置过期时间。
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
2023-04-20 18:22:14 +08:00
LostPrayers
2023-04-20 18:57:37 +08:00
如果是 java ,用 redisson 就行,已经封装好了
lotusgrm
2023-04-21 12:46:32 +08:00
redis 中,list 类型的数据结构没办法直接给每个元素设置过期时间,不过可以借助于有序集合实现,把 list 中的元素作为 sorted set 的 member ,把当前时间戳作为成员的 score ,然后在需要删除元素的时候使用 zrangebyscore 命令查找过期成员,然后使用 zrem 删除过期的元素
NoKey
2023-04-21 17:03:37 +08:00
1 楼的办法好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/933965

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX