package com.yonge.cooleshow.common.cache;

import java.util.Set;

public interface Cache<K, V> {

	/**
	 * 获得缓存值
	 * 
	 * @param key
	 *            缓存key
	 * @return 缓存值
	 */
	Object get(K key) throws CacheException;

	/**
	 * 设置缓存
	 * 
	 * @param key
	 *            缓存key
	 * @param value
	 *            缓存值
	 */
	void put(K key, V value) throws CacheException;

	/**
	 * 设置缓存
	 * 
	 * @param key
	 *            缓存key
	 * @param value
	 *            缓存值
	 * @param expireTimes
	 * 		过期时间（单位：秒）
	 */
	void put(K key, V value, int expireTimes) throws CacheException;

	/**
	 * 删除缓存
	 * 
	 * @param key
	 */
	void delete(K key) throws CacheException;

	/**
	 * 判断key是否已经存在
	 * @param key
	 * @return
	 */
	public boolean exists(K key);

	/**
	 * 获得所有的key
	 * 
	 * @return key集合
	 */
	Set<K> keys() throws CacheException;

	/**
	 * 获得缓存的key-value个数
	 * 
	 * @return key-value个数
	 */
	long size() throws CacheException;

	/**
	 * 重置某一个对应key的cache过期时间
	 * @param key
	 * @param expireTimes
	 */
	void expire(K key, int expireTimes);

	/**
	 * 获取分布式锁
	 * @param key 业务唯一标识
	 * @param threadId 线程编号
	 * @param seconds 锁的有效期
	 * @return
	 */
	boolean getLocked(K key, V threadId, int seconds);

	/**
	 * 释放分布式锁
	 * @param key
	 * @param threadId
	 * @return
	 */
	boolean releaseLocked(K key, V threadId);
}
