我应该如何在redis中存储多个会话?

7bsow1i6  于 2021-06-08  发布在  Redis
关注(0)|答案(1)|浏览(407)

我是新来的。我想在redis上存储用户id/会话令牌对。但是,一个用户可以有多个会话令牌。例如,您可能认为,当用户更改其密码时,我希望删除此用户的所有会话对。此外,每个会话对必须有一个过期日期。推荐的方法不应破坏这一点。
我如何才能最有效和正确地做到这一点?
提前谢谢。

ffdz8vbo

ffdz8vbo1#

您可以使用排序集 key : user:<id>:tokens 成员名称是token,成员得分是其过期时间戳
添加新令牌 zadd <key> <token> <expire_timestamp> 获取用户的所有令牌 zrange user:1:tokens 0 -1 . 添加 WITHSCORES 如果您需要过期时间戳和令牌。
获取具有有效时间的令牌 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
}

相关问题