前言
在实现客户需求的时候遇到一个问题,需要在SparkStreaming 中关联一些维表 ,但是需要做到秒级运算,于是我想到把维表放到Redis中,在foreach中进行jedis.get的操作实在太慢了,于是我想到使用mget
Jedis源码
@Override
public List<String> mget(final String... keys) {
return new JedisClusterCommand<List<String>>(connectionHandler, maxAttempts) {
@Override
public List<String> execute(Jedis connection) {
return connection.mget(keys);
}
}.run(keys.length, keys);
}
可以看到 mget需要我们传入的是多个String参数,而不是一个数组,所以我们传入数组会提示类型不匹配
于是可以使用这个方法
# array:Array[String]
jedis.mget(array: _*)
这样传入的就不是一个数组,而是这个数组枚举的所有成员参数
然而,在执行过程过遇到了这个问题:
No way to dispatch this command to Redis Cluster because keys have different slots.
这是因为Redis集群不支持mget对多个slots上的key进行同时获取,当然也是有办法解决的,我们只需要判断每个key的存放在哪个slots,对他们进行多叉树或者多维数组划分再依次mget就好了
但是我的初衷是为了减少get的效率问题,如果进行多次foreach操作 反而浪费更多的时间,所以redis这条路就走不通了
后言
测试之后证明直接把维表放到缓存到内存中join,效率更快,推荐使用这种方法