美文网首页
《Redis实战》—读书笔记—第2章

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

作者: MR_ChanHwang | 来源:发表于2017-10-02 03:26 被阅读0次

    《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)
    

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

    相关文章

      网友评论

          本文标题:《Redis实战》—读书笔记—第2章

          本文链接:https://www.haomeiwen.com/subject/ozdzextx.html