package com.matrix.component.redis; 
 | 
  
 | 
import com.google.gson.Gson; 
 | 
import com.google.gson.GsonBuilder; 
 | 
import com.matrix.core.tools.LogUtil; 
 | 
import com.matrix.core.tools.StringUtils; 
 | 
import net.sf.json.JSONArray; 
 | 
import net.sf.json.JSONNull; 
 | 
import net.sf.json.JSONObject; 
 | 
import org.springframework.beans.factory.annotation.Value; 
 | 
import org.springframework.boot.CommandLineRunner; 
 | 
import org.springframework.stereotype.Component; 
 | 
import redis.clients.jedis.Jedis; 
 | 
import redis.clients.jedis.JedisPool; 
 | 
import redis.clients.jedis.JedisPoolConfig; 
 | 
  
 | 
import java.util.*; 
 | 
  
 | 
import static org.springframework.util.Assert.notNull; 
 | 
  
 | 
/** 
 | 
 * redis连接 
 | 
 *  
 | 
 * @author jiangyouyao 
 | 
 * @email 512061637@qq.com 
 | 
 * @date 2019年2月25日 
 | 
 */ 
 | 
  
 | 
@Component 
 | 
public class RedisClient implements CommandLineRunner { 
 | 
  
 | 
    /** 
 | 
     * redis服务器地址 
 | 
     */ 
 | 
    @Value("${redis.hostname}") 
 | 
    private String hostname; 
 | 
  
 | 
    /** 
 | 
     * redis 访问端口 
 | 
     */ 
 | 
    @Value("${redis.port}") 
 | 
    private int port; 
 | 
  
 | 
    /** 
 | 
     * 默认失效时间 
 | 
     */ 
 | 
    @Value("${redis.timeout}") 
 | 
    private int timeOut; 
 | 
  
 | 
    @Value("${redis.password}") 
 | 
    private String password; 
 | 
  
 | 
    /** 
 | 
     * 非切片连接池 
 | 
     */ 
 | 
    private JedisPool jedisPool; 
 | 
  
 | 
    /** 
 | 
     * 数据库标号 
 | 
     */ 
 | 
    @Value("${redis.database}") 
 | 
    private int database; 
 | 
  
 | 
    private RedisClient() { 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 保存一个对象,待超时时间 
 | 
     *  
 | 
     * @author JIANGYOUYAO 
 | 
     * @email 935090232@qq.com 
 | 
     * @date 2018年1月19日 
 | 
     * @param key 
 | 
     * @param bean 
 | 
     * @param timeOut 
 | 
     */ 
 | 
    public void saveValue(String key, String value, int timeOut) { 
 | 
        if (StringUtils.isNotBlank(value)) { 
 | 
            Jedis jedis = getJedis(); 
 | 
            jedis.setex(key, timeOut, value); 
 | 
            jedis.close(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 保存一个string,无过期时间 
 | 
     *  
 | 
     * @author zhangh 
 | 
     * @date 2018年7月19日 
 | 
     * @param key 
 | 
     * @param value 
 | 
     * @param timeOut 
 | 
     */ 
 | 
    public void saveValueForever(String key, String value) { 
 | 
        if (StringUtils.isNotBlank(value)) { 
 | 
            Jedis jedis = getJedis(); 
 | 
            jedis.set(key, value); 
 | 
            jedis.close(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 删除一个对象 
 | 
     *  
 | 
     * @author JIANGYOUYAO 
 | 
     * @email 935090232@qq.com 
 | 
     * @date 2018年1月19日 
 | 
     * @param key 
 | 
     */ 
 | 
    public void removeObject(String key) { 
 | 
        Jedis jedis = getJedis(); 
 | 
        jedis.del(key); 
 | 
        jedis.close(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 根据key前缀批量删除缓存 
 | 
     * 
 | 
     * @author wanglizhu 
 | 
     * @email 935090232@qq.com 
 | 
     * @date 2019年8月6日 
 | 
     * @param key 
 | 
     */ 
 | 
    public void batchDel(String key) { 
 | 
        Jedis jedis = getJedis(); 
 | 
        Set<String> set = jedis.keys(key +"*"); 
 | 
        Iterator<String> it = set.iterator(); 
 | 
        while(it.hasNext()){ 
 | 
            String keyStr = it.next(); 
 | 
            System.out.println(keyStr); 
 | 
            jedis.del(keyStr); 
 | 
        } 
 | 
        jedis.close(); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 保存一个对象使用默认超时时间 
 | 
     *  
 | 
     * @author JIANGYOUYAO 
 | 
     * @email 935090232@qq.com 
 | 
     * @date 2018年1月19日 
 | 
     * @param key 
 | 
     * @param jsonObject 
 | 
     */ 
 | 
    public void saveValue(String key, Object jsonObject) { 
 | 
        if (jsonObject != null) { 
 | 
            Jedis jedis = getJedis(); 
 | 
            Gson g = new Gson(); 
 | 
            jedis.setex(key, timeOut, g.toJson(jsonObject)); 
 | 
            jedis.close(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 保存一个对象,不设置过期时间 
 | 
     *  
 | 
     * @author zhangh 
 | 
     * @date 2018年7月19日 
 | 
     * @param key 
 | 
     * @param jsonObject 
 | 
     */ 
 | 
    public void saveValueForever(String key, Object jsonObject) { 
 | 
        if (jsonObject != null) { 
 | 
            Jedis jedis = getJedis(); 
 | 
            Gson g = new Gson(); 
 | 
            jedis.set(key, g.toJson(jsonObject)); 
 | 
            jedis.close(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void saveMapValue(String key, Map jsonObject) { 
 | 
        if (jsonObject != null) { 
 | 
            Jedis jedis = getJedis(); 
 | 
            Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); 
 | 
            jedis.setex(key, timeOut, gson.toJson(jsonObject)); 
 | 
            jedis.close(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 
 | 
     * 此方法将ArrayList集合直接存储为一个字符串 
 | 
     * 
 | 
     * @param key 
 | 
     *            存储的名字 
 | 
     * @param list 
 | 
     *            要存储的集合对象 
 | 
     */ 
 | 
    public Boolean setArrayList(String key, List<Object> list) { 
 | 
        if (list != null && key != null && key != "") { 
 | 
            Jedis jedis = getJedis(); 
 | 
            jedis.set(key, JSONArray.fromObject(list).toString()); 
 | 
            jedis.close(); 
 | 
            return true; 
 | 
        } 
 | 
        return false; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 此方法将会把存在redis中的数据取出来,并封装成相应的Arraylist集合 
 | 
     * 
 | 
     * @param key 
 | 
     *            存储的名字 
 | 
     * @param beanClass 
 | 
     *            要封装成为的javaBean 
 | 
     * @return List 
 | 
     */ 
 | 
    public List<Object> getArraylist(String key, Class beanClass) { 
 | 
        List<Object> list = new ArrayList<Object>(); 
 | 
        if (StringUtils.isNotBlank(key) && beanClass != null) { 
 | 
                Jedis jedis = getJedis(); 
 | 
                JSONArray jsonArray = JSONArray.fromObject(jedis.get(key)); 
 | 
                if(!JSONNull.getInstance().equals(jsonArray.get(0))){ 
 | 
                    String o = jsonArray.get(0).toString(); 
 | 
                    JSONArray myJsonArray = JSONArray.fromObject(o); 
 | 
                    for(int i = 0; i < myJsonArray.size(); i++){ 
 | 
                        Object object = JSONObject.toBean( 
 | 
                                (JSONObject) myJsonArray.get(i), beanClass); 
 | 
                        list.add(object); 
 | 
                    } 
 | 
                } 
 | 
            jedis.close(); 
 | 
            } 
 | 
        return list; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 获取list 
 | 
     * @param key 
 | 
     * return :list<String> 
 | 
     */ 
 | 
    public List getCachedValueList(String key) { 
 | 
        List<Object> value = new ArrayList<>(); 
 | 
        Jedis jedis = null; 
 | 
        try { 
 | 
            jedis = getJedis(); 
 | 
            value = Collections.singletonList(jedis.lrange(key, 0, jedis.llen(key))); 
 | 
        } catch (RuntimeException e) { 
 | 
            LogUtil.error("获取redis 值 RuntimeException", e, ""); 
 | 
            if (jedis != null) { 
 | 
                jedis.close(); 
 | 
            } 
 | 
        } finally { 
 | 
            if (jedis != null) { 
 | 
                LogUtil.debug("释放jdedis 链接", jedis); 
 | 
                jedis.close(); 
 | 
            } 
 | 
        } 
 | 
        return value; 
 | 
    } 
 | 
  
 | 
    // public List<String> saveList 
 | 
    public String getCachedValue(String key) { 
 | 
        String value = ""; 
 | 
        Jedis jedis = null; 
 | 
        try { 
 | 
            jedis = getJedis(); 
 | 
            value = jedis.get(key); 
 | 
        } catch (RuntimeException e) { 
 | 
            LogUtil.error("获取redis 值 RuntimeException", e, ""); 
 | 
            if (jedis != null) { 
 | 
                jedis.close(); 
 | 
            } 
 | 
        } finally { 
 | 
            if (jedis != null) { 
 | 
                LogUtil.debug("释放jdedis 链接", jedis); 
 | 
                jedis.close(); 
 | 
            } 
 | 
        } 
 | 
        return value; 
 | 
    } 
 | 
  
 | 
    public void resetExpire(String key) { 
 | 
        Jedis jedis = getJedis(); 
 | 
        jedis.expire(key, timeOut); 
 | 
        jedis.close(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * bean创建后调用 
 | 
     */ 
 | 
    // @Override 
 | 
    public void afterPropertiesSet() throws Exception { 
 | 
        // 校验参数 
 | 
        notNull(hostname, "Property 'hostname' is required"); 
 | 
        notNull(port, "Property 'port' is required"); 
 | 
        JedisPoolConfig config = new JedisPoolConfig(); 
 | 
        config.setMaxIdle(100); 
 | 
        config.setMaxTotal(1000); 
 | 
        config.setMaxWaitMillis(30000L); 
 | 
        config.setTestOnBorrow(false); 
 | 
        // 每次释放链接的数目 
 | 
        config.setNumTestsPerEvictionRun(20); 
 | 
  
 | 
        jedisPool = new JedisPool(config, hostname, port, 30000, password, database); 
 | 
    } 
 | 
  
 | 
    private Jedis getJedis() { 
 | 
        Jedis jedis = jedisPool.getResource(); 
 | 
        return jedis; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void run(String... args) throws Exception { 
 | 
        // 校验参数 
 | 
        notNull(hostname, "Property 'hostname' is required"); 
 | 
        notNull(port, "Property 'port' is required"); 
 | 
        JedisPoolConfig config = new JedisPoolConfig(); 
 | 
        //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。 
 | 
        config.setMaxIdle(1000); 
 | 
        //设置最大实例总数 
 | 
        config.setMaxTotal(1); 
 | 
        config.setMaxWaitMillis(30000L); 
 | 
        config.setTestOnBorrow(false); 
 | 
        // 每次释放链接的数目 
 | 
        config.setNumTestsPerEvictionRun(20); 
 | 
        config.setSoftMinEvictableIdleTimeMillis(1800000); 
 | 
  
 | 
        jedisPool = new JedisPool(config, hostname, port, 30000, password, database); 
 | 
  
 | 
    } 
 | 
  
 | 
} 
 |