package com.wechat.global.base.dao;

import java.util.Date;
import java.util.concurrent.TimeUnit;

import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;

/**
 * This is test for Git Stash
 * 
 * @author Administrator
 *
 */
@Repository
public class RedisTemplateDao<T> {

	@Autowired
	protected RedisTemplate<String, T> redisTemplate;

	public T select(String infoKey) {
		return redisTemplate.opsForValue().get(infoKey);
	}

	public void insert(String infoKey, T infoValue) {
		redisTemplate.opsForValue().set(infoKey, infoValue);
	}

	/**
	 * 
	 * @param infoKey
	 * @param infoValue
	 * @param expiry 过期时长（X秒后过期） 单位：秒
	 */
	public void insert(String infoKey, T infoValue, int expirySecond) {
		// 设置失效时间
		insertAndExptime(infoKey, infoValue, expirySecond, TimeUnit.SECONDS);
	}
	
	/**
	 * 
	 * @param infoKey
	 * @param infoValue
	 * @param expiry 过期时长  单位：小时
	 */
	public void insertHours(String infoKey, T infoValue, int expiryTime) {
		// 设置失效时间
		insertAndExptime(infoKey, infoValue, expiryTime, TimeUnit.HOURS);
	}
	
	/**
	 * 
	 * @param infoKey
	 * @param infoValue
	 * @param expiry 过期时长  单位：分钟
	 */
	public void insertMinutes(String infoKey, T infoValue, int expiryTime) {
		// 设置失效时间
		insertAndExptime(infoKey, infoValue, expiryTime, TimeUnit.MINUTES);
	}

	/**
	 * 
	 * @param infoKey
	 * @param infoValue
	 * @param expiry 过期时长 单位：天
	 */
	public void insertDays(String infoKey, T infoValue, int expiryDay) {
		// 设置失效时间
		insertAndExptime(infoKey, infoValue, expiryDay, TimeUnit.DAYS);
	}
	
	/**
	 * 
	 * @param infoKey
	 * @param infoValue
	 * @param expiry 过期时长 单位：毫秒
	 */
    public void insertExpMs(String infoKey, T infoValue, long expiryMilliseSecond) {
        redisTemplate.opsForValue().set(infoKey, infoValue);
        // 设置失效时间
        redisTemplate.expire(infoKey, expiryMilliseSecond, TimeUnit.MILLISECONDS);
    }
   
	/**
	 * 保存并设置过期时间
	 * @param infoKey
	 * @param infoValue
	 * @param expiry    过期时长 单位：毫秒
	 */
	private void insertAndExptime(String infoKey, T infoValue, int expiryNum, TimeUnit unit) {
		redisTemplate.opsForValue().set(infoKey, infoValue);
		// 设置失效时间
		redisTemplate.expire(infoKey, expiryNum, unit);
	}
   
	
	/**
	 * 
	 * @param infoKey
	 * @param infoValue
	 * @param expiryTime 具体的过期时间（到X时间就过期）
	 */
	public void insert(String infoKey, T infoValue, Date expiryTime) {
		redisTemplate.opsForValue().set(infoKey, infoValue);
		// 设置失效时间
		redisTemplate.expireAt(infoKey, expiryTime);
	}


	public void delete(String infoKey) {
		redisTemplate.delete(infoKey);
	}
	
   public Boolean hasKey(String infoKey) {
       return redisTemplate.hasKey(infoKey);
    }

}
