『Redis実戦』—読書ノート—第2章

1574 ワード

『Redis実戦』—読書ノート—第2章
セッションセッションの数を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)

このコードは、ポーリングまたは周期的に実行できます.