『Redis実戦』—読書ノート—第2章
1574 ワード
『Redis実戦』—読書ノート—第2章
セッションセッションの数をredisで制御する
時間:2017年10月02日03:07:37
一、tokenを生成し、ユーザーと関係を確立する
①2つのデータ構造があります.1つはhsetで、名前は
login:tokenとユーザーのマッピングを保存し、recent:tokenのタイムスタンプを管理します.
データ構造は次のとおりです.
ほとんどの複雑な操作は、更新時にtokenを実行するときに実行されます.
次のようにtokenを更新します.
②token数を1000万以下に抑えたい.
このコードは、ポーリングまたは周期的に実行できます.
セッションセッションの数をredisで制御する
時間:2017年10月02日03:07:37
一、tokenを生成し、ユーザーと関係を確立する
①2つのデータ構造があります.1つはhsetで、名前は
login:
で、1つはrecentで、名前はrecent:
です.login:tokenとユーザーのマッピングを保存し、recent:tokenのタイムスタンプを管理します.
データ構造は次のとおりです.
+--login:--------------------hash---+
|token1 | username1 |
|token2 | username2 |
|token3 | username1 |
| | |
+-----------+-----------------------+
+--zset-key----------zset---+
|token1 | timestamp1 | // token
|token2 | timestamp2 |
|token3 | timestamp3 |
+-----------+---------------+
ほとんどの複雑な操作は、更新時にtokenを実行するときに実行されます.
次のようにtokenを更新します.
def update_token(conn, token, user, item=None):
timestamp = time.time()
conn.hset('login:', token, user)
conn.zadd('recent:', token, timestamp)
②token数を1000万以下に抑えたい.
QUIT = False
LIMIT = 10_000_000 // 1000
def clean_sessions(conn):
while not QUIT:
size = conn.zcard('recent:') //
if size <= LIMIT: // 1000
time.sleep(1)
continue
end_index = min(size - LIMIT, 100)
tokens = conn.zrange('rencent:', 0, end_index -1) token
conn.hdel('login:', *tokens) //
conn.zrem('recent:', *tokens)
このコードは、ポーリングまたは周期的に実行できます.