zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    软件测试-三角形问题
    软件测试经典问题——佣金问题
    Ubuntu下ssh免password登录安装
    elasticsearch的javaAPI之query
    非递归实现树的遍历
    递归输出字符串 经典中的经典
    对二维数据进行边界拓展
    【Bootstrap3.0建站笔记一】表单元素排版
    java模拟实现生产者---消费者问题
    Codeforces Round #271 (Div. 2)
  • 原文地址:https://www.cnblogs.com/zawier/p/8526691.html
Copyright © 2011-2022 走看看