diff --git a/session/impl_redis.go b/session/impl_redis.go index 759fdd0..3881492 100644 --- a/session/impl_redis.go +++ b/session/impl_redis.go @@ -42,16 +42,42 @@ func newProviderWithRedis(ctx context.Context, redisUrl string, ttl time.Duratio } func (p *provider_redis) New(input *Authorization) (string, error) { - sk := make_storagekey(input.Account) - _, err := p.redisClient.HSet(p.ctx, string(sk), input.ToStrings()).Result() + newsk := make_storagekey(input.Account) + prefix := input.Account.Hex() + sks, err := p.redisClient.Keys(p.ctx, prefix+"*").Result() + if err != nil { + logger.Println("session provider delete :", sks, err) + return "", err + } + + for _, sk := range sks { + p.redisClient.HSet(p.ctx, sk, "inv", "true") + p.redisClient.Publish(p.ctx, p.deleteChannel, sk).Result() + } + + for { + duplicated := false + for _, sk := range sks { + if sk == string(newsk) { + duplicated = true + break + } + } + if !duplicated { + break + } + newsk = make_storagekey(input.Account) + } + + _, err = p.redisClient.HSet(p.ctx, string(newsk), input.ToStrings()).Result() if err != nil { return "", err } - _, err = p.redisClient.Expire(p.ctx, string(sk), p.ttl).Result() + _, err = p.redisClient.Expire(p.ctx, string(newsk), p.ttl).Result() if err != nil { return "", err } - pk := storagekey_to_publickey(sk) + pk := storagekey_to_publickey(newsk) return string(pk), err }