《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)
此代码可轮询,也可以按照周期性运行。