package util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;

/**
 * 单节点Jedis.
 * @author Administrator
 *
 */
public class RedisUtilNew {
	protected static Logger logger = LoggerFactory.getLogger(RedisUtilNew.class);
	private static RedisUtilNew redisUtil = new RedisUtilNew();
	private JedisPool pool;

	//
	// private ResourceBundle resourceBundle;

	private RedisUtilNew() {
		ResourceBundle resourceBundle = ResourceBundle.getBundle("redis");
		pool = new JedisPool(resourceBundle.getString("redis.surl.host"),
				Integer.valueOf(resourceBundle.getString("redis.surl.port")));
	}

	public static RedisUtilNew getInstance() {
		return redisUtil;
	}
	
	public Map<String, String> hgetAll(String key) {
		Map<String, String> result = new HashMap<String, String>();
		
		Jedis jedis = pool.getResource();
		result = jedis.hgetAll(key);
		pool.returnResource(jedis);
		
		return result;
	}

	public void hsetAll(String key, Map<String, String> map) {
		Jedis jedis = pool.getResource();
		jedis.hmset(key, map);
		pool.returnResource(jedis);
	}
	
	public void delete(String key) {
		Jedis jedis = pool.getResource();
		jedis.del(key);
		pool.returnResource(jedis);
	}

	/**
	 * 取值
	 *
	 * @param key
	 * @return
	 */
	public String get(String key) {
		Jedis jedis = pool.getResource();
		try {
			String result = jedis.get(key);
			if (result == null) {
				return null;
			}
			return result;
		} finally {
			pool.returnResource(jedis);
		}
	}

	/**
	 * 向redis中写入数据
	 * @param key
	 * @param value
	 */
	public void set(String key,String value)
	{
		Jedis jedis = pool.getResource();
		jedis.set(key,value);
		pool.returnResource(jedis);
	}

	public Long getExpireTime(String key)
	{
		Jedis jedis = pool.getResource();
		Long m = jedis.ttl(key);
        pool.returnResource(jedis);
		return m;
	}


	/**
	 * 加锁.
	 *
	 * @param key
	 * @param expireTime
	 *            超时时间单位秒.
	 * @return 锁定的value,返回null值加锁失败,供释放锁时使用.
	 */
	public String tryLock(String key, int expireTime) {
		Jedis jedis = pool.getResource();
		try {
			String value = Long.toString(System.currentTimeMillis() + (expireTime * 1000));
			String result = jedis.set(key, value, "NX", "EX", expireTime);
			if (result == null) {
				return null;
			}
			return value;
		} finally {
			pool.returnResource(jedis);
		}
	}

	public String expireValue(String key, String value, int expireTime)
	{
		Jedis jedis = pool.getResource();
		try {
			String result = jedis.set(key, value, "NX", "EX", expireTime);
			if (result == null) {
				return null;
			}
			return value;
		} finally {
			pool.returnResource(jedis);
		}
	}

	public void releaseLock(String key) {
		Jedis jedis = pool.getResource();
		try {
			Set<String> set = jedis.keys(key);
			String[] kk = new String[set.size()];
			jedis.del(set.toArray(kk));
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			pool.returnResource(jedis);
		}
	}
	

	public static void main(String[] args) {

		RedisUtilNew redisUtilNew = RedisUtilNew.getInstance();

		//redisUtilNew.expireValue("test005","12",1000);

		Long outtime = redisUtilNew.getExpireTime("test005");

		redisUtilNew.delete("test005");

		redisUtilNew.expireValue("test005","12",outtime.intValue());



		System.out.println(outtime);
	}

}