使用Object去强转可变参数类型
最近在使用redisTemplate去删除hash表中的某个键时,发现一直删除不了。对于redis中的key序列化 我使用的是 StringRedisSerializer 这个类。前置条件全部删除完毕,来看代码。
/**
* 这里是在redisTemplate的基础上再进行了一次封装
* 注意真正调用时的传参
* delete(key, (Object) hKeys) 这里强转了可变参数类型
*/
public static boolean deleteMapValue(final String key, final String... hKeys) {
return redisTemplate.opsForHash().delete(key, (Object) hKeys) > 0;
}
/**
* 这里是 redisTemplate中的 delete方法
* hashKeys 这个参数的数据结构变成了 一个嵌套数组
* Object[
* String[
* ]
* ]
*/
public Long delete(K key, Object... hashKeys) {
byte[] rawKey = rawKey(key);
byte[][] rawHashKeys = rawHashKeys(hashKeys);
return execute(connection -> connection.hDel(rawKey, rawHashKeys));
}
/**
* 最后的序列化逻辑就相当于这样
*/
@SneakyThrows
public static byte[] getByteArray(Object key){
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(key);
objectOutputStream.flush();
byte[] byteArray = byteArrayOutputStream.toByteArray();
return byteArray;
}
我在存储的时候 传参是一个String 即使使用 (Object)String 的写法其实也不会有太大影响。问题就出现在使用Object强转可变参数类型这里 变成嵌套数组之后 取出的 key 就变成了一个 String类型的数组对象 导致在redis中找不到键 然后删除失败。
每天上一当,当当不一样。!!!