StringRedisTemplate 批量插入数据并且设置过期时间,批量获取redis数据信息

2 篇文章 0 订阅

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;
    }

}

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值