实现一个简单的缓存,具有缓存添加,获取,删除,过期自动删除等,主要存储方式为Map
首先建一个缓存数据实体类,用到了lombok消除get set 和全参构造函数
[java] view plain copy
- import lombok.AllArgsConstructor;
- import lombok.Getter;
- import lombok.Setter;
- @Getter
- @Setter
- @AllArgsConstructor
- public class CacheEntity {
- /**
- * 数据主体
- */
- private Object data;
- /**
- * 超时时长,0永不超时
- */
- private Long timeout;
- /**
- * 缓存设置初始时间
- */
- private Long initialTime;
- }
再建一个缓存具体操作接口,支持对缓存的各种操作
[java] view plain copy
- import java.u;
- import java.u;
- public interface CacheManager {
- /**
- * 存入缓存
- * @param key
- * @param data
- */
- void put(String key, CacheEntity cacheData);
- /**
- * 存入缓存
- * @param key
- * @param data
- * @param timeout
- */
- void put(String key, Object data, Long timeout);
- /**
- * 获取缓存
- * @param key
- * @return
- */
- CacheEntity getCacheByKey(String key);
- /**
- * 获取所有缓存
- * @return
- */
- Map<String, CacheEntity> getCacheAll();
- /**
- * 判断缓存是否存在
- * @param key
- * @return
- */
- boolean isExist(String key);
- /**
- * 清除所有缓存
- */
- void clearAll();
- /**
- * 清除对应缓存
- * @param key
- */
- void clearByKey(String key);
- /**
- * 缓存是否失效
- * @param key
- * @return
- */
- boolean isTimeOut(String key);
- /**
- * 获取所有key
- * @return
- */
- Set<String> getKeys();
- }
对缓存接口实现,主要运用ConcurrentHashMap来保证多线程读写
[java] view plain copy
- import java.u;
- import java.u;
- import java.u;
- public class CacheManagerImpl implements CacheManager{
- private static Map<String, CacheEntity> caches = new ConcurrentHashMap<>();
- @Override
- public void put(String key, CacheEntity cacheData) {
- cac(key, cacheData);
- }
- @Override
- public void put(String key, Object data, Long timeout) {
- timeout = timeout > 0? timeout : 0L;
- put(key, new CacheEntity(data, timeout, Sy()));
- }
- @Override
- public CacheEntity getCacheByKey(String key) {
- i(key))
- return cac(key);
- return null;
- }
- @Override
- public Map<String, CacheEntity> getCacheAll() {
- return caches;
- }
- @Override
- public boolean isExist(String key) {
- return cac(key);
- }
- @Override
- public void clearAll() {
- cac();
- }
- @Override
- public void clearByKey(String key) {
- if (key)) {
- cac(key);
- }
- }
- @Override
- public boolean isTimeOut(String key) {
- if (!(key)) {
- return true;
- }
- CacheEntity cacheEntity = cac(key);
- Long timeOut = cac();
- Long initialTime = cac();
- if (timeOut == 0 || Sy() - initialTime < timeOut) {
- return false;
- }
- return true;
- }
- @Override
- public Set<String> getKeys() {
- return cac();
- }
- }
然后再新建一个线程对该缓存进行监听,来处理过期数据
[java] view plain copy
- import java.u;
- public class CacheListener {
- private CacheManager cacheManager;
- public CacheListener(CacheManager cacheManager) {
- = cacheManager;
- }
- public void startListen() {
- new Thread(new Runnable() {
- @Override
- public void run() {
- while(true) {
- Set<String> keys = cac();
- for (String key : keys) {
- i(key)) {
- cac(key);
- Sy(key + " 被清除了");
- }
- }
- try {
- T(5000);
- Sy("休息5s再检查");
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }).start();
- }
- }
最后测试类如下
[java] view plain copy
- import java.u;
- import java.u;
- public class TestCache {
- public static void main(String[] args) {
- CacheManager cacheManager = new CacheManagerImpl();
- cac("testtimeout", "kkkkkkkkk", 20 * 1000L);
- cac("test1", "111111111", 0L);
- cac("test2", "222222222222222", 100 * 1000L);
- cac("test3", "33333333333333", 0L);
- CacheListener cacheListener = new CacheListener(cacheManager);
- cac();
- Sy("getCacheAll : " + Arrays.asLi()));
- Sy("getCacheKeyAll : " + Arrays.asList(cac()));
- Sy("getKey : " + Arrays.asLi("test1")));
- Sy("isExist false: " + Arrays.asLi("test")));
- Sy("isExist true: " + Arrays.asLi("test1")));
- Sy("istimeOut false: " + Arrays.asLi("test1")));
- try {
- TimeUnit.SECONDS.sleep(30);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- Sy("isExist : " + Arrays.asLi("testtimeout")));
- }
- }
运行结果: