无序:
sadd:
String script = "redis.call('sadd',KEYS[1],ARGV[1]) " + " if( redis.call('ttl',KEYS[1]) <= 0 ) "
+ " then redis.call('expire',KEYS[1],tonumber(ARGV[2]) ) end";
List<String> keys = new ArrayList<>(1);
keys.add(key);
List<String> args = new ArrayList<>(3);
args.add(member);
args.add(到期时间 秒);
jedisCluster.evalscript keys ,args)
有序:
zadd:
Long zadd(String key, double score, String member);
List<String> keys = new ArrayList<>(1);
keys.add(key);
List<String> args = new ArrayList<>(3);
args.add(member);
args.add(scope);
args.add(到期时间 秒);
script = " redis.call('zadd',KEYS[1],ARGV[2],ARGV[1]) " +
" if( redis.call('ttl',KEYS[1]) <= 0 ) " +
" then redis.call('expire',KEYS[1],tonumber(ARGV[3]) ) end ";
jedisCluster.eval(script, keys, args);
散列:
hset: Long hset(String key, String field, String value);
String allScript = "redis.call('hset',KEYS[1],ARGV[1],ARGV[2])";
List<String> allKeys = new ArrayList<>(1);
allKeys.add(key);
List<String> allArgs = new ArrayList<>(2);
allArgs.add(filed);
allArgs.add(value);
jedisCluster.eval(allScript, allKeys, allArgs);
或者:
String allScript = "redis.call('hset',KEYS[1],ARGV[1],ARGV[2])";
List<String> allKeys = new ArrayList<>(1);
allKeys.add(key);
List<String> allArgs = new ArrayList<>(2);
allArgs.add(filed);
allArgs.add(value);
allArgs.add(到期时间 秒);
jedisCluster.eval(allScript, allKeys, allArgs);
String script = "redis.call('hset',KEYS[1],ARGV[1],ARGV[2]) " + " if( redis.call('ttl',KEYS[1]) <= 0 ) "
+ " then redis.call('expire',KEYS[1],tonumber(ARGV[3]) ) end";
hincrBy:
script = "redis.call('hincrBy',KEYS[1],ARGV[1],tonumber(ARGV[2])) " + " if( redis.call('ttl',KEYS[1]) <= 0 ) "
+ " then redis.call('expire',KEYS[1],tonumber(ARGV[3]) ) end";
List<String> keys = new ArrayList<>(1);
keys.add(key);
args = new ArrayList<>(3);
//总车流量:1 +1
args.add(filed);
args.add(数字加多少);
args.add(到期时间 秒);
jedisCluster.eval(script, keys, args);
llen:
System.out.println(jedisCluster.lrange("HIGHT_ALARM_PUSHMSG",0,-1));
List<String> keys = new ArrayList(1);
keys.add("HIGHT_ALARM_PUSHMSG");
List<String> args = new ArrayList(1);
args.add("messss fffff2 ");
String script = "local count = redis.call('llen',KEYS[1]) if(count >= 1) then redis.call('rpop',KEYS[1]) end redis.call('lpush',KEYS[1],ARGV[1])";
jedisCluster.eval(script,keys,args);
System.out.println(jedisCluster.lrange("HIGHT_ALARM_PUSHMSG",0,-1));
或者;
System.out.println(jedisCluster.lrange("HIGHT_ALARM_PUSHMSG",0,-1));
List<String> keys = new ArrayList(1);
keys.add("HIGHT_ALARM_PUSHMSG");
List<String> args = new ArrayList(1);
args.add("messss fffff6 ");
String script = "local count = redis.call('llen',KEYS[1]) if(count >= 5) then redis.call('rpop',KEYS[1]) end redis.call('lpush',KEYS[1],ARGV[1])";
System.out.println(jedisCluster.eval(script,keys,args));
System.out.println(jedisCluster.lrange("HIGHT_ALARM_PUSHMSG",0,-1));
测试结果:
[messss fffff5 , messss fffff4 , messss fffff3 , messss fffff2 , messss fffff1 ]
null
[messss fffff6 , messss fffff5 , messss fffff4 , messss fffff3 , messss fffff2 ]
get :
String key = "key111";
List<String> keys = new ArrayList<String>(1);
keys.add(key);
List<String> values = new ArrayList<String>(1);
values.add("212112");
String script = " local v = 0 if(redis.call('get',KEYS[1]) == 'dfaa') then v = 1 else v = 2 end return v";
System.out.println(jedisCluster.eval(script,keys,values));
System.out.println(jedisCluster.get("key111"));
redis分页:
long currMills = System.currentTimeMillis();
long s = System.currentTimeMillis();
Map<String, String> traceMap = new HashMap<>();
if(StringUtils.isEmpty(vno)) {
int fromIndex = page==null?0:(page.getPageNum() - 1) * page.getPageSize();
int pageSize = page==null?15:page.getPageSize();
Set<String> traceSet = redis.zrevrangeByScore(RedisKeyConsts.TRACE_ZSET+dateStr, max, min, fromIndex, pageSize);
for (String traceStr : traceSet) {
String trace = redis.hget(RedisKeyConsts.TRACE + dateStr, traceStr);
traceMap.put(traceStr, trace);
}
}else{
String cursor="0";
ScanParams scanParams =new ScanParams();
scanParams.count(fetchSize);
scanParams.match("*"+vno+"*");
do {
ScanResult<Map.Entry<String, String>> scanResult = redis.hscan(RedisKeyConsts.TRACE + dateStr, cursor, scanParams);
List<Map.Entry<String, String>> entryList = scanResult.getResult();
for (Map.Entry<String, String> entry : entryList) {
traceMap.put(entry.getKey(),entry.getValue());
}
cursor = scanResult.getStringCursor();
} while (!cursor.equals("0"));
}
//不传参数
if(StringUtils.isEmpty(vehicleNo)){
pager = new PageUtils<>();
pager.setPageNum(page.getPageNum());
pager.setPageSize(page.getPageSize());
pager.setTotal(redis.zcount(RedisKeyConsts.TRACE_ZSET+dateStr,min,max));
pager.setDataList(vehicleSuperviseDtos);
}else{
pager = new PageUtils<>(page.getPageNum(), page.getPageSize(), vehicleSuperviseDtos);
}
//多线程
//线程工厂
public class ExecutorFactory {
private static ExecutorService pool;
static {
initPool();
}
private static void initPool() {
pool = Executors.newFixedThreadPool(50, new ThreadFactoryBuilder().setNameFormat("qd-pool-%d").build());
}
public static void execute(Runnable command) {
pool.execute(command);
}
public static <T> Future<T> submit(Callable<T> task) {
return pool.submit(task);
}
}
s = System.currentTimeMillis();
List<Map<String, String>> result = new ArrayList<>(traceMap.entrySet().size());
List<Future<Map<String, String>>> futureList = new ArrayList<>(traceMap.entrySet().size());
for (Map.Entry<String, String> entry : traceMap.entrySet()) {
futureList.add(ExecutorFactory.submit(new HandleTraceTask(entry, vno, currMills)));
}
for (Future<Map<String, String>> future : futureList) {
try {
Map<String, String> item = future.get();
if (item != null) {
result.add(item);
}
} catch (Exception e) {
logger.error("跳过处理出错的轨迹点", e);
}
}
private class HandleTraceTask implements Callable<Map<String, String>> {
private Map.Entry<String, String> entry;
private String vno;
private long currMills;
public HandleTraceTask(Map.Entry<String, String> entry, String vno, long currMills) {
this.entry = entry;
this.vno = vno;
this.currMills = currMills;
}
@Override
public Map<String, String> call() throws Exception {
return handleTraceData(entry, vno, currMills);
}
}
/**
* 处理轨迹数据
*
* @param entry 原始数据
* @param vno 车牌号
* @param currMills 当前时间
* @return map
*/
private Map<String, String> handleTraceData(Map.Entry<String, String> entry, String vno, long currMills) {
String[] vnoAndColor = entry.getKey().split("_");
// lon@lat@gpsTime@direction@gpsSpeed@rtAreaCode
String[] data = entry.getValue().split(SEP,8);
if (isEmpty(data[0]) || isEmpty(data[1]) || isEmpty(data[2])) {
return null;
}
if (vno != null && !vnoAndColor[0].contains(vno)) {
return null;
}
Map<String, String> item = new HashMap<>();
item.put("isOnline", isOnline(Long.parseLong(data[2]), currMills) ? "1" : "0");
item.put("lat", data[1]);
item.put("lon", data[0]);
item.put("direction", data[3]);
item.put("gpsTime", data[2]);
item.put("gpsSpeed", String.valueOf(new BigDecimal(NumberUtils.toDouble(data[4], 0D)).setScale(1, RoundingMode.HALF_UP)));
item.put("vno", vnoAndColor[0]);
item.put("color", vnoAndColor[1]);
if (data.length == 6) {
item.put("area", data[5]);
}
return item;
}
list排序:
List<VehicleSuperviseDto> vehicleSuperviseDtos = this.findList(vehicleNo, dateStr,page,min,max);
vehicleSuperviseDtos.sort(Comparator.comparing(VehicleSuperviseDto::getIfOnline).reversed().thenComparing(VehicleSuperviseDto::getVehicleNo));