一开始使用 keys() 这种形式,大发现网上大量文章表示,这种形式会非常耗费内存。
于是改一下方式,使用hash, (key hkey hvalue),把要模糊查询的值放到hkey上面。然后使用scan来模糊查询。效率上面没什么变化。
期间有一个问题花了不少时间:
sacanBuider.match("*t*") 匹配hkey,而hkey是序列化过的,头部加了标识,所以导致 t* 这样通配符失效。后来不redis.setHashKeySerializer(new StringRedisSerializer());
ok了,不知道有没有人遇到这种问题,有没有其他办法。
这种模糊查询效率没有经过大数据的测试,不知道是否是好办法。
Test代码:
public void redishashTest11(){
redis.setKeySerializer(new StringRedisSerializer());
redis.setValueSerializer(new Jackson2JsonRedisSerializer(String.class));
redis.setHashKeySerializer(new StringRedisSerializer());
redis.setHashValueSerializer(new StringRedisSerializer());
BoundHashOperations bo = redis.boundHashOps("testhash");
//redis.setValueSerializer(new Jackson2JsonRedisSerializer(String.class));
// redis.afterPropertiesSet();
//redis.boundValueOps("test").set("czltest");
StringRedisSerializer sser = new StringRedisSerializer();
bo.put("test1", "xxx3");
bo.put("est2", "cxx4");
ScanOptionsBuilder sacanBuider= new ScanOptionsBuilder();
sacanBuider.match("*t*");
ScanOptions so =sacanBuider.build();
System.out.println("so.toOptionString():"+so.toOptionString());
org.springframework.data.redis.core.Cursor cur = bo.scan(sacanBuider.build());
try {
//cur.open();
while(cur.hasNext()){
Map.Entry e= (Map.Entry) cur.next();
System.out.println("key:"+e.getKey()+" vaule:"+e.getValue());
}
cur.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}