如何为Redis中list中的项设置过期时间
Redis是一个伟大的工具,用来在内存中存储列表是很合适的。
不过,如果你想要快速搜索列表,同时需要让列表中每项都在一定时间后过期,应该怎么做呢?
首先,当然不能使用不同的类似的key存储数据,然后使用keys
命令来获取所有类似key的数据。这样的开销是不可接受的。
Redis并没有直接提供方法做这件事,但是这是可以做到的!虽然最后用的未必是Redis的List数据结构。
我接下来会展示给你看。
问题
最近,我遇到一个问题,我有一个数据列表,需要用它来制作折线图,我准备使用API返回这个数据列表,然后在前端绘图。
这个数据列表本身是挺大的,然后它还会一直更新,所以放在数据库是不合适的,我计算过从数据库取回需要10s。所以我决定使用redis。
碰到一个问题,就是数据列表中的数据,如果超过一定时间的话我是不需要了,否则这个列表会变得无比巨大。所以我需要redis对列表中的每个项都设置过期时间。
然后我在网上找到这篇文章,它描述了两种办法。
在讲解这两种办法之前,你需要明白redis的两个数据结构:
- Redis的集合:“无序的字符串集合”,它的项有下面的特点
- 唯一的(如果加入重复的数据,redis会默默的拒绝)
- 无序,并且不可以用任何方法(在redis中)排序
- Redis有序集合:“有序的字符串集合“,它的项有下面的特点:
- 和集合一样,每个项都是唯一的
- 拥有积分(项的积分并不必须是唯一的)
- 根据积分排序(有索引)
这两个集合,都不可以对其中的项设置过期时间。当然,你可以对整个集合设置过期时间。
两种解决方法
有序集合
查询有序集合是非常快的,因为redis将一个列表转换成了集合,所以当我们访问它的时候,它已经是排好序的了。
根据Redis文档的描述:
“Sorted sets are implemented via a dual-ported data structure containing both a skip list and a hash table, so every time we add an element Redis performs an O(log(N)) operation. That’s good, but when we ask for sorted elements Redis does not have to do any work at all, it’s already all sorted”
当然,你不可以对有序集合中每个项设置TTL。
你可以通过score
对有序集合进行查询,我们可以利用这个地方来形成一个解决方案:
对于加入到有序集合的每个项,我们都将它的score设置为Unix Timestamp,这个timestamp代表它的过期时间。然后,我们加入一个定时任务,定时移除那些过期的数据。
多个集合以及TTL
这个方案使用普通的集合。
因为不能对集合中每项都设置TTL,但是可以对整个集合设置TTL。所以,我们可以将每个时间段的数据放在一个集合中。然后对这个集合设置过期时间。
如何为Redis中list中的项设置过期时间的更多相关文章
- Redis原子性写入HASH结构数据并设置过期时间
Redis中提供了原子性命令SETEX或SET来写入STRING类型数据并设置Key的过期时间: > SET key value EX NX ok > SETEX key value ok ...
- 使用redis事物解决stringRedisTemplate.setIfAbsent()并设置过期时间遇到的问题
spring-date-redis版本:1.6.2场景:在使用setIfAbsent(key,value)时,想对key设置一个过期时间,同时需要用到setIfAbsent的返回值来指定之后的流程,所 ...
- redis数据库如何批量删除键和设置过期时间?
我们可以借助Linux中的xargs,在终端中执行命令来实现这两个功能. 一.批量删除键 批量删除以"key"开头key的方法,需要借助Linux中的xargs,在终端中执行以下命 ...
- angular中的$cookies和$cookieStore设置过期时间
angular1.4及以上版本才支持$cookies. 项目引入的是1.4.2版本,操作cookies原先一直用的是$cookieStore,用的飞起啊. $cookieStore.remove(&q ...
- redis中的key设置过期时间
EXPIRE key seconds 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除. 在 Redis 中,带有生存时间的 key 被称为『易失的 ...
- 查询redis中没有设置过期时间的key
#!/bin/sh ## 该脚本用来查询redis集群中,哪些key是没有设置过期时间,对应只需要修改redis的其中一个实例的 host和port ## 脚本会自动识别出该集群的所有实例,并查出对应 ...
- python中使用redis模块, 设置过期时间
# 链接数据库self.handle = redis.Redis(host=host, port=port, db=db, password=password, decode_responses=Tr ...
- redis 一二事 - 设置过期时间,以文件夹形式展示key显示缓存数据
在使用redis时,有时回存在大量数据的时候,而且分类相同,ID相同 可以使用hset来设置,这样有一个大类和一个小分类和一个value组成 但是hset不能设置过期时间 过期时间只能在set上设置 ...
- java操作Redis缓存设置过期时间
关于Redis的概念和应用本文就不再详解了,说一下怎么在java应用中设置过期时间. 在应用中我们会需要使用redis设置过期时间,比如单点登录中我们需要随机生成一个token作为key,将用户的信息 ...
随机推荐
- Kettle 事务、转换内顺序、excel模版、使用踩坑
kettle中转换和作业的执行顺序: 1.一个作业内的转换,是顺序执行的. 2.一个转换内的步骤是并行执行的. 3.作业内不支持事务,转换内支持事务. 根据业务需要,通常需要在 ...
- vue项目搭建和开发流程 vue项目配置ElementUI、jQuery和Bootstrap环境
目录 一.VUE项目的搭建 1. 环境搭建 2. 项目的创建和启动 二. 开发项目 1. 配置vue项目启动功能 2. 开发vue项目 (1)项目文件的作用 (2)vue项目开发流程 (3)vue项目 ...
- mongodb为集合新增字段、删除字段、修改字段(转)
新增字段 为atest集合新增一个字段content db.atest.update({},{$set:{content:""}},{multi:1}) 删除uname字段 db. ...
- 32. ClustrixDB License管理
一.许可的概述 ClustrixDB必须拥有有效的许可证才能运行.本授权指定: 集群中允许的最大节点数 ClustrixDB将使用的最大核数 在裸金属系统上,ClustrixDB将尝试启用与已授权的物 ...
- Python身份运算符
运算符 描述 实例 is is 是判断两个标识符是不是引用自一个对象 x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False is not ...
- @RequestMapping的简单理解
@Controller public class ItemController { @Autowired private ItemService itemService; 获取路径参数.../item ...
- js上传超大文件解决方案
需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...
- H5 设计尺寸
750*1218 微信下 兼容 7plus 内容高度 居中 1000px 内 750*1448 微信下 兼容 iphoneX 微信导航栏高度 64px 64px = 导航栏44+状态栏20 但是现在 ...
- JavaWeb_(Struts2框架)参数传递之接收参数与传递参数
此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...
- ZooKeeper的简述
一.简介 ZooKeeper是一个高性能,分布式的,开源分布式应用协调服务.它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如同步,集群管理,命名空间,配置维护等.ZooKeeper使 ...