Cache design with eviction policies
$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);
}
}
java object-oriented design-patterns cache
New contributor
$endgroup$
add a comment |
$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);
}
}
java object-oriented design-patterns cache
New contributor
$endgroup$
add a comment |
$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);
}
}
java object-oriented design-patterns cache
New contributor
$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
java object-oriented design-patterns cache
New contributor
New contributor
edited 8 mins ago
Amit Kumar
New contributor
asked 15 mins ago
Amit KumarAmit Kumar
11
11
New contributor
New contributor
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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.
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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