package com.vincent.rsf.common.utils; import lombok.extern.slf4j.Slf4j; 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; /** * redis tools * Created by vincent on 2023-03-13 */ @Slf4j public class RedisSupport { private static final Map REDIS_CACHE = new HashMap<>(); public static final String DEFAULT_FLAG = "redis"; private static final String LINK = "."; public static RedisSupport defaultRedisSupport = RedisSupport.getRedis(DEFAULT_FLAG); protected JedisPool pool; protected JedisPoolConfig config; Integer index = 0; public Boolean initialize = false; public synchronized static RedisSupport getRedis(String name){ RedisSupport redisSupport = REDIS_CACHE.get(name); if (null == redisSupport){ redisSupport = new RedisSupport(name); REDIS_CACHE.put(name, redisSupport); } return redisSupport; } 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)){ 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"); pool = new JedisPool(config,host , port,timeout,password); Jedis jedis = this.getJedis(); this.pool.returnResource(jedis); initialize = true; } else { log.error("ERROR - 初始化Reids时出错,在配置文件中未找到{}.***属性(host,port,max,min,timeout,index)", name); } } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } } public Jedis getJedis(){ try{ Jedis jedis = pool.getResource(); if(this.index != jedis.getDB().intValue()) { jedis.select(this.index); } return jedis; } catch (Exception e){ log.error(this.getClass().getSimpleName(), e); } return null; } // key - value ---------------------------------------------------------------------------------------------------------- public String setValue(String flag, String key, String value) { if(!this.initialize) { return null; } Jedis jedis = this.getJedis(); try{ return jedis.set(flag + LINK + key, value); } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } return null; } public String setValue(String flag, String key, String value,Integer seconds) { if(!this.initialize) { return null; } Jedis jedis = this.getJedis(); try{ return jedis.setex(flag + LINK + key, seconds , value); } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } return null; } public String getValue(String flag, String key) { if(!this.initialize) { return null; } Jedis jedis = this.getJedis(); try{ return jedis.get(flag + LINK + key); } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } return null; } public Long deleteValue(String flag, String... key) { if(!this.initialize) { return null; } Jedis jedis = this.getJedis(); try{ String[] keys = new String[key.length]; for(int i=0;i T getMap(String name, String key) { if(!this.initialize) { return null; } Jedis jedis = this.getJedis(); try{ byte[] bytes = jedis.hget(name.getBytes(), key.getBytes()); if (bytes == null || bytes.length == 0) { return null; } return (T) Serialize.unSerialize(bytes); } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } return null; } public Set getMapKeys(String name) { if(!this.initialize) { return null; } Jedis jedis = this.getJedis(); try{ return jedis.hkeys(name); } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } return null; } public Long deleteMap(String name, String... key) { if(!this.initialize) { return null; } Jedis jedis = this.getJedis(); try{ String[] keys = new String[key.length]; System.arraycopy(key, 0, keys, 0, key.length); return jedis.hdel(name, keys); } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } return null; } public Long clearMap(String name) { if(!this.initialize) { return null; } Jedis jedis = this.getJedis(); try{ return jedis.del(name); } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } return null; } public void setMapExpire(String name,int seconds){ if(!this.initialize) { return; } Jedis jedis = this.getJedis(); try{ jedis.expire(name.getBytes(), seconds); } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } } public void setMapExpireTime(String name,Date atTime){ if(!this.initialize) { return; } Jedis jedis = this.getJedis(); try{ jedis.expireAt(name.getBytes(), atTime.getTime()/1000); } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } } // mq ---------------------------------------------------------------------------------------------------------- // 列表末尾添加元素 public Long push(String name, Object value) { if(!this.initialize) { return null; } if(value == null){ return null; } Jedis jedis = this.getJedis(); try{ return jedis.rpush(name.getBytes(), Serialize.serialize(value)); } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } return null; } // 获取列表头部元素 && 删除 public T pop(String name) { if(!this.initialize){ return null; } Jedis jedis = this.getJedis(); try{ byte[] bytes = jedis.lpop(name.getBytes()); if(bytes == null || bytes.length == 0) { return null; } return (T) Serialize.unSerialize(bytes); } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } return null; } // 删除 public Long deleteList(String name) { if(!this.initialize) { return null; } Jedis jedis = this.getJedis(); try{ return jedis.del(name); } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } return null; } public void setListExpire(String name, int seconds){ if(!this.initialize) { return; } Jedis jedis = this.getJedis(); try{ jedis.expire(name.getBytes(), seconds); } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } } public void setListExpireTime(String name, Date atTime){ if(!this.initialize) { return; } Jedis jedis = this.getJedis(); try{ jedis.expireAt(name.getBytes(), atTime.getTime()/1000); } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } } public Object setObject(String flag,String key, Object value) { if(!this.initialize)return null; if(value==null){ this.deleteObject(flag, key); return null; } Jedis jedis = this.getJedis(); try{ String result = jedis.set(("OBJ."+flag+"."+key).getBytes(), Serialize.serialize(value)); return value; }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } return value; } public Object setObject(String flag,String key, Object value,Integer seconds) { if(!this.initialize)return null; if(value==null){ this.deleteObject(flag, key); return null; } Jedis jedis = this.getJedis(); try{ String result = jedis.setex(("OBJ."+flag+"."+key).getBytes(),seconds,Serialize.serialize(value)); return value; }catch(Exception ex){ //Utils.trace(ex.getMessage()); }finally{ if(jedis!=null) this.pool.returnResource(jedis); } return value; } public T getObject(String flag,String key) { if(!this.initialize)return null; 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; 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; 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; 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"); } }