package com.vincent.rsf.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<String, RedisSupport> 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> 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<String> getMapKeys(String name) {
|
if(!this.initialize)return null;
|
console("get map keys",name);
|
Jedis jedis = this.getJedis();
|
try{
|
Set<String> 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<key.length;i++){
|
keys[i]=key[i];
|
}
|
Long returnMap = jedis.hdel("MAP."+name, keys);
|
return returnMap;
|
}catch(Exception ex){
|
//Utils.trace(ex.getMessage());
|
}finally{
|
if(jedis!=null)
|
this.pool.returnResource(jedis);
|
}
|
return null;
|
}
|
public Long clearMap(String name) {
|
if(!this.initialize)return null;
|
console("clear value",name);
|
Jedis jedis = this.getJedis();
|
try{
|
return jedis.del("MAP."+name);
|
}catch(Exception ex){
|
//Utils.trace(ex.getMessage());
|
}finally{
|
if(jedis!=null)
|
this.pool.returnResource(jedis);
|
}
|
return null;
|
}
|
public void setMapExpire(String name,int seconds){
|
if(!this.initialize)return;
|
Jedis jedis = this.getJedis();
|
try{
|
jedis.expire(("MAP."+name).getBytes(), seconds);
|
}catch(Exception ex){
|
//Utils.trace(ex.getMessage());
|
}finally{
|
if(jedis!=null)
|
this.pool.returnResource(jedis);
|
}
|
}
|
public void setMapExpireTime(String name,Date atTime){
|
if(!this.initialize)return;
|
Jedis jedis = this.getJedis();
|
try{
|
jedis.expireAt(("MAP."+name).getBytes(), atTime.getTime()/1000);
|
}catch(Exception ex){
|
//Utils.trace(ex.getMessage());
|
}finally{
|
if(jedis!=null)
|
this.pool.returnResource(jedis);
|
}
|
}
|
|
|
|
|
|
|
|
|
|
|
/**
|
* 列表末尾添加元素
|
* @param name
|
* @param value
|
* @return
|
*/
|
public Object push(String name, Object value) {
|
if(!this.initialize)return null;
|
console("push list value",name,value);
|
if(value==null){
|
return null;
|
}
|
Jedis jedis = this.getJedis();
|
try{
|
jedis.rpush(("LIST."+name).getBytes(),Serialize.serialize(value));
|
}catch(Exception ex){
|
//Utils.trace(ex.getMessage());
|
}finally{
|
if(jedis!=null)
|
this.pool.returnResource(jedis);
|
}
|
return value;
|
}
|
/**
|
* 获取列表头部元素
|
* @param <T>
|
* @param name
|
* @return
|
*/
|
public <T> 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<key.length;i++){
|
keys[i]="KV."+flag+"."+key[i];
|
}
|
Long returnValue = jedis.del(keys);
|
return returnValue;
|
}catch(Exception ex){
|
//Utils.trace(ex.getMessage());
|
}finally{
|
if(jedis!=null)
|
this.pool.returnResource(jedis);
|
}
|
return null;
|
}
|
public Long clearValue(String flag) {
|
if(!this.initialize)return null;
|
console("clear value",flag);
|
|
this.setValue(flag, "CLEARING", "true");
|
Jedis jedis = this.getJedis();
|
|
try{
|
//EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 KV.*
|
Object returnValue = jedis.eval("return redis.call('del', unpack(redis.call('keys', ARGV[1])))",0,"KV."+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 setValueExpire(String flag, String key,int seconds){
|
if(!this.initialize)return;
|
Jedis jedis = this.getJedis();
|
try{
|
jedis.expire(("KV."+flag+"."+key).getBytes(), seconds);
|
}catch(Exception ex){
|
//Utils.trace(ex.getMessage());
|
}finally{
|
if(jedis!=null)
|
this.pool.returnResource(jedis);
|
}
|
}
|
|
|
public void setValueExpireTime(String flag, String key,Date atTime){
|
if(!this.initialize)return;
|
Jedis jedis = this.getJedis();
|
try{
|
jedis.expireAt(("KV."+flag+"."+key).getBytes(), atTime.getTime()/1000);
|
}catch(Exception ex){
|
//Utils.trace(ex.getMessage());
|
}finally{
|
if(jedis!=null)
|
this.pool.returnResource(jedis);
|
}
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public Object setObject(String flag,String key, Object value) {
|
if(!this.initialize)return null;
|
console("set object",flag,key,value);
|
|
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;
|
console("set object",flag,key,value,seconds);
|
|
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> 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 <T> 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 <T> 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");
|
}
|
|
}
|