package com.zy.acs.common.utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * 缓存支持 * Created by vincent on 2023-03-13 */ public class RedisSupport { private static final Map redis = new HashMap<>(); public static final String defaultRedisFlag = "redis"; public static RedisSupport defaultRedisSupport = RedisSupport.getRedis(defaultRedisFlag); public synchronized static RedisSupport getRedis(String name){ RedisSupport redisSupport = redis.get(name); if(redisSupport!=null) { return redisSupport; } redisSupport = new RedisSupport(name); redis.put(name, redisSupport); return redisSupport; } protected JedisPool pool; protected JedisPoolConfig config; Integer index = 0; public Boolean initialize = false; private RedisSupport(String name) { try { boolean bAll = true; String[] configKeys={"host","port","max","min","timeout","index"}; for(String key:configKeys){ if(!ConfigHelper.contains(name+"."+key)){ System.err.println(); bAll = false; } } if(bAll){ config = new JedisPoolConfig(); config.setMaxIdle(ConfigHelper.getInteger(name+".min")); config.setMaxWaitMillis(ConfigHelper.getLong(name+".timeout")); //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的; config.setTestOnBorrow(false); //当前jedis连接的库号 index = ConfigHelper.getInteger(name+".index"); //实例化jedis池 String host = ConfigHelper.getString(name+".host"); int port = ConfigHelper.getInteger(name+".port"); int timeout = ConfigHelper.getInteger(name+".timeout"); String password = ConfigHelper.getString(name+".password"); JedisPool d ; pool = new JedisPool(config,host , port,timeout,password); //初始化 Jedis jedis = this.getJedis(); this.pool.returnResource(jedis); initialize = true; }else{ System.err.println("ERROR - 初始化Reids时出错,在配置文件中未找到"+name+".***属性(host,port,max,min,timeout,index)"); } }catch(Exception ex){ ex.printStackTrace(); } } public Jedis getJedis(){ try{ Jedis jedis = pool.getResource(); if(this.index!=jedis.getDB().intValue()) jedis.select(this.index); return jedis; }catch(Exception ex){ System.err.println(ex.getMessage()); } return null; } public void retJedis(Jedis jedis){ if(jedis!=null) this.pool.returnResource(jedis); } Date last_console_time = new Date(); Boolean console = false; public void console(Object...objects){ if(!this.initialize)return; if((new Date().getTime()-last_console_time.getTime())>(1000*30)){ Jedis jedis = this.getJedis(); try{ console = "true".equals(jedis.get("INI.console")); }catch(Exception ex){ System.err.println(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } last_console_time = new Date(); } if(!console)return; StringBuilder strConsole = new StringBuilder("REDIS -"); for(Object object:objects) { strConsole.append(" ").append(object); } System.out.println(strConsole); } public Object setMap(String name, String key, Object value) { if(!this.initialize)return null; console("set map value",name,key,value); if(value==null){ deleteMap(name,key); return null; } Jedis jedis = this.getJedis(); try{ jedis.hset(("MAP."+name).getBytes(),key.getBytes(), Serialize.serialize(value)); }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } return value; } public T getMap(String name, String key) { if(!this.initialize)return null; console("get map value",name,key); Jedis jedis = this.getJedis(); try{ byte[] bytes = jedis.hget(("MAP."+name).getBytes(),key.getBytes()); if(bytes==null||bytes.length==0) return null; return (T) Serialize.unSerialize(bytes); }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } return null; } public Set getMapKeys(String name) { if(!this.initialize)return null; console("get map keys",name); Jedis jedis = this.getJedis(); try{ Set keys = jedis.hkeys(("MAP."+name)); return keys; }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } return null; } public Long deleteMap(String name, String... key) { if(!this.initialize)return null; console("delete value",name,key); Jedis jedis = this.getJedis(); try{ String[] keys=new String[key.length]; for(int i=0;i * @param name * @return */ public T pop(String name) { if(!this.initialize)return null; console("get list value",name); Jedis jedis = this.getJedis(); try{ byte[] bytes = jedis.lpop(("LIST."+name).getBytes()); if(bytes==null||bytes.length==0) return null; return (T) Serialize.unSerialize(bytes); }catch(Exception ex){ System.err.println(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } return null; } public Long deleteList(String name) { if(!this.initialize)return null; console("delete list",name); Jedis jedis = this.getJedis(); try{ return jedis.del("LIST."+name); }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } return null; } public void setListExpire(String name,int seconds){ if(!this.initialize)return; Jedis jedis = this.getJedis(); try{ jedis.expire(("LIST."+name).getBytes(), seconds); }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } } public void setListExpireTime(String name,Date atTime){ if(!this.initialize)return; Jedis jedis = this.getJedis(); try{ jedis.expireAt(("LIST."+name).getBytes(), atTime.getTime()/1000); }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } } public String setValue(String flag, String key, String value) { if(!this.initialize)return null; console("set value",flag,key,value); Jedis jedis = this.getJedis(); try{ String result = jedis.set("KV."+flag+"."+key, value); }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } return value; } public String setValue(String flag, String key, String value,Integer seconds) { if(!this.initialize)return null; console("set value",flag,key,value,seconds); Jedis jedis = this.getJedis(); try{ String result = jedis.setex("KV."+flag+"."+key,seconds,value); }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } return value; } public String getValue(String flag, String key) { if(!this.initialize)return null; console("get value",flag,key); Jedis jedis = this.getJedis(); try{ String returnValue = jedis.get("KV."+flag+"."+key); return returnValue; }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } return null; } public Long deleteValue(String flag, String... key) { if(!this.initialize)return null; console("delete value",flag,key); Jedis jedis = this.getJedis(); try{ String[] keys=new String[key.length]; for(int i=0;i T getObject(String flag,String key) { if(!this.initialize)return null; console("get object",flag,key); Jedis jedis = this.getJedis(); try{ byte[] bytes = jedis.get(("OBJ."+flag+"."+key).getBytes()); if(bytes==null||bytes.length==0) return null; T returnValue = (T) Serialize.unSerialize(bytes); return (T) returnValue; }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } return null; } public Long deleteObject(String flag, String key) { if(!this.initialize)return null; console("delete object",flag,key); Jedis jedis = this.getJedis(); try{ Long returnValue = jedis.del(("OBJ."+flag+"."+key).getBytes()); return returnValue; }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } return null; } public Long clearObject(String flag) { if(!this.initialize)return null; console("clear object",flag); this.setObject(flag, "CLEARING", "true"); Jedis jedis = this.getJedis(); try{ //EVAL "return redis.call('del', unpack(redis.call('keys', 'OBJ.*')))" 0 //EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 OBJ.* //Object returnValue = jedis.eval("return redis.call('del', unpack(redis.call('keys', ARGV[1])))",0,"OBJ."+flag+"."+"*"); Object returnValue = jedis.eval("local keys = redis.call('keys', ARGV[1]) for i=1,#keys,1000 do redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) end return #keys",0,"OBJ."+flag+"."+"*"); return Long.parseLong(String.valueOf(returnValue)); }catch(Exception ex){ ////Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } return null; } public void setObjectExpire(String flag, String key,int seconds){ if(!this.initialize)return; Jedis jedis = this.getJedis(); try{ jedis.expire(("OBJ."+flag+"."+key).getBytes(), seconds); }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } } public void setObjectExpireTime(String flag, String key,Date toTime){ if(!this.initialize)return; Jedis jedis = this.getJedis(); try{ jedis.expireAt(("OBJ."+flag+"."+key).getBytes(), toTime.getTime()/1000); }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } } public String[] getKeys(String pattern) { if(!this.initialize)return null; console("keys",pattern); Jedis jedis = this.getJedis(); try{ return jedis.keys(pattern).toArray(new String[]{}); }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } return null; } public Long incr(String key) { if(!this.initialize)return null; Jedis jedis = this.getJedis(); try{ Long returnValue = jedis.incr("DI."+key); return returnValue; }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } return null; } public Long decr(String key) { if(!this.initialize)return null; Jedis jedis = this.getJedis(); try{ Long returnValue = jedis.decr("DI."+key); return returnValue; }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } return null; } public static void main(String...strings){ Date start = new Date(); RedisSupport r = RedisSupport.getRedis("lazy.redis.0"); r.clearObject("aaa"); } }