《Redis实战》—读书笔记—第2章

2017-10-02  本文已影响0人  MR_ChanHwang

《Redis实战》—读书笔记—第2章

用redis来控制session会话的数量

时间:2017年10月02日03:07:37

一、生成token并与用户建立关系

①其中有两个数据结构:一个是hset,命名为login:,一个是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)

此代码可轮询,也可以按照周期性运行。

上一篇下一篇

猜你喜欢

热点阅读