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)
Redis 练习(二)的更多相关文章
- redis(二)高级用法
redis(二)高级用法 事务 redis的事务是一组命令的集合.事务同命令一样都是redis的最小执行单元,一个事务中的命令要么执行要么都不执行. 首先需要multi命令来开始事务,用exec命令来 ...
- Redis系列(二):Redis的数据类型及命令操作
原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...
- redis入门(二)
目录 redis入门(二) 前言 持久化 RDB AOF 持久化文件加载 高可用 哨兵 流程 安装部署 配置技巧 集群 原理 集群搭建 参考文档 redis入门(二) 前言 在redis入门(一)简单 ...
- redis(二)redis的主从模式和集群模式
redis(二)redis的主从模式和集群模式 主从模式 集群模式 主从模式 redis的主从模式,指的是针对多台redis实例时候,只存在一台主服务器master,提供读写的功能,同时存在依附在这台 ...
- 【Docker】 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二)
系列目录: [Docker] CentOS7 安装 Docker 及其使用方法 ( 一 ) [Docker] 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二) [D ...
- Redis系列(二)-Hredis客户端设计及开源
接上篇c#实现redis客户端(一),重新整理些了下. 阅读目录: 项目说明 Hredis设计图 单元测试场景 总结 项目说明 背景:因为有地方要用,而又没找到对sentinel良好支持的Net客户端 ...
- Redis教程(二):String数据类型
一.概述: 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型 ...
- Redis系列二之事务及消息通知
一.事务 Redis中的事务是一组命令的集合.一个事务中的命令要么都执行,要么都不执行. 1.事务简介 事务的原理是先将一个事务的命令发送给Redis,然后再让Redis依次执行这些命令.下面看一个示 ...
- C# Redis实战(二) [转]
二.Redis服务 在C# Redis实战(一)中我将所有文件拷贝到了D盘redis文件夹下,其中redis-server.exe即为其服务端程序,双击即开始运行,如图 ...
- redis(二)Redis适用场景,如何正确的使用
网络IO模型 Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe 传递给worker线程,进行读写IO, ...
随机推荐
- 智慧港口——基于二三维一体化GIS的港口可视化监管平台
“智慧港口”是以现代化基础设施设备为基础,以云计算.大数据.物联网.移动互联网.智能控制等新一代信息技术与港口运输业务深度融合为核心,以港口运输组织服务创新为动力,以完善的体制机制.法律法规.标准规范 ...
- postgreSQL外键引用查询 查询外键被那些表占用
根据一个表名,查询所有外键引用它的表,以及那些外键的列名key_column_usage(系统列信息表),pg_constraint(系统所有约束表) SELECT x.table_name, x.c ...
- ES6、ES7、ES8语法总结
ES6 1. var let const let,const具有块级作用域,不具有变量提升 const 用于不能被重新赋值的变量 2. 箭头函数 我们经常要给回调函数给一个父级的this 常用办法就是 ...
- iview mock main.js
main.js // 实际打包时应该不引入mock /* eslint-disable */ // if (process.env.NODE_ENV !== 'production') require ...
- Java-方法(新手)
//创建的一个类.public class zy1ri0319 { //公共静态的主方法. public static void main(String[] args){ //调用方法. zy1(); ...
- [C#] 命令总线模式
1 高内聚.低耦合 虽然已经毕业很多年了,但依然总是能记得,<软件工程>这门课的老师总是强调 "高内聚,低耦合". 这些年,在架构方面的技术发展方向,目标就是不断的拆分 ...
- JDK14的新特性-Switch新功能
2020年3月17日,Oracle正式发布了JDK14版本,共新增了16项新特性 本文重点写一下关于switch的新功能: switch 表达式扩展了 switch 语句,使其不仅可以作为语句(sta ...
- 数据库安装和基本sql语句
数据库概念 文件作为数据进行存储,数据格式千差万别 将保存数据的地方统一起来 MYSQL--------->一款应用软件 用来帮你操作文件的 只要是基于网络通信,底层就是socket 服务端 - ...
- Nginx.pid打开失败以及失效的解决方案
在启动nginx的时候报了如下的错误: 其意思是没有该文件或者是目录,通过查看之后发现确实没有该目录 cd /var/run/nginx 于是重新创建了这个文件,使用如下命令: mkdir / ...
- 题解 CF1304E 【1-Trees and Queries】
前言 这场比赛,在最后 \(5\) 分钟,我想到了这道题的 \(Idea\),但是,没有打完,比赛就结束了. 正文 题目意思 这道题目的意思就是说,一棵树上每次给 \(x\) 和 \(y\) 节点连 ...