Redis 练习(二)

需求:

  1. 为购物网站实现登录状态及浏览记录的维护
  2. 进入时检查 token 是否已登录
  3. 每次进入更新 token 最新进入时间
  4. 记录用户浏览的商品信息(最多 25 个)
  5. 定时检查 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)

 

posted on 2018-03-08 09:56  _路上  阅读(187)  评论(0编辑  收藏  举报

导航