springboot中使用StringRedisTemplate 对redis进行批量插入, 使用管道executePipelined操作,提高效率
//批量插入redis
public void insertRedisBatch(final List<OutboundRequest> outs){
stringRedisTemplate.executePipelined(new RedisCallback<String>() {
@Override
public String doInRedis(RedisConnection connection) throws DataAccessException {
StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
for (int i=0;i<outs.size();i++) {
OutboundRequest out=outs.get(i);
String key="RCS:REVOKE:"+out.getClicentCorrelator()+":"+out.getKeyNumber();
String value=out.getUserMobile()+","+out.getMsgId();
stringRedisConn.lPush(key.getBytes(), value.getBytes());//批量list
// stringRedisConn.set(("aaa"+i).getBytes(),"nnn".getBytes());//批量String
String key2="RCS:REPORT:"+out.getMsgId()+":"+out.getUserMobile();
String filed2="task";
String value2= out.getTaskId();
connection.hSet(key2.getBytes(),filed2.getBytes(),value2.getBytes());//批量Map
stringRedisConn.expire(key.getBytes(),config.getRevokeQueueTimeout()*60);//过期时间单位秒
}
return null;
}
});
}
//批量获取redis
public List<Object> queryRedisBatch(final List<OutboundRequest> outs){
List<Object> results = stringRedisTemplate.executePipelined(
new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
for (int i=0;i<outs.size();i++) {
OutboundRequest out=outs.get(i);
String key="RCS:REVOKE:"+out.getClicentCorrelator()+":"+out.getKeyNumber();
stringRedisConn.lPop(key);
}
return null;
}
});
return results;
}
application,java
@Bean(name="cache") public Cache cache() { String cv= LoadMaapapp.getModuleConfig("revokeQueueTimeout"); Integer revokeQueueTimeout=cv==null?config.getRevokeQueueTimeout():Integer.valueOf(cv); return new GuavaCache("cache", CacheBuilder.newBuilder().maximumSize(30000).expireAfterWrite(revokeQueueTimeout, TimeUnit.MINUTES).build()); }
@Slf4j
@Component
public class RevokeQueueRedis {
@Autowired
@Qualifier("cache")
private Cache cache;
@Autowired
private Config config;
@Autowired
public StringRedisTemplate stringRedisTemplate;
// 撤回的电话号码插入redis的队列
public static BlockingQueue<OutboundRequest> revokeQueueRedis = new LinkedBlockingQueue<>(5000);
@PostConstruct
public void insert(){ //开启一个插入redis数据的线程
runThread();
}
public void runThread(){
new Thread(){
@Override
public void run() {
log.info("---------开启批量插入撤回队列的线程");
while(true){
try{
if(revokeQueueRedis.size()>0){
int tempcount = 100;
if (tempcount > revokeQueueRedis.size()) {
tempcount = revokeQueueRedis.size();
}
List<OutboundRequest> outs=new ArrayList<>();
for (int i =0; i < tempcount; i++) {
OutboundRequest out = revokeQueueRedis.poll();
if (null != out) {
outs.add(out);
}
}
try {
insertRedisBatch(outs);
} catch (Exception e) {
log.error("insert revokeQueueRedis error,msg={}",e);
}
JavaUtil.sleep(10);
}
JavaUtil.sleep(50);
} catch (Exception e) {
log.error("insert revokeQueueRedis error={}",e);
NullUtil.sleep(100);
}
}
}
}.start();
}
//批量插入redis
public void insertRedisBatch(final List<OutboundRequest> outs){
stringRedisTemplate.executePipelined(new RedisCallback<String>() {
@Override
public String doInRedis(RedisConnection connection) throws DataAccessException {
StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
for (int i=0;i<outs.size();i++) {
OutboundRequest out=outs.get(i);
String key="RCS:REVOKE:"+out.getClicentCorrelator()+":"+out.getKeyNumber();
String value=out.getUserMobile()+","+out.getMsgId();
stringRedisConn.lPush(key.getBytes(), value.getBytes());//批量list
// stringRedisConn.set(("aaa"+i).getBytes(),"nnn".getBytes());//批量String
if(null==cache.get(key,OutboundRequest.class)) {//不存在说明没有设置过期时间
String cv=LoadMaapapp.getModuleConfig("revokeQueueTimeout");
Integer revokeQueueTimeout=cv==null?config.getRevokeQueueTimeout():Integer.valueOf(cv);
stringRedisConn.expire(key.getBytes(), revokeQueueTimeout * 60);//过期时间单位秒
cache.put(key,out);
}
}
return null;
}
});
}
//批量获取redis
public List<Object> queryRedisBatch(final List<OutboundRequest> outs){
List<Object> results = stringRedisTemplate.executePipelined(
new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
for (int i=0;i<outs.size();i++) {
OutboundRequest out=outs.get(i);
String key="RCS:REVOKE:"+out.getClicentCorrelator()+":"+out.getKeyNumber();
stringRedisConn.lPop(key);
}
return null;
}
});
return results;
}
}