Redis序列



import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentLinkedQueue;


import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;


import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;


public class RedisSequenceUtil 
{

public static String SEQUENCE_PUBLIC_KEY ="SEQUENCE_PUBLIC_KEY";

public static String SEQUENCE_PICTRUE_KEY ="SEQUENCE_PICTRUE";

public static String SEQUENCE_TABLENO_KEY ="SEQUENCE_TABLENO";

public static String SEQUENCE_ORDER_KEY ="SEQUENCE_ORDER";

public static String SEQUENCE_BILL_KEY ="SEQUENCE_BILL";

public static String SEQUENCE_ACCOUNTNO_KEY ="SEQUENCE_ACCOUNTNO";

public static String SEQUENCE_TRANSCODE_KEY ="SEQUENCE_TRANSCODE";

//用户注册
public static String SEQUENCE_REGIST_KEY ="SEQUENCE_REGIST";
//需求管理
public static String SEQUENCE_DEMAND_KEY ="SEQUENCE_DEMAND";
//报价
public static String SEQUENCE_QUOTE_KEY ="SEQUENCE_QUOTE";
//上传文件
public static String UPLOAD_FILE_KEY ="UPLOAD_FILE";
//投诉
public static String COMPLAINT_KEY ="COMPLAINT";
//平台分发地接序列ID
public static String RECEPTION_DEMAND_KEY ="RECEPTION_DEMAND";
//产品
public static String PRODUCT_KEY ="PRODUCT_KEY";
//子产品
public static String SUBPRODUCT_KEY ="SUBPRODUCT_KEY";
//产品行程
public static String PRODUCT_TRIP_KEY ="PRODUCT_TRIP_KEY";
// //子产品行程
// public static String SUBPRODUCT_TRIP_KEY ="SUBPRODUCT_TRIP_KEY";
//子产品价格
public static String SUBPRODUCT_PRICE_KEY ="SUBPRODUCT_PRICE_KEY";

//交通方式
public static String TRAFFIC_KEY = "TRAFFIC_KEY";

//大交通产品订单预定关联表
public static String ORDER_RELATIVE_BIGTRAFFICE = "ORDER_RELATIVE_BIGTRAFFICE_KEY";
//大交通产品订单预定价格明细
public static String ORDER_PRICE = "ORDER_PRICE_KEY";



//图片库
//public static String PRODUCT_LIBRARY_KEY ="PRODUCT_LIBRARY";
//产品库存
public static String PRODUCT_INVENTORY_KEY ="PRODUCT_INVENTORY_KEY";
//产品库存价格
public static String PRODUCT_INVENTORY_PRICE_KEY ="PRODUCT_INVENTORY_PRICE";
//产品库存价格
public static String PRODUCT_INVENTORY_NUMBER_KEY ="PRODUCT_INVENTORY_NUMBER";
//主产品价格
public static String PRODUCT_PRICE_KEY = "PRODUCT_PRICE_KEY";
//订单日志
public static String SEQUENCE_ORDERLOGS_KEY ="SEQUENCE_ORDERLOGS";
//订单修改
public static String SEQUENCE_ORDERCHANGE_KEY ="SEQUENCE_ORDERCHANGE";
//导游信息
public static String SEQUENCE_GUIDEINFO_KEY ="SEQUENCE_GUIDEINFO";
//酒店 信息
public static String SEQUENCE_HOTELINFO_KEY ="SEQUENCE_HOTELINFO";
//购物流水信息
public static String SEQUENCE_SHOPWATERINFO_KEY ="SEQUENCE_SHOPWATERINFOINFO";
//航班信息
public static String SEQUENCE_FLIGHT_KEY ="SEQUENCE_FLIGHT";
//人员信息
public static String SEQUENCE_CUSTOMER_KEY ="SEQUENCE_CUSTOMER";
//游轮信息
public static String SEQUENCE_SHIP_KEY ="SEQUENCE_SHIP";
//订单实时结算收款
public static String SEQUENCE_RECEIVERECORD_KEY = "SEQUENCE_RECEIVERECORD";
//订单实时结算流水
public static String SEQUENCE_RECEIPTWATER_KEY = "SEQUENCE_RECEIPTWATER";
//组团社行程主表序列
public static String SEQUENCE_TRIP_KEY = "SEQUENCE_TRIP_KEY";
//组团社行程其他信息表序列
public static String SEQUENCE_TRIPITEM_KEY = "SEQUENCE_TRIPITEM_KEY";
//组团社行程图片表序列
public static String SEQUENCE_TRIPIMAGE_KEY = "SEQUENCE_TRIPIMAGE_KEY";
//平台订单审核(mge_order_check)
public static String SEQUENCE_ORDER_CHECK_KEY = "SEQUENCE_ORDER_CHECK";
//质保金及账户余额日志信息(mge_retention_log)
    public static String SEQUENCE_RETENTIONLOG_KEY ="SEQUENCE_RETENTIONLOG";

    //产品出发城市价格
public static String SEQUENCE_CITYPRICE_KEY ="SEQUENCE_CITYPRICE";

//产品分发信息
public static String SEQUENCE_DISTRIBUTE_KEY ="SEQUENCE_DISTRIBUTE";

//游客类型地接社关联
public static String SEQUENCE_TRAVELERRECEPTION_KEY ="SEQUENCE_TRAVELERRECEPTION";

    //游客类型价格设置
  public static String SEQUENCE_PRICE_KEY ="SEQUENCE_PRICE";
 
  //产品出发城市设置时间
  public static String SEQUENCE_SETTIME_KEY ="SEQUENCE_SETTIME";
 
//本地序列缓存组集合
private static Map<String, ConcurrentLinkedQueue<String> > squenceQueueMap = Collections.synchronizedMap(new HashMap<String, ConcurrentLinkedQueue<String>>());

    //redis序列缓存数
private final static  long redisSequenceSize = 100;

private static  JedisSentinelPool jedisSentinelPool;

/**
* 获取序列的值(String类型)
* @param sequenceKey
* @return
* @throws Exception 
*/
public synchronized static String getSequenceValue(String sequenceKey) throws Exception
{
String returnSeq = null;
//从本地缓存中获取序列集合

ConcurrentLinkedQueue<String> queue = squenceQueueMap.get(sequenceKey);
//如果集合对象存在
if(queue != null)
{
if(queue.isEmpty())
{
//从redis获取新的序列组,放到本地缓存
getMutiSequenceFromJedis(sequenceKey, queue);
}

}
else//集合对象不存在,说明有是一个新的序列,重新初始一个缓存序列
{
queue = new ConcurrentLinkedQueue<String>();
squenceQueueMap.put(sequenceKey, queue);
//从redis获取新的序列组,放到本地缓存
getMutiSequenceFromJedis(sequenceKey, queue);
}
returnSeq = queue.poll();
return returnSeq;
}


/**
* 获取序列的值(Long类型)
* @param sequenceKey
* @return
* @throws Exception 
* @throws NumberFormatException 
*/
public  static Long getSequenceValueToLong(String sequenceKey) throws  Exception{
return Long.parseLong(getSequenceValue(sequenceKey));
}



/**
* 从redis获取新的序列组,放到本地缓存
* @param sequenceKey
* @param vector
* @throws Exception 
*/
private static void getMutiSequenceFromJedis(String sequenceKey,ConcurrentLinkedQueue<String> queue) throws Exception
{

Jedis jedis  = getJedis();
try
{
String luaScript = "local firstNum=redis.call('INCR',KEYS[1]);local endNum=firstNum+("+String.valueOf(redisSequenceSize)+"-1);redis.call('SET',KEYS[1],endNum);return firstNum..'-'..endNum;";
//获得的值格式为 1-100  
Object mutiSeq = jedis.eval(luaScript.toString(),1,sequenceKey);
//System.out.println("sequenceNo"+ String.valueOf(mutiSeq));
String [] sequenceNo = String.valueOf(mutiSeq).split("-");
for(Long m = Long.valueOf(sequenceNo[0]);m<=Long.valueOf(sequenceNo[1]);m++)
{
queue.add(String.valueOf(m));
}
}
catch(Exception e)
{
e.printStackTrace();
throw e;
}
finally
{
releaseJedis(jedis);
}
}





/**
* 从redis获取单个序列
* @param sequenceKey
* @throws Exception 
*/
public  static Long getSingleSequenceFromJedis(String sequenceKey) throws Exception
{

Jedis jedis  = getJedis();

Long lreturnSequence = 0l;
try
{
//获得的值格式为 1-100  
lreturnSequence = jedis.incr(sequenceKey);


}
catch(Exception e)
{
e.printStackTrace();
throw e;
}
finally
{
releaseJedis(jedis);
}

return lreturnSequence;
}




/**
* 获取jedis对象
* @return
*/
    private static Jedis getJedis()
    {
    Jedis jedis=null;
    try{
    if(jedisSentinelPool==null){
       jedisSentinelPool = getJedisSentinelPool();
    }
    jedis = jedisSentinelPool.getResource();
    jedis.select(RedisDistributedUtil.SELECTDB_SEQUENCE);
    }
    catch(Exception ex){
    ex.printStackTrace();
    }
        return jedis;
    }
    
    
    /**
* 获取redis

* @param key
* @param jedisGroup
* @return
*/
private static  JedisSentinelPool getJedisSentinelPool() throws Exception{
JedisSentinelPool jedisSentinelPool = null;
List<RedisCluster> clustersList = null;
try {
clustersList = RedisConfig.redisGroupList;
    if(clustersList!=null && clustersList.size()>0){
jedisSentinelPool = RedisDistributedFactory.redisPoolMap.get(0);
    }
    else{
    throw new Exception("没有在xml文件找到有用的redis服务配置");
    }


} catch (Exception e) {
e.printStackTrace();
throw e;
}
return jedisSentinelPool;
}


    
    /**
     * 释放jedis
     * @param jedisPool
     * @return
     */
    private static void releaseJedis(Jedis jedis)
    {
    jedisSentinelPool.returnResourceObject(jedis);
    }  





}

猜你喜欢

转载自blog.csdn.net/yyyyu3/article/details/80898370