redis中采用管道进行sadd操作

管道中sadd函数定义如下:

public transient Long sAdd(byte[] key, byte[]... values)

第一个参数为byte类型的一维数组,第二个参数可以传入0到多个Object对象或者传入一个Object[]数组。

现在有一个需求,就是将Set<String>中的数据存储到某个key的value中,此时我们该怎么去将这个Set容器中的数据转换成byte型的二维数组?

错误的方法:

if(sets.size() > 0) {
    //log.info("合并set"+sets.toString());
    List<byte[]> bytelist = new ArrayList<>();
    for(String byval : sets) {
        if(byval != null) {
            
            bytelist.add(byval.getBytes());	
        }
    }
    
    //由于泛型中的擦除特性,这里不能进行强制转换
    byte[][] bytearr = (byte[][])bytelist.toArray();

    pipeLineClient.sAdd(key.getBytes(),bytearr);
    
    bytelist.clear();
    bytelist = null;
}

正确的方法:

if(sets.size() > 0) {
    //log.info("合并set"+sets.toString());
    int setsize = sets.size();
    String[] strarr = new String[setsize];
    
    int nsetcount = 0;
    for(String byval : sets) {
        if(byval != null) {
            strarr[nsetcount++] = byval;	
        }		        				
    }
    
    if(nsetcount > 0) {
        //String[] strarr = bytelist.toArray(new String[listsize]);
        byte[][] bytearr = new byte[nsetcount][];
        
        for(int i = 0; i < nsetcount; i++) {
            bytearr[i] = strarr[i].getBytes();
        }
        pipeLineClient.sAdd(key.getBytes(),bytearr);
    }
}

先将要存储的值存储到String数组中,然后通过转换到byte[][]二维数组变量中,最后将数组存储到redis管道中。

经验分享 程序员 微信小程序 职场和发展