这里集合使用了别名List->JavaList,ArrayList->JavaArrayList
def scanKeys(key: String): JavaList[String] = {
var jedis: Jedis = null
try {
jedis = jedisPool.getResource()
val keys = new JavaArrayList[String]()
var cursor = "0"
val sp: ScanParams = new ScanParams()
//注意这里不能直接用match,需要使用反引号转义
sp.`match`("*" + key + "*")
sp.count(100)
do {
val ret = jedis.scan(cursor, sp)
val result = ret.getResult()
if (result != null && result.size() > 0) {
keys.addAll(result)
}
// 再处理cursor
cursor = ret.getStringCursor()
} while (!cursor.equals("0"))
keys
} finally {
RedisService.returnToPool(jedis)
}
}
重点是批删除方法
def delete(prefix: KeyPrefix): Boolean = {
var jedis: Jedis = null
var keys: JavaList[String] = scanKeys(prefix.getPrefix())
val keyss = new ArrayBuffer[String]() //显示指定keyss的泛型
for (k <- keys) {
if (k != null)//非必需,前面已经判断,此时这里是多余了
keyss.+=(k) //数组追加
}
if (prefix == null) {
return false
}
if (keys == null || keys.size() <= 0) {
return true
}
try {
jedis = jedisPool.getResource()
//TODO 参数 : _*表示将数组的单个元素作为传入的参数,必须注意这里的参数传递,不能直接传入一个数组【即使del方法方法签名是String*】
jedis.del(keyss: _*)
true
} catch {
case e: Exception =>
e.printStackTrace()
false
} finally {
RedisService.returnToPool(jedis)
}
}
集合先转数组,再使用 :_* 使用数组的每个元素作为传入参数,而不是数组整体。