我是 Redis 的新手。我想将用户 ID/会话令牌对存储在 Redis 上。但是,一个用户可以有多个会话令牌。例如,您可能认为当用户更改密码时,我想删除该用户的所有会话对。此外,每个会话对都必须有一个到期日期。推荐的方法不应该破坏这一点。
我怎样才能最有效和正确地做到这一点?
提前致谢。
您可以为此使用排序集
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
}