在我们日常工作中,有许多这种逻辑

例如需要得到最近三分钟的cache list. 例如我们监控系统需要查询最近一分钟的数据。

总结说来就是 需要一个list存储对象,并且这个对象会无限制增长,需要设置过期.

普遍做法有两种: 
1.一种就是简单的list,存储的对象带有expireTime,然后定时任务不停的拿到整个list并去除过期的member.

2.一种是把整个list的每个成员都当做一个key来存,然后分别设置超时时间,虽然解决了超时问题,但是显然这样实在太过于浪费,而且很多操作都需要得到size或者整个list,那么就需要keys “usercache_”。一旦成员过多,key太多,keys消耗非常大,不推荐.


使用sorted set实现

redis有一个sorted set,就是一个根据score排序的set。仔细一看,极为契合我们的需求! 
话不多说,直接上代码!

/**
* 聚合器
* @author Mingchenchen
*
*/
public class Aggregator {
private RedisTemplate<String, Event> redisTemplate;
private ZSetOperations<String, Event> zSetOperations; /**
* constructor
* @param redisTemplate
* @param expireMillions
*/
public Aggregator(RedisTemplate<String, Event> redisTemplate){
this.redisTemplate = redisTemplate;
redisTemplate.setKeySerializer(new Serializer());
redisTemplate.setValueSerializer(new EventSerializer());
this.zSetOperations = redisTemplate.opsForZSet();
} /**
* 存入一条数据到sorted set
* @param key
* @param event
*/
public boolean zset(String key, Event event){
long now = System.currentTimeMillis();
return zSetOperations.add(key, event, now);
} /**
* 取出整个set的所有记录
* @param key
* @return
*/
public Set<Event> zgetAll(String key, long expireSec){
long now = System.currentTimeMillis();
long tts = now - expireSec * 1000; //下标用-1才能表示最大值 score和count要用-inf和+inf
//return zSetOperations.rangeByScore(key, tts+1, -1); return zSetOperations.rangeByScore(key, tts+1, Long.MAX_VALUE);
} /**
* 查看匹配数目
* @param key
* @param expire:过期时间 单位是秒
* @return
*/
public long zCount(String key, long expireSec){
long now = System.currentTimeMillis();
long tts = now - expireSec * 1000; //下标用-1才能表示最大值 score和count要用-inf和+inf
//return zSetOperations.count(key, tts+1, -1); return zSetOperations.count(key, tts+1, Long.MAX_VALUE);
} /**
* 删除一整个policyCache
* @param zsetKey
*/
public void removeCache(String zsetKey){
redisTemplate.delete(zsetKey);
} /**
* 缓存清理者
*/
@SuppressWarnings("unchecked")
public void cacheCleaner(){
Cache<String, InstantPolicy> cache = SpringContextUtil.getBean("policyCache", Cache.class);
if (cache==null || cache.getAll().isEmpty()) {
return;
} for (InstantPolicy policy : cache.getAll().values()) {
String keyPref = policy.buildKeyPref(); Set<String> policyCacheKeys = redisTemplate.keys(keyPref);
if (policyCacheKeys==null || policyCacheKeys.isEmpty()) {
return;
} //移除过期数据
long now = System.currentTimeMillis();
long tts = now - policy.getDuration() * 1000;
for (String key : policyCacheKeys) {
zSetOperations.removeRangeByScore(key, 0, tts);
}
}
} private class Serializer implements RedisSerializer<String> {
public byte[] serialize(String s) {
if (s == null) {
return null;
}
return s.getBytes();
} public String deserialize(byte[] bytes) {
if (bytes == null) {
return null;
}
return new String(bytes);
}
} private class EventSerializer implements RedisSerializer<Event> {
public byte[] serialize(Event event) {
if (event == null) {
return null;
}
return JSONObject.toJSONBytes(event);
} public Event deserialize(byte[] bytes) {
if (bytes == null) {
return null;
}
return JSONObject.parseObject(bytes, Event.class);
}
}
}

附: 
sorted set学习资料

http://www.cnblogs.com/stephen-liu74/archive/2012/03/23/2354994.html

http://doc.redisfans.com/sorted_set/zrangebyscore.html

显示推荐内容

使用Redis sorted set实现集合设置member过期的更多相关文章

  1. Redis之Sorted Set 有序集合

    Redis Sorted Set 有序集合 Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分 ...

  2. Redis的Sorted Set有序集合命令

    Sorted Set是Set的一个升级版本,它在Set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序.可以理解为有两列的mysql表, ...

  3. Redis中7种集合类型应用场景&redis常用命令

    Redis常用数据类型 Redis最为常用的数据类型主要有以下五种: String Hash List Set Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部 ...

  4. redis:php-redis中有序集合 zset的使用

    ZSET(stored set) 和 set 一样是字符串的集合,不同的是每个元素都会关联一个 double 类型的 score .实现使用的是 skip list 和 hash table , sk ...

  5. redis中插入用户集合的语句,有四个属性

    一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 ...

  6. Redis Sorted Set

    Redis Sorted Set Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合 ...

  7. Redis sorted set 常用命令介绍

    Redis sorted set 使用: Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个 ...

  8. redis对set(无序集合)的相关操作

    redis对set类型(无序集合)操作的相关命令以及如何在python使用这些命令 redis对set类型操作的命令: 命令 语法 概述 返回值 Redis Sadd 命令 sadd key memb ...

  9. 快速整明白Redis中的整数集合到底是个啥

    整数集合简介 整数集合(intset)是Redis集合数据类型的内部编码之一,当集合数据类型中的元素都是整数并且元素数量较少的时候,Redis就使用整数集合作为内部编码. 整数集合(intset)中可 ...

随机推荐

  1. flask/app.py-add_url_rule源码分析

    之前分析route方法的时候,可以看到中间会调用add_url_rule方法,add_url_rule方法和route方法一样属于Flask这个类的. add_url_rule方法主要用来连接url规 ...

  2. Java反射机制、注解及JPA实现

    1.java反射概述 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称 ...

  3. iOS UIView视图的图层控制

    1.添加视图 insertSubview:atIndex:   //放在子视图数组的具体索引位置 insertSubview:aboveSubview:   //某个子视图前面 insertSubvi ...

  4. iOS Touch Id 开发

    Touch Id Touch Id是iPhone5S后加入的一项新的功能,也就是大家熟知的指纹识别技术.大家用得最多的可能是手机的解屏操作,不用在和以前一样输入手机的四位数密码进行验证.一方面不用担心 ...

  5. stm32 引脚映射 和 ADC

    老是弄不明白ADC的输入到底在哪,看了stm32F103Ve的datasheet,将引脚和通道的映射关系贴在下面: 好了,写到这,我已经看了中文手册一上午了,可是啥都没看懂,下午接着看,写代码不重要, ...

  6. linux crontab 鉴定令牌不再有效,需要新的鉴定令牌 [ You (root) are not allowed to access to (crontab) because of pam configuration.]

    用户root 解决方法: 用root用户,执行 chage -M 99999 root 更改有效期为99999天.

  7. tomcate环境搭建

    Tomcat 环境搭建 最近在工作之余,看到了一些 Tomcat 的基础资料,感觉蛮好.同时也回忆起自己刚毕业要参加工作那会对 Tomcat 也是各种资料各种查,实属不易.为此,针对最近整理的一些基础 ...

  8. group_concat 排序并取前三个

    substring_index(group_concat(distinct num order by num desc),',',3)

  9. TDOA 之TDOA算法python实现

    这里指的TDOA算法,实际是解两个双曲线方程,由于两个二次方程设计东西较多,如果强解,计算量很大,从网上参考了如下链接: 算法推到:https://blog.csdn.net/lpsl1882/art ...

  10. / WebAPP开发与小程序 / 步骤一 · 4-5 地图搜索与poi结合(2)

    / WebAPP开发与小程序 / 步骤一 · 4-5 地图搜索与poi结合(2) 在地图中搜索指定对象时,搜索结果可以显示出每个对象的图片,就差这个不会了