缓存Ehcache、Memcached、Redis的统一接口实现

xiaoxiao2021-02-28  112

接口

package com.enation.framework.cache; /** * 缓存接口 * */ public interface ICache<T> { /** * 初始化缓存对象 * @param cacheName 缓存对象名称 */ public void initCache(String cacheName); /** * Get an item from the cache, nontransactionally * @param key * @return the cached object or <tt>null</tt> * @throws CacheException */ public T get(Object key); /** * Add an item to the cache, nontransactionally, with * failfast semantics * @param key * @param value * @throws CacheException */ public void put(Object key, T value); /** * 往缓存中写入内容 * @param key * @param value * @param exp 超时时间,单位为秒 */ public void put(Object key, T value, int exp); /** * Remove an item from the cache */ public void remove(Object key); /** * Clear the cache */ public void clear(); }

1、Ehcache的实现

package com.enation.framework.cache; import java.io.Serializable; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import net.sf.ehcache.CacheException; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; /** * Ehcache缓存实现 */ @Component public class EhCacheImpl implements ICache { private net.sf.ehcache.Cache cache; /** * */ public EhCacheImpl() { } /** * 初始化缓存对象 * * @param name */ @Override public void initCache(String name) { try { CacheManager manager = CacheManager.getInstance(); cache = manager.getCache(name); if (cache == null) { manager.addCache(name); cache = manager.getCache(name); } } catch (net.sf.ehcache.CacheException e) { e.printStackTrace(); } } /** * Gets a value of an element which matches the given key. * * @param key * the key of the element to return. * @return The value placed into the cache with an earlier put, or null if * not found or expired * @throws CacheException */ public Object get(Object key) { Object obj = null; try { if (key != null) { Element element = cache.get((Serializable) key); if (element != null) { obj = element.getValue(); } } } catch (net.sf.ehcache.CacheException e) { e.printStackTrace(); } return obj; } /** * Puts an object into the cache. * * @param key * a {@link Serializable} key * @param value * a {@link Serializable} value * @throws CacheException * if the parameters are not {@link Serializable}, the * {@link CacheManager} is shutdown or another {@link Exception} * occurs. */ public void put(Object key, Object value) { try { Element element = new Element((Serializable) key, (Serializable) value); cache.put(element); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } } /** * Puts an object into the cache. * @param key * @param value * @param exp */ public void put(Object key, Object value, int exp) { try { Element element = new Element((Serializable) key, (Serializable) value); element.setTimeToLive(exp); cache.put(element); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } } /** * Removes the element which matches the key. * <p> * If no element matches, nothing is removed and no Exception is thrown. * * @param key * the key of the element to remove * @throws CacheException */ public void remove(Object key) { try { cache.remove((Serializable) key); } catch (ClassCastException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } } public static void main(String[] args) { EhCacheImpl cache = new EhCacheImpl(); cache.initCache("queryCache"); cache.put("test","fjdkafjsdkajd"); } @Override public void clear() { try { //cache.remove(arg0) cache.removeAll(); } catch (IllegalStateException e) { e.printStackTrace(); } } } 2、Memcached的实现

package com.enation.app.shop.cluster.cache.memcached; import java.io.IOException; import java.util.concurrent.TimeoutException; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import com.enation.framework.cache.ICache; import com.enation.framework.util.PropertiesUtil; import net.rubyeye.xmemcached.XMemcachedClient; import net.rubyeye.xmemcached.XMemcachedClientBuilder; import net.rubyeye.xmemcached.exception.MemcachedException; import net.rubyeye.xmemcached.utils.AddrUtil; /** * Memcached的缓存实现 */ @Component public class MemcachedImpl implements ICache { protected final Logger logger = Logger.getLogger(getClass()); private static XMemcachedClient memcachedClient; @Override public void initCache(String cacheName) { if (memcachedClient != null) return; try { PropertiesUtil properties = new PropertiesUtil("cluster.properties"); String memcachedServer = properties.getProperties("memcached_server"); if(StringUtils.isEmpty(memcachedServer)){ logger.error("can't get memcached server address"); return; } String[] memcachedServers = StringUtils.split(memcachedServer, ","); XMemcachedClientBuilder builder = new XMemcachedClientBuilder( AddrUtil.getAddresses(memcachedServers[0])); memcachedClient = (XMemcachedClient) builder.build(); if(memcachedServers.length > 1){ for(int i = 1; i < memcachedServers.length; i++){ try{ memcachedClient.addServer(memcachedServers[i].trim()); }catch(Exception ex){ logger.error("can't connect " + memcachedServers[i].trim(), ex); } } } } catch (IOException ex) { logger.error("can't conect memcached server", ex); } } @Override public Object get(Object key) { try { return memcachedClient.get(key.toString()); } catch (TimeoutException | InterruptedException | MemcachedException e) { logger.error("get cache from memcached error", e); } return null; } @Override public void put(Object key, Object value) { try { memcachedClient.set(key.toString(), 0, value); } catch (TimeoutException | InterruptedException | MemcachedException e) { logger.error("put value to memcached error", e); } } @Override public void put(Object key, Object value, int exp) { try { memcachedClient.set(key.toString(), exp, value); } catch (TimeoutException | InterruptedException | MemcachedException e) { logger.error("put value to memcached error", e); } } @Override public void remove(Object key) { try { memcachedClient.delete(key.toString()); } catch (TimeoutException | InterruptedException | MemcachedException e) { logger.error("remove cache from memcached error", e); } } @Override public void clear() { // TODO Auto-generated method stub } } 3、Redis的实现

package com.enation.app.shop.cluster.cache.redis; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.JedisShardInfo; import redis.clients.jedis.ShardedJedis; import redis.clients.jedis.ShardedJedisPool; import com.enation.app.base.core.model.Member; import com.enation.framework.cache.ICache; import com.enation.framework.util.PropertiesUtil; import com.enation.framework.util.SerializeUtil; /** * Redis的缓存实现类 * */ @Component public class RedisImpl implements ICache { protected final Logger logger = Logger.getLogger(getClass()); private static ShardedJedisPool pool; @Override public void initCache(String cacheName) { if (pool != null) return; PropertiesUtil properties = new PropertiesUtil("cluster.properties"); String redisServer = properties.getProperties("redis_server"); if(StringUtils.isEmpty(redisServer)){ logger.error("can't get redis server address"); return; } String[] redisServers = StringUtils.split(redisServer, ","); List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>(); for(int i = 0; i < redisServers.length; i++){ String[] hostPort = StringUtils.split(redisServers[i].trim(), ":"); String host = hostPort[0]; int port = 6379; if(hostPort.length == 2){ port = NumberUtils.toInt(hostPort[1], 6379); } try{ shards.add(new JedisShardInfo(host, port, "redis_" + i)); }catch(Exception ex){ logger.error("can't connect " + redisServers[i].trim(), ex); } } // 构造池 pool = new ShardedJedisPool(new JedisPoolConfig(), shards); } @Override public Object get(Object key) { ShardedJedis shardedJedis = null; try { shardedJedis = pool.getResource(); byte[] bytes = shardedJedis.get(key.toString().getBytes()); if (bytes == null || bytes.length == 0) return null; return SerializeUtil.unserialize(bytes); } catch (Exception ex) { logger.error("get cache from redis error", ex); } finally { if (shardedJedis != null) { pool.returnResource(shardedJedis); } } return null; } @Override public void put(Object key, Object value) { ShardedJedis shardedJedis = null; try { shardedJedis = pool.getResource(); shardedJedis.set(key.toString().getBytes(), SerializeUtil.serialize(value)); } catch (Exception ex) { logger.error("put cache to redis error", ex); } finally { if (shardedJedis != null) { pool.returnResource(shardedJedis); } } } @Override public void put(Object key, Object value, int exp) { ShardedJedis shardedJedis = null; try { shardedJedis = pool.getResource(); shardedJedis.setex(key.toString().getBytes(), exp, SerializeUtil.serialize(value)); } catch (Exception ex) { logger.error("put cache to redis error", ex); } finally { if (shardedJedis != null) { pool.returnResource(shardedJedis); } } } @Override public void remove(Object key) { ShardedJedis shardedJedis = null; try { shardedJedis = pool.getResource(); shardedJedis.del(key.toString().getBytes()); } catch (Exception ex) { logger.error("remove cache from redis error", ex); } finally { if (shardedJedis != null) { pool.returnResource(shardedJedis); } } } public static void main(String[] args) { JedisPool pool2 = new JedisPool(new JedisPoolConfig(), "localhost"); Jedis jedis = null; try { jedis = pool2.getResource(); Member m = new Member(); m.setUname("dawei"); jedis.set("user".getBytes(), SerializeUtil.serialize(m)); // String name = jedis.get("user"); // System.out.println(name); Member m1 = (Member) SerializeUtil.unserialize(jedis.get("user".getBytes())); System.out.println(m1.getUname()); } catch (Exception ex) { ex.printStackTrace(); } finally { if (jedis != null) { jedis.close(); } } } @Override public void clear() { // TODO Auto-generated method stub } }

转载请注明原文地址: https://www.6miu.com/read-48189.html

最新回复(0)