CacheService.java 4.95 KB
package com.yoho.search.cache;

import java.io.NotSerializableException;
import java.io.Serializable;
import java.util.Map;

import javax.annotation.PostConstruct;

import org.springframework.stereotype.Service;

import com.yoho.search.cache.impl.EhCacheImpl;
import com.yoho.search.exception.CacheException;
import com.yoho.search.utils.TimeUtils;

/**
 * 功能描述:Cache类
 */
@Service
public class CacheService {

    public CacheInterface cacheInterface;
    
    /**
     * 初始化缓存服务
     */
    @PostConstruct
    public void init() {
	    cacheInterface = EhCacheImpl.getInstance();
    }
    
    /**
     * 新增一个元素,该元素不存在
     * @param expiration 表达式: 10s, 3mn, 8h
     */
    public void add(String key, Object value, String expiration) {
        checkSerializable(value);
        cacheInterface.add(key, value, TimeUtils.parseDuration(expiration));
    }

    /**
     * 同步新增一个元素
     * @param expiration 表达式: 10s, 3mn, 8h
     */
    public boolean safeAdd(String key, Object value, String expiration) {
        checkSerializable(value);
        return cacheInterface.safeAdd(key, value, TimeUtils.parseDuration(expiration));
    }

    /**
     * 新增一个元素,不设置缓存时间
     */
    public void add(String key, Object value) {
        checkSerializable(value);
        cacheInterface.add(key, value, TimeUtils.parseDuration(null));
    }

    /**
     * 设置一个元素
     * @param expiration 表达式: 10s, 3mn, 8h
     */
    public void set(String key, Object value, String expiration) {
        checkSerializable(value);
        cacheInterface.set(key, value, TimeUtils.parseDuration(expiration));
    }

    /**
     * 同步设置一个元素
     * @param expiration 表达式: 10s, 3mn, 8h
     */
    public boolean safeSet(String key, Object value, String expiration) {
        checkSerializable(value);
        return cacheInterface.safeSet(key, value, TimeUtils.parseDuration(expiration));
    }

    /**
     * 设置一个元素,不设置缓存时间
     */
    public void set(String key, Object value) {
        checkSerializable(value);
        cacheInterface.set(key, value, TimeUtils.parseDuration(null));
    }

    /**
     * 替换一个已经存在的元素
     * @param expiration 表达式: 10s, 3mn, 8h
     */
    public void replace(String key, Object value, String expiration) {
        checkSerializable(value);
        cacheInterface.replace(key, value, TimeUtils.parseDuration(expiration));
    }

    /**
     * 同步替换一个已经存在的元素
     * @param expiration 表达式: 10s, 3mn, 8h
     */
    public boolean safeReplace(String key, Object value, String expiration) {
        checkSerializable(value);
        return cacheInterface.safeReplace(key, value, TimeUtils.parseDuration(expiration));
    }

    /**
     * 替换一个已经存在的元素,不限时
     * @param key Element key
     * @param value Element value
     */
    public void replace(String key, Object value) {
        checkSerializable(value);
        cacheInterface.replace(key, value, TimeUtils.parseDuration(null));
    }

    /**
     * 元素自增长
     * @param by 增长幅值,必须数字
     */
    public long incr(String key, int by) {
        return cacheInterface.incr(key, by);
    }

    /**
     * 元素自增,按1递增
     */
    public long incr(String key) {
        return cacheInterface.incr(key, 1);
    }

    /**
     * 元素自减
     * @param by 自减幅值,必须数字
     */
    public long decr(String key, int by) {
        return cacheInterface.decr(key, by);
    }

    /**
     * 元素自减,按1递减
     */
    public long decr(String key) {
        return cacheInterface.decr(key, 1);
    }

    public Object get(String key) {
        return cacheInterface.get(key);
    }

    /**
     * Bulk retrieve.
     * @param key List of keys
     * @return Map of keys & values
     */
    public Map<String, Object> get(String... key) {
        return cacheInterface.get(key);
    }

    /**
     * 删除元素
     */
    public void delete(String key) {
        cacheInterface.delete(key);
    }

    /**
     * 同步删除元素
     */
	public boolean safeDelete(String key) {
        return cacheInterface.safeDelete(key);
    }

    /**
     * 清空缓存
     */
    public void clear() {
        cacheInterface.clear();
    }

    /**
     * 提供一个类型控制的get方法
     */
    @SuppressWarnings("unchecked")
	public <T> T get(String key, Class<T> clazz) {
        return (T) cacheInterface.get(key);
    }
   
    /**
     * 关掉缓存服务
     */
    public void stop() {
		cacheInterface.stop();
    }
    
    /**
     * 检查对象是否可序列化
     */
    void checkSerializable(Object value) {
        if(value != null && !(value instanceof Serializable)) {
            throw new CacheException("该类对象不可序列化 " + value.getClass().getName(), new NotSerializableException(value.getClass().getName()));
        }
    }
}