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管道中。
