Cache design with eviction policies












0












$begingroup$


I am trying to come up with design for different types of cache with different eviction policies but I am facing difficulty linking the eviction policy with cache. Mainly what to pass in evict() method so that it can be generic for different cache implementations like LRU, LFU etc.



It will really helpful if this can be reviewed and I get some pointers on how to do it.



Here's what I have worked upon till now:



Cache.java



public interface Cache {

String get(String key);

boolean set(String key, String value);

void evict();

EvictionPolicy getEvictionPolicy();

void startEvictor(long delay);
}


EvictionPolicy



public interface EvictionPolicy {
//Scheduled execution of this method examines the cache key
//if it can be evicted return true else false
boolean evict();
}


CacheConfig.java



public class CacheConfig {

private EvictionPolicy evictionPolicy;

public EvictionPolicy getEvictionPolicy() {
return evictionPolicy;
}

public void setEvictionPolicy(EvictionPolicy evictionPolicy) {
this.evictionPolicy = evictionPolicy;
}
}


BaseCache.java



import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;

public class BaseCache implements Cache{

private volatile EvictionPolicy evictionPolicy;

private Evictor evictor = null;

public BaseCache(CacheConfig config) {
setConfig(config);
}

public void setConfig(CacheConfig config){
setEvictionPolicy(config.getEvictionPolicy());
}

public void setEvictionPolicy(final EvictionPolicy evictionPolicy) {
this.evictionPolicy = evictionPolicy;
}

@Override
public void evict() {
EvictionPolicy evictionPolicy = getEvictionPolicy();
evictionPolicy.evict();
}

@Override
public EvictionPolicy getEvictionPolicy() {
return evictionPolicy;
}

@Override
public String get(String key) {
return null;
}

@Override
public boolean set(String key, String value) {
return false;
}

public void startEvictor(final long delay) {
if (delay > 0) {
evictor = new Evictor();
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1, new EvictorThreadFactory());
executor.scheduleWithFixedDelay(evictor, delay, delay, TimeUnit.MILLISECONDS);
}
}

class Evictor implements Runnable {

@Override
public void run() {
try {
evict();
} catch(final Exception e) {
System.out.println("Swallow exception!!");
}
}
}

private static class EvictorThreadFactory implements ThreadFactory {

@Override
public Thread newThread(final Runnable runnable) {
return new Thread(null, runnable, "evictor-thread");
}
}
}


DefaultEvictionPolicy



 public class DefaultEvictionPolicy implements EvictionPolicy {

@Override
public boolean evict() {
return true;
}
}


LruCache



public class LruCache extends BaseCache {

private Map<String, String> cachedObjects = new ConcurrentHashMap<>();

public LruCache(CacheConfig config) {
super(config);
setConfig(config);
}

public void setConfig(CacheConfig config){
super.setConfig(config);
setEvictionPolicy(config.getEvictionPolicy());
}

@Override
public void evict() {
EvictionPolicy evictionPolicy = getEvictionPolicy();
evictionPolicy.evict();
}


@Override
public String get(String key) {
return null;
}

@Override
public boolean set(String key, String value) {
return false;
}
}


Main.java



public class Main {
public static void main(String args) {

CacheConfig config = new CacheConfig();
config.setEvictionPolicy(new DefaultEvictionPolicy());

Cache cache = new LruCache(config);

cache.set("key1", "10");
cache.set("key2", "12");
cache.get("key1");
cache.startEvictor(5);
}
}









share|improve this question









New contributor




Amit Kumar is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$endgroup$

















    0












    $begingroup$


    I am trying to come up with design for different types of cache with different eviction policies but I am facing difficulty linking the eviction policy with cache. Mainly what to pass in evict() method so that it can be generic for different cache implementations like LRU, LFU etc.



    It will really helpful if this can be reviewed and I get some pointers on how to do it.



    Here's what I have worked upon till now:



    Cache.java



    public interface Cache {

    String get(String key);

    boolean set(String key, String value);

    void evict();

    EvictionPolicy getEvictionPolicy();

    void startEvictor(long delay);
    }


    EvictionPolicy



    public interface EvictionPolicy {
    //Scheduled execution of this method examines the cache key
    //if it can be evicted return true else false
    boolean evict();
    }


    CacheConfig.java



    public class CacheConfig {

    private EvictionPolicy evictionPolicy;

    public EvictionPolicy getEvictionPolicy() {
    return evictionPolicy;
    }

    public void setEvictionPolicy(EvictionPolicy evictionPolicy) {
    this.evictionPolicy = evictionPolicy;
    }
    }


    BaseCache.java



    import java.util.concurrent.ScheduledThreadPoolExecutor;
    import java.util.concurrent.ThreadFactory;
    import java.util.concurrent.TimeUnit;

    public class BaseCache implements Cache{

    private volatile EvictionPolicy evictionPolicy;

    private Evictor evictor = null;

    public BaseCache(CacheConfig config) {
    setConfig(config);
    }

    public void setConfig(CacheConfig config){
    setEvictionPolicy(config.getEvictionPolicy());
    }

    public void setEvictionPolicy(final EvictionPolicy evictionPolicy) {
    this.evictionPolicy = evictionPolicy;
    }

    @Override
    public void evict() {
    EvictionPolicy evictionPolicy = getEvictionPolicy();
    evictionPolicy.evict();
    }

    @Override
    public EvictionPolicy getEvictionPolicy() {
    return evictionPolicy;
    }

    @Override
    public String get(String key) {
    return null;
    }

    @Override
    public boolean set(String key, String value) {
    return false;
    }

    public void startEvictor(final long delay) {
    if (delay > 0) {
    evictor = new Evictor();
    ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1, new EvictorThreadFactory());
    executor.scheduleWithFixedDelay(evictor, delay, delay, TimeUnit.MILLISECONDS);
    }
    }

    class Evictor implements Runnable {

    @Override
    public void run() {
    try {
    evict();
    } catch(final Exception e) {
    System.out.println("Swallow exception!!");
    }
    }
    }

    private static class EvictorThreadFactory implements ThreadFactory {

    @Override
    public Thread newThread(final Runnable runnable) {
    return new Thread(null, runnable, "evictor-thread");
    }
    }
    }


    DefaultEvictionPolicy



     public class DefaultEvictionPolicy implements EvictionPolicy {

    @Override
    public boolean evict() {
    return true;
    }
    }


    LruCache



    public class LruCache extends BaseCache {

    private Map<String, String> cachedObjects = new ConcurrentHashMap<>();

    public LruCache(CacheConfig config) {
    super(config);
    setConfig(config);
    }

    public void setConfig(CacheConfig config){
    super.setConfig(config);
    setEvictionPolicy(config.getEvictionPolicy());
    }

    @Override
    public void evict() {
    EvictionPolicy evictionPolicy = getEvictionPolicy();
    evictionPolicy.evict();
    }


    @Override
    public String get(String key) {
    return null;
    }

    @Override
    public boolean set(String key, String value) {
    return false;
    }
    }


    Main.java



    public class Main {
    public static void main(String args) {

    CacheConfig config = new CacheConfig();
    config.setEvictionPolicy(new DefaultEvictionPolicy());

    Cache cache = new LruCache(config);

    cache.set("key1", "10");
    cache.set("key2", "12");
    cache.get("key1");
    cache.startEvictor(5);
    }
    }









    share|improve this question









    New contributor




    Amit Kumar is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.







    $endgroup$















      0












      0








      0





      $begingroup$


      I am trying to come up with design for different types of cache with different eviction policies but I am facing difficulty linking the eviction policy with cache. Mainly what to pass in evict() method so that it can be generic for different cache implementations like LRU, LFU etc.



      It will really helpful if this can be reviewed and I get some pointers on how to do it.



      Here's what I have worked upon till now:



      Cache.java



      public interface Cache {

      String get(String key);

      boolean set(String key, String value);

      void evict();

      EvictionPolicy getEvictionPolicy();

      void startEvictor(long delay);
      }


      EvictionPolicy



      public interface EvictionPolicy {
      //Scheduled execution of this method examines the cache key
      //if it can be evicted return true else false
      boolean evict();
      }


      CacheConfig.java



      public class CacheConfig {

      private EvictionPolicy evictionPolicy;

      public EvictionPolicy getEvictionPolicy() {
      return evictionPolicy;
      }

      public void setEvictionPolicy(EvictionPolicy evictionPolicy) {
      this.evictionPolicy = evictionPolicy;
      }
      }


      BaseCache.java



      import java.util.concurrent.ScheduledThreadPoolExecutor;
      import java.util.concurrent.ThreadFactory;
      import java.util.concurrent.TimeUnit;

      public class BaseCache implements Cache{

      private volatile EvictionPolicy evictionPolicy;

      private Evictor evictor = null;

      public BaseCache(CacheConfig config) {
      setConfig(config);
      }

      public void setConfig(CacheConfig config){
      setEvictionPolicy(config.getEvictionPolicy());
      }

      public void setEvictionPolicy(final EvictionPolicy evictionPolicy) {
      this.evictionPolicy = evictionPolicy;
      }

      @Override
      public void evict() {
      EvictionPolicy evictionPolicy = getEvictionPolicy();
      evictionPolicy.evict();
      }

      @Override
      public EvictionPolicy getEvictionPolicy() {
      return evictionPolicy;
      }

      @Override
      public String get(String key) {
      return null;
      }

      @Override
      public boolean set(String key, String value) {
      return false;
      }

      public void startEvictor(final long delay) {
      if (delay > 0) {
      evictor = new Evictor();
      ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1, new EvictorThreadFactory());
      executor.scheduleWithFixedDelay(evictor, delay, delay, TimeUnit.MILLISECONDS);
      }
      }

      class Evictor implements Runnable {

      @Override
      public void run() {
      try {
      evict();
      } catch(final Exception e) {
      System.out.println("Swallow exception!!");
      }
      }
      }

      private static class EvictorThreadFactory implements ThreadFactory {

      @Override
      public Thread newThread(final Runnable runnable) {
      return new Thread(null, runnable, "evictor-thread");
      }
      }
      }


      DefaultEvictionPolicy



       public class DefaultEvictionPolicy implements EvictionPolicy {

      @Override
      public boolean evict() {
      return true;
      }
      }


      LruCache



      public class LruCache extends BaseCache {

      private Map<String, String> cachedObjects = new ConcurrentHashMap<>();

      public LruCache(CacheConfig config) {
      super(config);
      setConfig(config);
      }

      public void setConfig(CacheConfig config){
      super.setConfig(config);
      setEvictionPolicy(config.getEvictionPolicy());
      }

      @Override
      public void evict() {
      EvictionPolicy evictionPolicy = getEvictionPolicy();
      evictionPolicy.evict();
      }


      @Override
      public String get(String key) {
      return null;
      }

      @Override
      public boolean set(String key, String value) {
      return false;
      }
      }


      Main.java



      public class Main {
      public static void main(String args) {

      CacheConfig config = new CacheConfig();
      config.setEvictionPolicy(new DefaultEvictionPolicy());

      Cache cache = new LruCache(config);

      cache.set("key1", "10");
      cache.set("key2", "12");
      cache.get("key1");
      cache.startEvictor(5);
      }
      }









      share|improve this question









      New contributor




      Amit Kumar is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.







      $endgroup$




      I am trying to come up with design for different types of cache with different eviction policies but I am facing difficulty linking the eviction policy with cache. Mainly what to pass in evict() method so that it can be generic for different cache implementations like LRU, LFU etc.



      It will really helpful if this can be reviewed and I get some pointers on how to do it.



      Here's what I have worked upon till now:



      Cache.java



      public interface Cache {

      String get(String key);

      boolean set(String key, String value);

      void evict();

      EvictionPolicy getEvictionPolicy();

      void startEvictor(long delay);
      }


      EvictionPolicy



      public interface EvictionPolicy {
      //Scheduled execution of this method examines the cache key
      //if it can be evicted return true else false
      boolean evict();
      }


      CacheConfig.java



      public class CacheConfig {

      private EvictionPolicy evictionPolicy;

      public EvictionPolicy getEvictionPolicy() {
      return evictionPolicy;
      }

      public void setEvictionPolicy(EvictionPolicy evictionPolicy) {
      this.evictionPolicy = evictionPolicy;
      }
      }


      BaseCache.java



      import java.util.concurrent.ScheduledThreadPoolExecutor;
      import java.util.concurrent.ThreadFactory;
      import java.util.concurrent.TimeUnit;

      public class BaseCache implements Cache{

      private volatile EvictionPolicy evictionPolicy;

      private Evictor evictor = null;

      public BaseCache(CacheConfig config) {
      setConfig(config);
      }

      public void setConfig(CacheConfig config){
      setEvictionPolicy(config.getEvictionPolicy());
      }

      public void setEvictionPolicy(final EvictionPolicy evictionPolicy) {
      this.evictionPolicy = evictionPolicy;
      }

      @Override
      public void evict() {
      EvictionPolicy evictionPolicy = getEvictionPolicy();
      evictionPolicy.evict();
      }

      @Override
      public EvictionPolicy getEvictionPolicy() {
      return evictionPolicy;
      }

      @Override
      public String get(String key) {
      return null;
      }

      @Override
      public boolean set(String key, String value) {
      return false;
      }

      public void startEvictor(final long delay) {
      if (delay > 0) {
      evictor = new Evictor();
      ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1, new EvictorThreadFactory());
      executor.scheduleWithFixedDelay(evictor, delay, delay, TimeUnit.MILLISECONDS);
      }
      }

      class Evictor implements Runnable {

      @Override
      public void run() {
      try {
      evict();
      } catch(final Exception e) {
      System.out.println("Swallow exception!!");
      }
      }
      }

      private static class EvictorThreadFactory implements ThreadFactory {

      @Override
      public Thread newThread(final Runnable runnable) {
      return new Thread(null, runnable, "evictor-thread");
      }
      }
      }


      DefaultEvictionPolicy



       public class DefaultEvictionPolicy implements EvictionPolicy {

      @Override
      public boolean evict() {
      return true;
      }
      }


      LruCache



      public class LruCache extends BaseCache {

      private Map<String, String> cachedObjects = new ConcurrentHashMap<>();

      public LruCache(CacheConfig config) {
      super(config);
      setConfig(config);
      }

      public void setConfig(CacheConfig config){
      super.setConfig(config);
      setEvictionPolicy(config.getEvictionPolicy());
      }

      @Override
      public void evict() {
      EvictionPolicy evictionPolicy = getEvictionPolicy();
      evictionPolicy.evict();
      }


      @Override
      public String get(String key) {
      return null;
      }

      @Override
      public boolean set(String key, String value) {
      return false;
      }
      }


      Main.java



      public class Main {
      public static void main(String args) {

      CacheConfig config = new CacheConfig();
      config.setEvictionPolicy(new DefaultEvictionPolicy());

      Cache cache = new LruCache(config);

      cache.set("key1", "10");
      cache.set("key2", "12");
      cache.get("key1");
      cache.startEvictor(5);
      }
      }






      java object-oriented design-patterns cache






      share|improve this question









      New contributor




      Amit Kumar is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question









      New contributor




      Amit Kumar is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question








      edited 8 mins ago







      Amit Kumar













      New contributor




      Amit Kumar is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 15 mins ago









      Amit KumarAmit Kumar

      11




      11




      New contributor




      Amit Kumar is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      Amit Kumar is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      Amit Kumar is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






















          0






          active

          oldest

          votes











          Your Answer





          StackExchange.ifUsing("editor", function () {
          return StackExchange.using("mathjaxEditing", function () {
          StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
          StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
          });
          });
          }, "mathjax-editing");

          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "196"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });






          Amit Kumar is a new contributor. Be nice, and check out our Code of Conduct.










          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f214003%2fcache-design-with-eviction-policies%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          Amit Kumar is a new contributor. Be nice, and check out our Code of Conduct.










          draft saved

          draft discarded


















          Amit Kumar is a new contributor. Be nice, and check out our Code of Conduct.













          Amit Kumar is a new contributor. Be nice, and check out our Code of Conduct.












          Amit Kumar is a new contributor. Be nice, and check out our Code of Conduct.
















          Thanks for contributing an answer to Code Review Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f214003%2fcache-design-with-eviction-policies%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Costa Masnaga

          Fotorealismo

          Sidney Franklin