mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-09-24 16:05:44 +08:00
- Separate clientAffinityTTL (24h) from stickySessionTTL (1h) - Atomic Lua dual-write for forward (client→accounts) and reverse (account→clients) affinity indexes with lazy expiry cleanup - Extract Lua scripts to standalone .lua files with //go:embed - Add filterByMinAffinityCount to Layer 1 & 2 scheduling so new clients are routed to accounts with fewest existing affinities - Skip Redis query when no affinity-enabled accounts exist (zero overhead for non-affinity users) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
16 lines
702 B
Lua
16 lines
702 B
Lua
-- 原子双写正向+反向索引
|
|
-- KEYS[1] = client_affinity:{groupID}:{clientID} (正向: client → accounts)
|
|
-- KEYS[2] = client_affinity_rev:{groupID}:{accountID} (反向: account → clients)
|
|
-- ARGV[1] = 当前时间戳 (score)
|
|
-- ARGV[2] = TTL 秒数
|
|
-- ARGV[3] = accountID (正向索引的成员)
|
|
-- ARGV[4] = 过期阈值时间戳 (now - ttl)
|
|
-- ARGV[5] = clientID (反向索引的成员)
|
|
redis.call('ZREMRANGEBYSCORE', KEYS[1], '-inf', ARGV[4])
|
|
redis.call('ZADD', KEYS[1], ARGV[1], ARGV[3])
|
|
redis.call('EXPIRE', KEYS[1], ARGV[2])
|
|
redis.call('ZREMRANGEBYSCORE', KEYS[2], '-inf', ARGV[4])
|
|
redis.call('ZADD', KEYS[2], ARGV[1], ARGV[5])
|
|
redis.call('EXPIRE', KEYS[2], ARGV[2])
|
|
return 1
|