2018年9月1日大约 8 分钟
2018年9月1日大约 9 分钟
2018年9月1日大约 17 分钟
2018年9月1日大约 15 分钟
2018年9月1日大约 22 分钟
2018年9月1日大约 13 分钟
2018年9月1日大约 12 分钟
2018年9月1日大约 12 分钟
大家好,我是老马。
本来这个系列应该完结了。
不过最近老马在使用自己写的 cache 工具时,发现拓展性不太好,于是花了一点时间,对代码进行了重构。
Cache 用于实现一个可拓展的高性能本地缓存。
有人的地方,就有江湖。 有高性能的地方,就有 cache。
创作目的
-
为日常开发提供一套简单易用的缓存框架
-
便于后期多级缓存开发
-
学以致用,开发一个类似于 redis 的本地缓存渐进式缓存框架
2018年9月1日大约 7 分钟
大家好,我是老马。
Cache 用于实现一个可拓展的高性能本地缓存。
有人的地方,就有江湖。有高性能的地方,就有 cache。
v1.0.0 版本
以前的 FIFO 实现比较简单,但是 queue 循环一遍删除的话,性能实在是太差。
于是想到引入一个 Set 存储有哪些 key,改成下面的方式:
package com.github.houbb.cache.core.support.evict.impl;
import com.github.houbb.cache.api.ICacheContext;
import com.github.houbb.cache.core.model.CacheEntry;
import com.github.houbb.cache.core.support.evict.AbstractCacheEvict;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
/**
* 丢弃策略-先进先出
* @author binbin.hou
* @since 0.0.2
*/
public class CacheEvictFifo extends AbstractCacheEvict {
/**
* queue 信息
* @since 0.0.2
*/
private final Queue queue = new LinkedList<>();
/**
* 避免数据重复加入问题
* @since 1.0.1
*/
private final Set keySet = new HashSet<>();
@Override
public CacheEntry doEvict(ICacheContext context, final K newKey) {
CacheEntry result = null;
// 超过限制,执行移除
if(isNeedEvict(context)) {
K evictKey = queue.remove();
keySet.remove(evictKey);
// 移除最开始的元素
V evictValue = doEvictRemove(context, evictKey);
result = new CacheEntry<>(evictKey, evictValue);
}
return result;
}
@Override
public void updateKey(ICacheContext context, K key) {
if (!keySet.contains(key)) {
queue.add(key);
keySet.add(key);
}
}
}
2018年9月1日大约 4 分钟