Redis 练习(二)
需求:
- 为购物网站实现登录状态及浏览记录的维护
- 进入时检查 token 是否已登录
- 每次进入更新 token 最新进入时间
- 记录用户浏览的商品信息(最多 25 个)
- 定时检查 token 数量,如果超过上限(1000 个),则删除多余 token 及对应信息
Redis 中结构设计:
登录用户信息 | |
value 结构 | HASH |
key | login: |
value | token 和 user 的对应哈希表 |
token 最新浏览时间信息 | |
value 结构 | ZSET |
key | recent: |
value |
成员为 token 分支为 最新浏览时间 |
token 浏览商品信息 | |
value 结构 | ZSET |
key | viewed:<token> |
value |
成员为 商品信息 分值为 浏览时间 |
Python 实现
import time QUIT = False LIMIT = 1000 def check_token(conn, token): return conn.hget('login:', token) def update_token(conn, token, user, item=None): # 获取当前时间戳 timestamp = time.time() # 添加登录用户 conn.hset('login:', token, user) # 记录最后一次令牌出现时间, ZSET 中是使用当前时间戳作为 分值 conn.zadd('recent:', token, timestamp) # item 为浏览的商品 if item: # 记录浏览过的商品 conn.zadd('viewed:' + token, item, timestamp) # 只保留最新的 25 个浏览商品记录 conn.zremreangebyrank('viewed:' + token, 0, -26) def clean_sessions(conn): while not QUIT: # 获取已有令牌数量 size = conn.zcard('recent:') if size <= LIMIT: time.sleep(1) continue # 获取需要移除的令牌信息 end_index = size - LIMIT tokens = conn.zrange('recent:', 0, end_index - 1) # 获取令牌对应的浏览记录keys session_keys = [] for token in tokens: session_keys.append('viewed:' + token) # 删除令牌对应的浏览记录 conn.delete(*session_keys) # 删除登录的用户信息 conn.hdel('login:', *tokens) # 删除令牌最后一次出现时间的记录 conn.zrem('recent:', *tokens)