package com.appgree.core.redis.provider; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import java.util.logging.Logger; import redis.clients.jedis.SortingParams; import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; import com.appgree.core.redis.domain.CacheKey; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; /** * The high level Redis cache manager This class parameterized cached elements using an external provider. */ public class RedisCachedProvider implements RedisProvider { // the logger object /** The logger. */ private static Logger logger = Logger.getLogger(RedisCachedProvider.class.getName()); /** * This class wrapps the low level cache object. */ private class CacheWrapper { // the internal cache /** The internal cache. */ private Cache<String, RedisValue<?>> internalCache; /** * The main constructor. * * @param cache The internal cache */ public CacheWrapper(Cache<String, RedisValue<?>> cache) { this.internalCache = cache; } /** * The getter. * * @param key The cache key object * @param keyValue The element key * @param loader The element loader * @return Returns the wrapped return value */ public RedisValue<?> get(CacheKey key, String keyValue, Callable<RedisValue<?>> loader) { try { // checks cacheable status if (key.canCacheReads() == false) { // the element is not cacheable. We have to skip the cache layer return loader.call(); } // checks TTL boolean forceRefresh = checkTTL(key, keyValue); // checks if we have to refresh the object in the cache if (forceRefresh || key.isForceRefresh()) { internalCache.invalidate(keyValue); } // proceed with the standard caching procedure return internalCache.get(keyValue, loader); } catch (Exception e) { throw new RuntimeException(e); } } /** * Checks TTL based expiration. * * @param key the key * @param keyValue the key value * @return True if TTL was reached */ private boolean checkTTL(CacheKey key, String keyValue) { long ttl = key.getCacheTtl(); if (ttl == 0) { return false; } // retrieves the cached value RedisValue<?> value = (RedisValue<?>) internalCache.getIfPresent(keyValue); if (value == null || value.getTtlReference() == 0) { return false; } // checks time expiration return (System.currentTimeMillis() - value.getTtlReference()) > key.getCacheTtl(); } } // the cache entity /** The cache wrapper. */ private CacheWrapper cacheWrapper; // the provider /** The provider. */ private RedisProvider provider; // Private constructor prevents instantiation from other classes /** * Instantiates a new REDIS cached provider. * * @param provider the provider * @param timeout the timeout * @param maxElements the max elements */ public RedisCachedProvider(RedisProvider provider, long timeout, long maxElements) { this.provider = provider; Cache<String, RedisValue<?>> newCache = CacheBuilder.newBuilder().maximumSize(maxElements).expireAfterWrite(timeout, TimeUnit.MILLISECONDS) .build(); cacheWrapper = new CacheWrapper(newCache); } /** * Generates a string concat. * * @param methodId The method id * @param fields The method keys * @return The concat */ private static String concat(String methodId, String... fields) { StringBuilder builder = new StringBuilder(); builder.append(methodId); for (String item : fields) { builder.append("["); builder.append(item == null ? "nil" : item); } if (DEBUG_REDIS_CACHE) { logger.info("CACHE : " + builder.toString()); } return builder.toString(); } /** * Flush local cache. */ public void flushLocalCache() { this.cacheWrapper.internalCache.invalidateAll(); } /** * ------------------------------------------------------------------ Redis implementation * ------------------------------------------------------------------. * * @param cacheKey the cache key * @param key the key * @param value the value * @return the redis value */ @Override public RedisValue<String> set(final CacheKey cacheKey, final String key, final String value) { return provider.set(cacheKey, key, value); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#get(dw.cache.provider.CacheKey, java.lang.String) */ @SuppressWarnings("unchecked") @Override public RedisValue<String> get(final CacheKey cacheKey, final String key) { final String localKey = concat("get", key); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.get(cacheKey, key); } }); return (RedisValue<String>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#getSet(dw.cache.provider.CacheKey, java.lang.String, java.lang.String) */ @SuppressWarnings("unchecked") @Override public RedisValue<String> getSet(final CacheKey cacheKey, final String key, final String value) { final String localKey = concat("getSet", key); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.getSet(cacheKey, key, value); } }); return (RedisValue<String>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#hset(dw.cache.provider.CacheKey, java.lang.String, java.lang.String, java.lang.String) */ @Override public RedisValue<Long> hset(final CacheKey cacheKey, final String key, final String field, final String value) { return provider.hset(cacheKey, key, field, value); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#hdel(dw.cache.provider.CacheKey, java.lang.String, java.lang.String) */ @Override public RedisValue<Long> hdel(final CacheKey cacheKey, final String key, final String field) { return provider.hdel(cacheKey, key, field); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#hmset(dw.cache.provider.CacheKey, java.lang.String, java.util.Map) */ @Override public RedisValue<String> hmset(final CacheKey cacheKey, final String key, final Map<String, String> hash) { return provider.hmset(cacheKey, key, hash); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#hget(dw.cache.provider.CacheKey, java.lang.String, java.lang.String) */ @SuppressWarnings("unchecked") @Override public RedisValue<String> hget(final CacheKey cacheKey, final String key, final String field) { final String localKey = concat("hget", key, field); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.hget(cacheKey, key, field); } }); return (RedisValue<String>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#hmget(dw.cache.provider.CacheKey, java.lang.String, java.lang.String[]) */ @SuppressWarnings("unchecked") @Override public RedisValue<List<String>> hmget(final CacheKey cacheKey, final String key, final String... fields) { String[] field = new String[fields.length + 1]; field[0] = key; for (int i = 0; i < fields.length; i++) { field[i + 1] = fields[i]; } final String localKey = concat("hmget", field); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.hmget(cacheKey, key, fields); } }); return (RedisValue<List<String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#hgetAll(dw.cache.provider.CacheKey, java.lang.String) */ @SuppressWarnings("unchecked") @Override public RedisValue<Map<String, String>> hgetAll(final CacheKey cacheKey, final String key) { final String localKey = concat("hgetAll", key); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.hgetAll(cacheKey, key); } }); return (RedisValue<Map<String, String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#hexists(dw.cache.provider.CacheKey, java.lang.String, java.lang.String) */ @SuppressWarnings("unchecked") @Override public RedisValue<Boolean> hexists(final CacheKey cacheKey, final String key, final String field) { final String localKey = concat("hexists", key, field); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.hexists(cacheKey, key, field); } }); return (RedisValue<Boolean>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#hlen(dw.cache.provider.CacheKey, java.lang.String) */ @SuppressWarnings("unchecked") @Override public RedisValue<Long> hlen(final CacheKey cacheKey, final String key) { final String localKey = concat("hlen", key); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.hlen(cacheKey, key); } }); return (RedisValue<Long>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#hincrBy(dw.cache.provider.CacheKey, java.lang.String, java.lang.String, int) */ @Override public RedisValue<Long> hincrBy(final CacheKey cacheKey, final String key, final String field, final int value) { return provider.hincrBy(cacheKey, key, field, value); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#ping(dw.cache.provider.CacheKey) */ @SuppressWarnings("unchecked") @Override public RedisValue<String> ping(final CacheKey cacheKey) { final String localKey = concat("ping"); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.ping(cacheKey); } }); return (RedisValue<String>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#expire(dw.cache.provider.CacheKey, java.lang.String, int) */ @Override public RedisValue<Long> expire(final CacheKey cacheKey, final String key, final int seconds) { return provider.expire(cacheKey, key, seconds); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#del(dw.cache.provider.CacheKey, java.lang.String[]) */ @Override public RedisValue<Long> del(final CacheKey cacheKey, final String... keys) { return provider.del(cacheKey, keys); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#exists(dw.cache.provider.CacheKey, java.lang.String) */ @SuppressWarnings("unchecked") @Override public RedisValue<Boolean> exists(final CacheKey cacheKey, final String key) { final String localKey = concat("exists", key); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.exists(cacheKey, key); } }); return (RedisValue<Boolean>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#incr(dw.cache.provider.CacheKey, java.lang.String) */ @Override public RedisValue<Long> incr(final CacheKey cacheKey, final String key) { return provider.incr(cacheKey, key); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#decr(dw.cache.provider.CacheKey, java.lang.String) */ @Override public RedisValue<Long> decr(final CacheKey cacheKey, final String key) { return provider.decr(cacheKey, key); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#keys(dw.cache.provider.CacheKey, java.lang.String) */ @SuppressWarnings("unchecked") @Override @Deprecated public RedisValue<Set<String>> keys(final CacheKey cacheKey, final String pattern) { final String localKey = concat("keys", pattern); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.keys(cacheKey, pattern); } }); return (RedisValue<Set<String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zadd(dw.cache.provider.CacheKey, java.lang.String, double, java.lang.String) */ @Override public RedisValue<Long> zadd(final CacheKey cacheKey, final String key, final double score, final String member) { if (DEBUG_REDIS_CACHE) { concat("zadd", key, String.valueOf(score), member); } return provider.zadd(cacheKey, key, score, member); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zincrby(dw.cache.provider.CacheKey, java.lang.String, double, java.lang.String) */ @Override public RedisValue<Double> zincrby(final CacheKey cacheKey, final String key, final double score, final String member) { if (DEBUG_REDIS_CACHE) { concat("zincrBy", key, String.valueOf(score), member); } return provider.zincrby(cacheKey, key, score, member); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zscore(dw.cache.provider.CacheKey, java.lang.String, java.lang.String) */ @Override public RedisValue<Double> zscore(final CacheKey cacheKey, final String key, final String member) { if (DEBUG_REDIS_CACHE) { concat("zscore", key, member); } return provider.zscore(cacheKey, key, member); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zrank(dw.cache.provider.CacheKey, java.lang.String, java.lang.String) */ @Override public RedisValue<Long> zrank(final CacheKey cacheKey, final String key, final String member) { if (DEBUG_REDIS_CACHE) { concat("zrank", key, member); } return provider.zrank(cacheKey, key, member); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zcount(dw.cache.provider.CacheKey, java.lang.String, double, double) */ @Override public RedisValue<Long> zcount(final CacheKey cacheKey, final String key, final double min, final double max) { if (DEBUG_REDIS_CACHE) { concat("zrank", key, String.valueOf(min), String.valueOf(max)); } return provider.zcount(cacheKey, key, min, max); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zrevrank(dw.cache.provider.CacheKey, java.lang.String, java.lang.String) */ @Override public RedisValue<Long> zrevrank(final CacheKey cacheKey, final String key, final String member) { if (DEBUG_REDIS_CACHE) { concat("zrevrank", key, member); } return provider.zrevrank(cacheKey, key, member); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zrem(dw.cache.provider.CacheKey, java.lang.String, java.lang.String) */ @Override public RedisValue<Long> zrem(final CacheKey cacheKey, final String key, final String member) { if (DEBUG_REDIS_CACHE) { concat("zrem", key, member); } return provider.zrem(cacheKey, key, member); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zremrangeByRank(dw.cache.provider.CacheKey, java.lang.String, int, int) */ @Override public RedisValue<Long> zremrangeByRank(final CacheKey cacheKey, final String key, final int start, final int end) { if (DEBUG_REDIS_CACHE) { concat("zremrangeByRank", key, String.valueOf(start), String.valueOf(end)); } return provider.zremrangeByRank(cacheKey, key, start, end); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zcard(dw.cache.provider.CacheKey, java.lang.String) */ @SuppressWarnings("unchecked") @Override public RedisValue<Long> zcard(final CacheKey cacheKey, final String key) { final String localKey = concat("zcard", key); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.zcard(cacheKey, key); } }); return (RedisValue<Long>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zrevrange(dw.cache.provider.CacheKey, java.lang.String, int, int) */ @SuppressWarnings("unchecked") @Override public RedisValue<Set<String>> zrevrange(final CacheKey cacheKey, final String key, final int start, final int end) { final String localKey = concat("zrevrange", key, String.valueOf(start), String.valueOf(end)); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.zrevrange(cacheKey, key, start, end); } }); return (RedisValue<Set<String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zrevrangeByScore(dw.cache.provider.CacheKey, java.lang.String, double, double, int, int) */ @SuppressWarnings("unchecked") @Override public RedisValue<Set<String>> zrevrangeByScore(final CacheKey cacheKey, final String key, final double min, final double max, final int offset, final int count) { final String localKey = concat("zrevrangeByScore", key, String.valueOf(min), String.valueOf(max), String.valueOf(offset), String.valueOf(count)); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.zrevrangeByScore(cacheKey, key, min, max, offset, count); } }); return (RedisValue<Set<String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zrevrangeByScore(dw.cache.provider.CacheKey, java.lang.String, double, double) */ @SuppressWarnings("unchecked") @Override public RedisValue<Set<String>> zrevrangeByScore(final CacheKey cacheKey, final String key, final double min, final double max) { final String localKey = concat("zrevrangeByScore", key, String.valueOf(min), String.valueOf(max)); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.zrevrangeByScore(cacheKey, key, min, max); } }); return (RedisValue<Set<String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zrange(dw.cache.provider.CacheKey, java.lang.String, int, int) */ @SuppressWarnings("unchecked") @Override public RedisValue<Set<String>> zrange(final CacheKey cacheKey, final String key, final int start, final int end) { final String localKey = concat("zrange", key, String.valueOf(start), String.valueOf(end)); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.zrange(cacheKey, key, start, end); } }); return (RedisValue<Set<String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zrangeWithScores(dw.cache.provider.CacheKey, java.lang.String, int, int) */ @SuppressWarnings("unchecked") @Override public RedisValue<Set<Tuple>> zrangeWithScores(final CacheKey cacheKey, final String key, final int start, final int end) { final String localKey = concat("zrangewscores", key, String.valueOf(start), String.valueOf(end)); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.zrangeWithScores(cacheKey, key, start, end); } }); return (RedisValue<Set<Tuple>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zrangeByScore(dw.cache.provider.CacheKey, java.lang.String, double, double, int, int) */ @SuppressWarnings("unchecked") @Override public RedisValue<Set<String>> zrangeByScore(final CacheKey cacheKey, final String key, final double min, final double max, final int offset, final int count) { final String localKey = concat("zrangeByScore", key, String.valueOf(min), String.valueOf(max), String.valueOf(offset), String.valueOf(count)); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.zrangeByScore(cacheKey, key, min, max, offset, count); } }); return (RedisValue<Set<String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zrangeByScoreWithScores(dw.cache.provider.CacheKey, java.lang.String, double, double, int, int) */ @SuppressWarnings("unchecked") @Override public RedisValue<Set<Tuple>> zrangeByScoreWithScores(final CacheKey cacheKey, final String key, final double min, final double max, final int offset, final int count) { final String localKey = concat("zrangeByScorewscores", key, String.valueOf(min), String.valueOf(max), String.valueOf(offset), String.valueOf(count)); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.zrangeByScoreWithScores(cacheKey, key, min, max, offset, count); } }); return (RedisValue<Set<Tuple>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zrevrangeByScoreWithScores(dw.cache.provider.CacheKey, java.lang.String, double, double, int, int) */ @SuppressWarnings("unchecked") @Override public RedisValue<Set<Tuple>> zrevrangeByScoreWithScores(final CacheKey cacheKey, final String key, final double max, final double min, final int offset, final int count) { final String localKey = concat("zrevrangeByScorewscores", key, String.valueOf(max), String.valueOf(min), String.valueOf(offset), String.valueOf(count)); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.zrevrangeByScoreWithScores(cacheKey, key, max, min, offset, count); } }); return (RedisValue<Set<Tuple>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zinterstore(dw.cache.provider.CacheKey, java.lang.String, redis.clients.jedis.ZParams, * java.lang.String[]) */ @SuppressWarnings("unchecked") @Override public RedisValue<Long> zinterstore(final CacheKey cacheKey, final String dstkey, final ZParams params, final String... sets) { int len = params.getParams().size() + sets.length + 1; String[] actualParams = new String[len]; actualParams[0] = dstkey; int i = 1; for (byte[] p : params.getParams()) { try { actualParams[i++] = new String(p, "UTF-8"); } catch (Exception e) { throw new RuntimeException(e); } } for (String set : sets) { actualParams[i++] = set; } final String localKey = concat("zinterstore", actualParams); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.zinterstore(cacheKey, dstkey, params, sets); } }); return (RedisValue<Long>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#zrangeByScore(dw.cache.provider.CacheKey, java.lang.String, double, double) */ @SuppressWarnings("unchecked") @Override public RedisValue<Set<String>> zrangeByScore(final CacheKey cacheKey, final String key, final double min, final double max) { final String localKey = concat("zrangeByScore", key, String.valueOf(min), String.valueOf(max)); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.zrangeByScore(cacheKey, key, min, max); } }); return (RedisValue<Set<String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#mget(dw.cache.provider.CacheKey, java.lang.String[]) */ @SuppressWarnings("unchecked") @Override public RedisValue<List<String>> mget(final CacheKey cacheKey, final String... keys) { final String localKey = concat("mget", keys); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.mget(cacheKey, keys); } }); return (RedisValue<List<String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#rpush(dw.cache.provider.CacheKey, java.lang.String, java.lang.String[]) */ @Override public RedisValue<Long> rpush(final CacheKey cacheKey, final String key, final String... values) { if (DEBUG_REDIS_CACHE) { String[] valueList = new String[values.length + 1]; valueList[0] = key; for (int i = 0; i < values.length; i++) { valueList[i + 1] = values[i]; } concat("rpush", valueList); } return provider.rpush(cacheKey, key, values); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#rpoplpush(dw.cache.provider.CacheKey, java.lang.String, java.lang.String) */ @Override public RedisValue<String> rpoplpush(final CacheKey cacheKey, final String srckey, final String dstkey) { return provider.rpoplpush(cacheKey, srckey, dstkey); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#lpush(dw.cache.provider.CacheKey, java.lang.String, java.lang.String[]) */ @Override public RedisValue<Long> lpush(final CacheKey cacheKey, final String key, final String... values) { if (DEBUG_REDIS_CACHE) { String[] valueList = new String[values.length + 1]; valueList[0] = key; for (int i = 0; i < values.length; i++) { valueList[i + 1] = values[i]; } concat("lpush", valueList); } return provider.lpush(cacheKey, key, values); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#lpop(dw.cache.provider.CacheKey, java.lang.String) */ @Override public RedisValue<String> lpop(final CacheKey cacheKey, final String key) { if (cacheKey.canCacheReads() && !cacheKey.isForceRefresh()) { // there is no way to simulate a blocking operation nor caching or pipelining throw new UnsupportedOperationException(); } return provider.lpop(cacheKey, key); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#brpop(dw.cache.provider.CacheKey, int, java.lang.String) */ @Override public RedisValue<List<String>> brpop(final CacheKey cacheKey, final int secondsBlock, final String key) { if (cacheKey.canCacheReads() && !cacheKey.isForceRefresh()) { // there is no way to simulate a blocking operation nor caching or pipelining throw new UnsupportedOperationException(); } return provider.brpop(cacheKey, secondsBlock, key).flush(); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#blpop(dw.cache.provider.CacheKey, int, java.lang.String) */ @Override public RedisValue<List<String>> blpop(final CacheKey cacheKey, final int secondsBlock, final String key) { if (cacheKey.canCacheReads() && !cacheKey.isForceRefresh()) { // there is no way to simulate a blocking operation nor caching or pipelining throw new UnsupportedOperationException(); } return provider.blpop(cacheKey, secondsBlock, key).flush(); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#lset(dw.cache.provider.CacheKey, java.lang.String, int, java.lang.String) */ @Override public RedisValue<String> lset(final CacheKey cacheKey, final String key, final int index, final String value) { return provider.lset(cacheKey, key, index, value); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#lrange(dw.cache.provider.CacheKey, java.lang.String, int, int) */ @SuppressWarnings("unchecked") @Override public RedisValue<List<String>> lrange(final CacheKey cacheKey, final String key, final int start, final int end) { final String localKey = concat("lrange", key, String.valueOf(start), String.valueOf(end)); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.lrange(cacheKey, key, start, end); } }); return (RedisValue<List<String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#lindex(dw.cache.provider.CacheKey, java.lang.String, int) */ @SuppressWarnings("unchecked") @Override public RedisValue<String> lindex(final CacheKey cacheKey, final String key, final int index) { final String localKey = concat("lindex", key, String.valueOf(index)); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.lindex(cacheKey, key, index); } }); return (RedisValue<String>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#lrem(dw.cache.provider.CacheKey, java.lang.String, int, java.lang.String) */ @Override public RedisValue<Long> lrem(final CacheKey cacheKey, final String key, final int count, final String value) { return provider.lrem(cacheKey, key, count, value); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#ltrim(dw.cache.provider.CacheKey, java.lang.String, int, int) */ @Override public RedisValue<String> ltrim(final CacheKey cacheKey, String key, int start, int end) { return provider.ltrim(cacheKey, key, start, end); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#llen(dw.cache.provider.CacheKey, java.lang.String) */ @SuppressWarnings("unchecked") @Override public RedisValue<Long> llen(final CacheKey cacheKey, final String key) { final String localKey = concat("llen", key); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.llen(cacheKey, key); } }); return (RedisValue<Long>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#hkeys(dw.cache.provider.CacheKey, java.lang.String) */ @SuppressWarnings("unchecked") @Override public RedisValue<Set<String>> hkeys(final CacheKey cacheKey, final String key) { final String localKey = concat("hkeys", key); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.hkeys(cacheKey, key); } }); return (RedisValue<Set<String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#hvals(dw.cache.provider.CacheKey, java.lang.String) */ @SuppressWarnings("unchecked") @Override public RedisValue<List<String>> hvals(final CacheKey cacheKey, final String key) { final String localKey = concat("hvals", key); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.hvals(cacheKey, key); } }); return (RedisValue<List<String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#sadd(dw.cache.provider.CacheKey, java.lang.String, java.lang.String[]) */ @Override public RedisValue<Long> sadd(final CacheKey cacheKey, final String key, final String... members) { if (DEBUG_REDIS_CACHE) { String[] memberList = new String[members.length + 1]; memberList[0] = key; for (int i = 0; i < members.length; i++) { memberList[i + 1] = members[i]; } concat("sadd", memberList); } return provider.sadd(cacheKey, key, members); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#srem(dw.cache.provider.CacheKey, java.lang.String, java.lang.String[]) */ @Override public RedisValue<Long> srem(final CacheKey cacheKey, final String key, final String... members) { if (DEBUG_REDIS_CACHE) { String[] memberList = new String[members.length + 1]; memberList[0] = key; for (int i = 0; i < members.length; i++) { memberList[i + 1] = members[i]; } concat("srem", memberList); } return provider.srem(cacheKey, key, members); } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#sismember(dw.cache.provider.CacheKey, java.lang.String, java.lang.String) */ @SuppressWarnings("unchecked") @Override public RedisValue<Boolean> sismember(final CacheKey cacheKey, final String key, final String member) { final String localKey = concat("sismember", key, member); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.sismember(cacheKey, key, member); } }); return (RedisValue<Boolean>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#smembers(dw.cache.provider.CacheKey, java.lang.String) */ @SuppressWarnings("unchecked") @Override public RedisValue<Set<String>> smembers(final CacheKey cacheKey, final String key) { final String localKey = concat("smembers", key); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.smembers(cacheKey, key); } }); return (RedisValue<Set<String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#scard(dw.cache.provider.CacheKey, java.lang.String) */ @SuppressWarnings("unchecked") @Override public RedisValue<Long> scard(final CacheKey cacheKey, final String key) { final String localKey = concat("scard", key); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.scard(cacheKey, key); } }); return (RedisValue<Long>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#sinterstore(dw.cache.provider.CacheKey, java.lang.String, java.lang.String[]) */ @SuppressWarnings("unchecked") @Override public RedisValue<Long> sinterstore(final CacheKey cacheKey, final String dstkey, final String... sets) { String[] setList = new String[sets.length + 1]; setList[0] = dstkey; for (int i = 0; i < sets.length; i++) { setList[i + 1] = sets[i]; } final String localKey = concat("sinterstore", setList); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.sinterstore(cacheKey, dstkey, sets); } }); return (RedisValue<Long>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#sinter(dw.cache.provider.CacheKey, java.lang.String[]) */ @SuppressWarnings("unchecked") @Override public RedisValue<Set<String>> sinter(final CacheKey cacheKey, final String... sets) { final String localKey = concat("sinter", sets); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.sinter(cacheKey, sets); } }); return (RedisValue<Set<String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#sunionstore(dw.cache.provider.CacheKey, java.lang.String, java.lang.String[]) */ @SuppressWarnings("unchecked") @Override public RedisValue<Long> sunionstore(final CacheKey cacheKey, final String dstkey, final String... sets) { String[] setList = new String[sets.length + 1]; setList[0] = dstkey; for (int i = 0; i < sets.length; i++) { setList[i + 1] = sets[i]; } final String localKey = concat("sunionstore", setList); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.sunionstore(cacheKey, dstkey, sets); } }); return (RedisValue<Long>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#sunion(dw.cache.provider.CacheKey, java.lang.String[]) */ @SuppressWarnings("unchecked") @Override public RedisValue<Set<String>> sunion(final CacheKey cacheKey, final String... sets) { final String localKey = concat("sunion", sets); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.sunion(cacheKey, sets); } }); return (RedisValue<Set<String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#sort(dw.cache.provider.CacheKey, java.lang.String, redis.clients.jedis.SortingParams) */ @Override @SuppressWarnings("unchecked") public RedisValue<List<String>> sort(final CacheKey cacheKey, final String key, final SortingParams sortingParameters) { Collection<byte[]> params = sortingParameters.getParams(); String[] paramList = new String[params.size() + 1]; paramList[0] = key; int i = 1; for (byte[] p : params) { try { paramList[i++] = new String(p, "UTF-8"); } catch (Exception e) { throw new RuntimeException(e); } } final String localKey = concat("sort", paramList); RedisValue<?> res = cacheWrapper.get(cacheKey, localKey, new Callable<RedisValue<?>>() { @Override public RedisValue<?> call() throws Exception { return provider.sort(cacheKey, key, sortingParameters); } }); return (RedisValue<List<String>>) res; } /* * (non-Javadoc) * * @see dw.core.redis.provider.RedisProvider#evalsha(dw.cache.provider.CacheKey, java.lang.String, java.util.List, java.util.List) */ @Override public RedisValue<Object> evalsha(final CacheKey cacheKey, final String sha1, final List<String> keys, final List<String> args) { return provider.evalsha(cacheKey, sha1, keys, args); } }