0

我是 Redis 的新手。我想将用户 ID/会话令牌对存储在 Redis 上。但是,一个用户可以有多个会话令牌。例如,您可能认为当用户更改密码时,我想删除该用户的所有会话对。此外,每个会话对都必须有一个到期日期。推荐的方法不应该破坏这一点。

我怎样才能最有效和正确地做到这一点?

提前致谢。

4

1 回答 1

0

您可以为此使用排序集

keyuser:<id>:tokens

会员名是token,会员分数是它的过期时间

  • 添加新令牌zadd <key> <token> <expire_timestamp>

  • 获取用户的所有令牌zrange user:1:tokens 0 -1WITHSCORES如果您需要到期时间戳以及令牌,请添加。

  • 获取有效时间的令牌zrangebyscore <key> <current_ts> +inf

  • 删除所有令牌del <key>

清理代码示例

async function getTokens(userId) {
    const lastCleanupTsKey = `user:${userId}:tokens:cleants`
    const tokenKey = `user:${userId}:tokens`

    cosnt [[lastCleanTimestamp, err1], [size, err2] = await redis.pipeline()
        .get(lastCleanupTsKey)
        .zcount(tokenKey)
        .exec()

    if (!lastCleanTimestamp) {
        await redis.set(lastCleanupTsKey, <current_timestamp>)
    }

    if (size !== null && size > CLEANUP_SIZE_THRES_HOLD) { // you can also check if lastCleanup is more than 5 minutes for example here.
        await redis.ZREMRANGEBYSCORE(tokenKey, '-inf', <current_timestamp>)
    }

    // do your logic
}
于 2020-08-28T02:56:35.203 回答