Today we will look at a very simple way to create a cache that can store different values for same key, for different HTTP requests.
Recently I was working on RESTFul web services using Spring MVC. I was faced with a situation where I was querying the database multiple times for same data. I thought it would be good if I could cache this data and avoid DB calls. Since the data had to be different for each request, I started hunting for a method to create request level cache.
One way is to use ThreadLocal object for storing the cache map, since ThreadLocal stores separate object for each thread, we will have a separate cache map for each request.
However, Spring provides an even simpler way to achieve this, by using Request scoped bean.
Below is the code for the cache class.
Recently I was working on RESTFul web services using Spring MVC. I was faced with a situation where I was querying the database multiple times for same data. I thought it would be good if I could cache this data and avoid DB calls. Since the data had to be different for each request, I started hunting for a method to create request level cache.
One way is to use ThreadLocal object for storing the cache map, since ThreadLocal stores separate object for each thread, we will have a separate cache map for each request.
However, Spring provides an even simpler way to achieve this, by using Request scoped bean.
Below is the code for the cache class.
@Component @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "request") public class RequestDataCache { private final Map<String, Object> cache = new HashMap<>(); public Object get(String key) { return cache.containsKey(key) ? cache.get(key) : null; } public void put(String key, Object value) { cache.put(key, value); } }
For use in any class, just inject this bean and use the put() and get() methods to store and retrieve values.
@Inject
private RequestDataCache requestDataCache;
0 comments:
Post a Comment