使用Redisのは、設定された有効期限の設定メンバーを達成するためにソートセット

私たちの毎日の仕事では、多くのそのようなロジックがあります

このような最後の3分のキャッシュリストを取得する必要がありますよう。例えば、我々は最新のデータでシステム分の情報を監視する必要があります。

リストには、オブジェクトを格納する必要があり、そしてオブジェクトが無制限の成長になると結論付け、我々は有効期限を設定する必要があります。

2つの一般的なアプローチがあります: 
1つは、全体のリストを取得し、古くなったメンバーを削除するための簡単なリスト、expireTimeとオブジェクトストレージ、そしてノンストップスケジュールされたタスクです。

全リストは、ストアへの鍵として、各メンバーを持つことであるし、問題セットタイムアウト、タイムアウト解きましたが、明らかに、これは本当にあまりにも無駄である、と多くの操作は、サイズやリスト全体する必要がありますあなたは、キー「usercache_」が必要です。鍵の消費量が非常に大きい、あまりにも多くのメンバー、あまりにもキーたら、それは推奨されません。


達成するためにソートセットを使用しました

Redisのは、ソートセットを持って、ランク付けセットスコアに基づいています。非常に我々のニーズに合わせて、密接に見て! 
いくつかの単語の男は、直接コードに、言いました!

/**
 * 聚合器
 * @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); } } }

添付: 
教材SETをソート

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

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

おすすめ

転載: www.cnblogs.com/zhuyeshen/p/11912792.html