如何在Redis中存储多个会话?

问题描述

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

如何最有效,最正确地执行此操作?

谢谢。

解决方法

您可以为此使用排序集

keyuser:<id>:tokens

成员名称是令牌,成员分数是其过期时间戳记

  • 添加新令牌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
}