您的位置:首页 >新闻资讯 > 正文

动态代理进行缓存容器容量限制操作

来源:互联网 作者:admin 时间:2019-10-07 15:01:00

  数据缓存,是伴随着大家网络使用而产生的,或许还有很多人对缓存没有什么概念,毕竟它平时没有什么存在感。但是当缓存过多,占据太多的空间,就会影响到你的使用。


动态代理进行缓存容器容量限制操作


  在Java Web中经常使用缓存,但是如果缓存数据量非常大,则容易出现OOM的情况。


  这个时候可以使用动态代理,限制缓存容器的容量。


  如果达到容量上限,则可以移除过期的缓存数据。


  以下是具体的代码操作部分:


  import java.lang.reflect.InvocationHandler;

  import java.lang.reflect.Method;

  import java.lang.reflect.Proxy;

  import java.util.HashMap;

  import java.util.Map;

  public class MapInvocationHandler implements InvocationHandler {

  private Map<String, String> map = new HashMap<String, String>();

  private int limit = 10;

  public MapInvocationHandler(int limit) {

  this.limit = limit;

  }

  public MapInvocationHandler() {

  }

  public Map<String, String> getInstance() {

  return (Map<String, String>) Proxy.newProxyInstance(map.getClass()

  .getClassLoader(), map.getClass().getInterfaces(), this);

  }

  @Override

  public Object invoke(Object proxy, Method method, Object[] args)

  throws Throwable {

  Object result;

  if ("put".equals(method.getName())) {

  if (map.size() == limit) {

  return "已达容器上线";

  }

  System.out.println("Key:" + args[0] + ",Value:" + args[1]);

  }

  result = method.invoke(map, args);

  return result;

  }

  public static void main(String[] args) {

  Map<String, String> map = new MapInvocationHandler(3).getInstance();

  map.put("1", "1");

  map.put("2", "2");

  map.put("3", "3");

  String s = map.put("4", "4");

  System.out.println(s);

  }

  }


  其中invoke方法中的proxy参数是代理对象。


  通过上述操作,就可以限制缓存容量。ET代理服务器独享带宽、多平台自动切换ip、可免费试用10分钟,快速稳定。


相关文章内容简介