JAVA CACHE








public class TaskCache implements API, Runnable {

    public TaskCache() {
        startSchedule();
    }

    private Map<String, List<Task>> taskMap = new HashMap<String, List<Task>>();

    private final String ID = "ID_";
    private final String HOST = "HOST_";
    private final String IP = "IP_";
    private ConcurrentMap<Long, Task> timeMap = new ConcurrentHashMap<Long, Task>();

    public Map<Long, Task> getTimeMap() {
        return timeMap;
    }


    public void put(Task task, Long time) {

        synchronized(taskMap) {

            timeMap.put(time,task);
            if (taskMap.containsKey(ID + task.getId())) {
                taskMap.get(ID + task.getId()).add(task);
            } else {
                List<Task> idTask = new ArrayList<Task>();
                idTask.add(task);
                taskMap.put(ID + task.getId(), idTask);

            }

            if (taskMap.containsKey(IP + task.getIp())) {
                taskMap.get(IP + task.getIp()).add(task);
            } else {
                List<Task> ipTask = new ArrayList<Task>();
                ipTask.add(task);
                taskMap.put(IP + task.getIp(), ipTask);

            }

            if (taskMap.containsKey(HOST + task.getHost())) {
                taskMap.get(HOST + task.getHost()).add(task);
            } else {
                List<Task> hostTask = new ArrayList<Task>();
                hostTask.add(task);
                taskMap.put(HOST + task.getHost(), hostTask);

            }


        }
    }

    public void add(Task task, int expiredTime) {
        try {
            synchronized(taskMap) {
                System.out.println("task map size : "+taskMap.size());
                put(task, expiredTime + System.currentTimeMillis());

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public List<Task> queryById(String id) {

        synchronized(taskMap) {

            return taskMap.get(ID + id);
        }
    }

    public List<Task> queryByIp(String ip) {
        synchronized(taskMap) {
            return taskMap.get(IP + ip);
        }
    }

    public List<Task> queryByHost(String host) {
        synchronized(taskMap) {
            return taskMap.get(HOST + host);
        }
    }

    public void remove(Task task) {
        try {
            synchronized(taskMap) {
                List idList = taskMap.get(ID + task.getId());
                if (idList!=null&&idList.contains(task)) {
                    idList.remove(task);
                    if (idList.size() == 0) {
                        System.out.println("remove ipList " + ID + task.getId());
                        taskMap.remove(ID + task.getId
                                ());
                    }
                    System.out.println(task.toString() + " has removed from idList");
                } else {
                    System.out.println("no operation idList");
                }
                List ipList = taskMap.get(IP + task.getIp());
                if (ipList!=null&& ipList.contains(task)) {
                    ipList.remove(task);
                    System.out.println(task.toString() + " has removed ipList");
                    if (ipList.size() == 0) {
                        System.out.println("remove ipList " + IP + task.getIp());
                        taskMap.remove(IP + task.getIp());
                    }
                } else {
                    System.out.println("no operation ipList");
                }
                List hostList = taskMap.get(HOST + task.getHost());
                if (hostList!=null &&hostList.contains(task)) {
                    hostList.remove(task);
                    System.out.println(task.toString() + " has removed hostList");
                    if (hostList.size() == 0) {
                        System.out.println("remove hostlist " + HOST + task.getHost());
                        taskMap.remove(HOST + task.getHost());
                    }
                } else {
                    System.out.println("no operation hostList");
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void run() {
        try {
            for (Long key : timeMap.keySet()) {
                System.out.println("prepare remove task "+key);
                long current = System.currentTimeMillis();
                if (current > key) {
                    Task t = timeMap.get(key);
                    System.out.println("remove t");
                    remove(t);

                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void startSchedule() {

        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        service.scheduleAtFixedRate(this, 0, 2, TimeUnit.SECONDS);
    }
}
/**
 * Created by baidu on 15/9/23.
 */
public class Task {

    private String id;
    private String ip;
    private String host;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    @Override
    public String toString() {
        return "Task{" +
                "id='" + id + '\'' +
                ", ip='" + ip + '\'' +
                ", host='" + host + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        Task task = (Task) o;

        if (!id.equals(task.id)) {
            return false;
        }
        if (!ip.equals(task.ip)) {
            return false;
        }
        return host.equals(task.host);

    }

    @Override
    public int hashCode() {
        int result = id.hashCode();
        result = 31 * result + ip.hashCode();
        result = 31 * result + host.hashCode();
        return result;
    }
}

/**
 * Created by baidu on 15/9/24.
 */
public class TaskFactory {
    public static Task buildTask(){
        Task task = new Task();
        task.setId(UUID.randomUUID().toString());
        task.setHost(UUID.randomUUID().toString());
        task.setIp(UUID.randomUUID().toString());
        return task;
    }

    public static void main(String[] args) {
        System.out.println("haha");
    }
}

/**
 * Created by baidu on 15/9/23.
 */
public interface API {

    public void add(Task task ,int expiredTime);

    public List<Task> queryById(String id);

    public List<Task> queryByIp(String ip);

    public List<Task> queryByHost(String host);

}

public class CacheTest {
    public static void main(String[] args) {
        API api = new TaskCache();


        while (true){
            api.add(TaskFactory.buildTask(),5000);
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

    }

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值