//package com.project.shiro.util.redis;
//
//import cn.wisenergy.service.common.utils.ByteUtil;
//import cn.wisenergy.service.common.utils.redis.RedisClient;
//import cn.wisenergy.service.common.utils.redis.RedisConsts;
//import org.apache.shiro.cache.Cache;
//import org.apache.shiro.cache.CacheException;
//import org.apache.shiro.util.CollectionUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import javax.annotation.Resource;
//import java.io.IOException;
//import java.util.*;
//
//public class ShiroRedisCache<K, V> implements Cache<K, V> {
//
//    //初始化Log日志
//    private Logger logger = LoggerFactory.getLogger(this.getClass());
//
//    //注入redisClient实例
//    @Resource(name = "redisClient")
//    private RedisClient redisClient;
//
//    //shiroSession的key值前缀
//    private String keyPrefix;
//
//    //通过redisClient实例和prefix参数构造redisCache
//    public ShiroRedisCache(RedisClient redisClient, String prefix) {
//        if (redisClient == null) {
//            throw new IllegalArgumentException("shiroRedisCahe初始化时，redisClient参数不能为空");
//        }
//        this.redisClient = redisClient;
//        this.keyPrefix = prefix;
//    }
//
//    /**
//     * 获得String类型的KEY
//     *
//     * @param key
//     * @return
//     */
//    private String getPreStringKey(K key) {
//        String preKey = null;
//        if (key instanceof String) {
//            preKey = this.keyPrefix + key;
//            return preKey;
//        } else {
//            try {
//                preKey = keyPrefix + ByteUtil.bytesToHexString(ByteUtil.objectToBytes(key));
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//            return preKey;
//        }
//    }
//
//    @Override
//    public V get(K key) throws CacheException {
//        logger.debug("根据key从Redis中获取对象 key [" + key + "]");
//        try {
//            if (key == null) {
//                return null;
//            } else {
//                V Vvalue = (V) redisClient.get(getPreStringKey(key));
//                if (Vvalue == null) {
//                    return null;
//                }
//                return Vvalue;
//            }
//        } catch (Throwable t) {
//            throw new CacheException(t);
//        }
//
//    }
//
//    @Override
//    public V put(K key, V value) throws CacheException {
//        logger.debug("根据key从存储 key [" + key + "]");
//        try {
//            redisClient.set(getPreStringKey(key), value);
//            redisClient.setAndExpire(getPreStringKey(key), value, RedisConsts.ADMIN_SHIRO_REALM_EXPIRE);
//            return value;
//        } catch (Throwable t) {
//            throw new CacheException(t);
//        }
//    }
//
//    @Override
//    public V remove(K key) throws CacheException {
//        logger.debug("从redis中删除 key [" + key + "]");
//        try {
//            V previous = get(key);
//            redisClient.del(getPreStringKey(key));
//            return previous;
//        } catch (Throwable t) {
//            throw new CacheException(t);
//        }
//    }
//
//    @Override
//    public void clear() throws CacheException {
//        logger.debug("从redis中删除所有元素");
//        try {
////            redisClient.flushDB();
//        } catch (Throwable t) {
//            throw new CacheException(t);
//        }
//    }
//
//    @Override
//    public int size() {
////		try {
////			Long longSize = new Long(redisClient.dbSize());
////            return longSize.intValue();
////        } catch (Throwable t) {
////            throw new CacheException(t);
////        }
//        return 0;
//    }
//
//    @SuppressWarnings("unchecked")
//    @Override
//    public Set<K> keys() {
//        try {
//            Set<byte[]> keys = redisClient.keys(ByteUtil.objectToBytes(this.keyPrefix + "*"));
//            if (CollectionUtils.isEmpty(keys)) {
//                return Collections.emptySet();
//            } else {
//                Set<K> newKeys = new HashSet<K>();
//                for (byte[] key : keys) {
//                    newKeys.add((K) key);
//                }
//                return newKeys;
//            }
//        } catch (Throwable t) {
//            throw new CacheException(t);
//        }
//    }
//
//    @Override
//    public Collection<V> values() {
//        try {
//            Set<byte[]> keys = redisClient.keys(ByteUtil.objectToBytes(this.keyPrefix + "*"));
//            if (!CollectionUtils.isEmpty(keys)) {
//                List<V> values = new ArrayList<V>(keys.size());
//                for (byte[] key : keys) {
//                    @SuppressWarnings("unchecked")
//                    V value = get((K) key);
//                    if (value != null) {
//                        values.add(value);
//                    }
//                }
//                return Collections.unmodifiableList(values);
//            } else {
//                return Collections.emptyList();
//            }
//        } catch (Throwable t) {
//            throw new CacheException(t);
//        }
//    }
//
//    public String getKeyPrefix() {
//        return keyPrefix;
//    }
//
//    public void setKeyPrefix(String keyPrefix) {
//        this.keyPrefix = keyPrefix;
//    }
//
//    public RedisClient getRedisClient() {
//        return redisClient;
//    }
//
//    public void setRedisClient(RedisClient redisClient) {
//        this.redisClient = redisClient;
//    }
//}
