package com.yuzhi.back.framework;

import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import javax.annotation.Resource;
import java.util.HashMap;

@Component
public class RedisManager {

    @Resource
    private JedisPool pool;

    /**
     * 通过key获取储存在redis中的value
     * 并释放连接
     * @param key
     * @return 成功返回value 失败返回null
     */
    public String get(String key) {
        Jedis jedis = null;
        String value = null;
        try {
            jedis = pool.getResource();
            value = jedis.get(key);
        } catch (Exception e) {
            pool.returnBrokenResource(jedis);
            e.printStackTrace();
        } finally {
            returnResource(pool, jedis);
        }
        return value;
    }

    /**
     * 向redis存入key和value,并释放连接资源
     * 如果key已经存在 则覆盖
     * @param key
     * @param value
     * @return 成功 返回OK 失败返回 0
     */
    public String set(String key, String value) {
        Jedis jedis = null;
        try {
            jedis = pool.getResource();
            return jedis.set(key, value);
        } catch (Exception e) {
            pool.returnBrokenResource(jedis);
            e.printStackTrace();
            return "0";
        } finally {
            returnResource(pool, jedis);
        }
    }

    /**
     * 删除指定的key,也可以传入一个包含key的数组
     * @param keys 一个key  也可以使 string 数组
     * @return 返回删除成功的个数
     */
    public Long del(String... keys) {
        Jedis jedis = null;
        try {
            jedis = pool.getResource();
            return jedis.del(keys);
        } catch (Exception e) {
            pool.returnBrokenResource(jedis);
            e.printStackTrace();
            return 0L;
        } finally {
            returnResource(pool, jedis);
        }
    }

    /**
     * 判断key是否存在
     * @param key
     * @return true OR false
     */
    public boolean exists(String key) {
        Jedis jedis = null;
        try {
            jedis = pool.getResource();
            return jedis.exists(key);
        } catch (Exception e) {
            pool.returnBrokenResource(jedis);
            e.printStackTrace();
            return false;
        } finally {
            returnResource(pool, jedis);
        }
    }


    /**
     * 返还到连接池
     *
     * @param pool
     * @param jedis
     */
    public static void returnResource(JedisPool pool, Jedis jedis) {
        if (jedis != null) {
            pool.returnResource(jedis);
        }
    }

    /**
     * get value from redis
     * @param key
     * @return
     */
    public byte[] get(byte[] key) {
        byte[] value = null;
        Jedis jedis = pool.getResource();
        try {
            value = jedis.get(key);
        } catch (Exception e) {
            pool.returnBrokenResource(jedis);
            e.printStackTrace();
        } finally {
            pool.returnResource(jedis);
        }
        return value;
    }

    /**
     * set
     * @param key
     * @param value
     * @return
     */
    public byte[] set(byte[] key, byte[] value) {
        Jedis jedis = pool.getResource();
        try {
            jedis.set(key, value);
        } catch (Exception e) {
            pool.returnBrokenResource(jedis);
            e.printStackTrace();
        } finally {
            pool.returnResource(jedis);
        }
        return value;
    }

    /**
     * set
     * @param key
     * @param value
     * @param expire
     * @return
     */
    public byte[] set(byte[] key, byte[] value, int expire) {
        Jedis jedis = pool.getResource();
        try {
            jedis.set(key, value);
            if (expire != 0) {
                jedis.expire(key, expire);
            }
        } catch (Exception e) {
            pool.returnBrokenResource(jedis);
            e.printStackTrace();
        } finally {
            pool.returnResource(jedis);
        }
        return value;
    }

    public void setHash(String key,HashMap<String,String> map,int expire){
        Jedis jedis = pool.getResource();
        try{
            jedis.hmset(key, map);
            if (expire != 0) {
                jedis.expire(key, expire);
            }
        } catch (Exception e) {
            pool.returnBrokenResource(jedis);
            e.printStackTrace();
        } finally{
            pool.returnResource(jedis);
        }
    }

    /**
     * del
     * @param key
     */
    public void del(byte[] key){
        Jedis jedis = pool.getResource();
        try{
            jedis.del(key);
        } catch (Exception e) {
            pool.returnBrokenResource(jedis);
            e.printStackTrace();
        } finally{
            pool.returnResource(jedis);
        }
    }

    /**
     * flush
     */
    public void flushDB() {
        Jedis jedis = pool.getResource();
        try {
            jedis.flushDB();
        } finally {
            pool.returnResource(jedis);
        }
    }

    /**
     * size
     */
    public Long dbSize() {
        Long dbSize = 0L;
        Jedis jedis = pool.getResource();
        try {
            dbSize = jedis.dbSize();
        } finally {
            pool.returnResource(jedis);
        }
        return dbSize;
    }

//    /**
//     * keys
//     *
//     * @param pattern
//     * @return
//     */
//    public Set<byte[]> keys(String pattern) {
//        Set<byte[]> keys = null;
//        Jedis jedis = pool.getResource();
//        try {
//            keys = jedis.keys(pattern.getBytes());
//        } finally {
//            pool.returnResource(jedis);
//        }
//        return keys;
//    }
    /*
    创建列表,并设置列表长度
     */
    public Long rpush(String key,String value){
        Long index=0L;
        Jedis jedis = pool.getResource();
        try {
            jedis.rpush(key,value);
        } finally {
            pool.returnResource(jedis);
        }
        return index;
    }
    /*
        设置列表(key)相应坐标(index)的value
    */
    public Long lset(String key,Long index,String value){
        Jedis jedis = pool.getResource();
        try {
            jedis.lset(key,index,value);
        } finally {
            pool.returnResource(jedis);
        }
        return index;
    }
    /*
        取指定列表指定坐标的value
     */
    public String lindex(String key,Long index){
        String value=null;
        Jedis jedis = pool.getResource();
        try {
            value =jedis.lindex(key,index);
        } finally {
            pool.returnResource(jedis);
        }
        return value;
    }
    /*
       返回指定列表的长度
    */
    public Long llen(String key){
        Long length=null;
        Jedis jedis = pool.getResource();
        try {
            length=jedis.llen(key);
        } finally {
            pool.returnResource(jedis);
        }
        return length;
    }
    /*
    删除列表
     */
    public  Long del(String key){
        Long length=null;
        Jedis jedis = pool.getResource();
        try {
            length=jedis.del(key);
        } finally {
            pool.returnResource(jedis);
        }
        return length;
    }


    public String hget(String key,String filed){
        String value=null;
        Jedis jedis = pool.getResource();
        try {
            value=jedis.hget(key,filed);
        } finally {
            pool.returnResource(jedis);
        }
        return value;
    }

    public Long hset(String key,String filed,String value){
        Long length=null;
        Jedis jedis = pool.getResource();
        try {
            length=jedis.hset(key, filed,value);
        } finally {
            pool.returnResource(jedis);
        }
        return length;
    }

}