需求:

  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)

Redis 练习(二)的更多相关文章

  1. redis(二)高级用法

    redis(二)高级用法 事务 redis的事务是一组命令的集合.事务同命令一样都是redis的最小执行单元,一个事务中的命令要么执行要么都不执行. 首先需要multi命令来开始事务,用exec命令来 ...

  2. Redis系列(二):Redis的数据类型及命令操作

    原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...

  3. redis入门(二)

    目录 redis入门(二) 前言 持久化 RDB AOF 持久化文件加载 高可用 哨兵 流程 安装部署 配置技巧 集群 原理 集群搭建 参考文档 redis入门(二) 前言 在redis入门(一)简单 ...

  4. redis(二)redis的主从模式和集群模式

    redis(二)redis的主从模式和集群模式 主从模式 集群模式 主从模式 redis的主从模式,指的是针对多台redis实例时候,只存在一台主服务器master,提供读写的功能,同时存在依附在这台 ...

  5. 【Docker】 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二)

    系列目录: [Docker] CentOS7 安装 Docker 及其使用方法 ( 一 ) [Docker] 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二) [D ...

  6. Redis系列(二)-Hredis客户端设计及开源

    接上篇c#实现redis客户端(一),重新整理些了下. 阅读目录: 项目说明 Hredis设计图 单元测试场景 总结 项目说明 背景:因为有地方要用,而又没找到对sentinel良好支持的Net客户端 ...

  7. Redis教程(二):String数据类型

    一.概述: 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型 ...

  8. Redis系列二之事务及消息通知

    一.事务 Redis中的事务是一组命令的集合.一个事务中的命令要么都执行,要么都不执行. 1.事务简介 事务的原理是先将一个事务的命令发送给Redis,然后再让Redis依次执行这些命令.下面看一个示 ...

  9. C# Redis实战(二) [转]

    二.Redis服务  在C# Redis实战(一)中我将所有文件拷贝到了D盘redis文件夹下,其中redis-server.exe即为其服务端程序,双击即开始运行,如图               ...

  10. redis(二)Redis适用场景,如何正确的使用

    网络IO模型 Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe 传递给worker线程,进行读写IO, ...

随机推荐

  1. Web架构之Nginx基础配置

    目录 1.Nginx 虚拟主机 1.1.基于域名的虚拟主机 1.2.基于端口的虚拟主机 1.3.基于IP的虚拟主机 2.Nginx include 3.Nginx 日志配置 3.1.访问日志 3.2. ...

  2. flask blueprint出现的坑

    from flask import Blueprint admin = Blueprint('admin',__name__) def init_bule(app): app.register_blu ...

  3. 聊聊count(*)

    count(*) 的实现方式 MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高 InnoDB 引擎就麻烦了,它执行 count(*) 的时候 ...

  4. Asp.Net Core 3.1 获取不到Post、Put请求的内容 System.NotSupportedException Specified method is not supported

    # 问题 是这样的,我.net core 2.1的项目,读取.获取Post请求内容的一段代码,大概这样: [HttpPost] public async Task<IActionResult& ...

  5. 扩展gRPC支持consul服务发现和Polly策略

    gRPC由于需要用工具生成代码实现,可开发性不是很高,在扩展这方面不是很友好 最近研究了下,进行了扩展,不需要额外的工具生成,直接使用默认Grpc.Tools生成的代理类即可 相关源码在文章底部 客户 ...

  6. Journal of Proteome Research | Clinically Applicable Deep Learning Algorithm Using Quantitative Proteomic Data (分享人:翁海玉)

    题目:Clinically Applicable Deep Learning Algorithm Using Quantitative Proteomic Data 期刊:Journal of Pro ...

  7. HTML基本标签,表格标签,框架标签

    1.html简介 1.1什么是html html全称:Hyper Text Markup Language(超文本标记语言) 备注:           a.超文本:页面内可以包含图片.链接,甚至音乐 ...

  8. JavaScript(8)--- 闭包

    JavaScript(8)--- 闭包 理解闭包 我的理解是:闭包就是能够读取其他函数内部变量的函数.由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以简单这样理解 &q ...

  9. hdu6026 dijkstra

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/6026/ 题意大致是:给定一个图,要求删边使他变成树,使得每个点到0的距离就是原图中0到这个点的最短路径.其实就是 ...

  10. hdu1015+hdu1016 都是十分钟以内的深搜题

    hdu1015:给定一串可用序列值,每个字符映射到一个1-26之间的整数,选择五个有序数使得满足 a-b2+c3-d4+e5=target. #include<iostream> #inc ...