Redis命令行
我向Redis中存入若干个键值对:(loli1: Mana)、(loli2: Alice)、(loli3: Cocoa)。如果我想要得到所有的萝莉的名字(Mana、Alice、Cocoa),是否可行呢?
其实,Redis本身提供 对于键的模糊查询。
127.0.0.1:6379> set loli1 Mana
OK
127.0.0.1:6379> set loli2 Alice
OK
127.0.0.1:6379> set loli3 Cocoa
OK
127.0.0.1:6379> keys loli?
1) "loli1"
2) "loli2"
3) "loli3"
127.0.0.1:6379> keys lo???
1) "loli1"
2) "loli2"
3) "loli3"
127.0.0.1:6379> keys lo*
1) "loli1"
2) "loli2"
3) "loli3"
127.0.0.1:6379> keys lo[12]
1) "loli1"
2) "loli2"
没错,Reids提供三种pattern的模糊查询:
? 匹配任意一个字符
* 匹配任意多个字符
[] 匹配括号内的某一个字符
注意,这是对于键的模糊查询,而不是对于值的模糊查询!想要得到值,还需要拿着这些键再查一次。
SpringBoot集成
SpringBoot集成了RedisTemplate模板类,可以轻易的调用Redis。
但是,RedisTemplate模板类并不支持模糊查询。
解决的方案很简单,使用StringRedisTemplate模板类。
下面是一个简单的工具类,可以作为参考:
@Service
public class RedisServiceImpl implements RedisService {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public Object get(String key) {
return isBlank(key) ? null : redisTemplate.opsForValue().get(key);
}
@Override
public List<String> getVals(String key) {
Set<String> keys = isBlank(key) ? null : stringRedisTemplate.keys(key);
List<String> vals = new ArrayList<>();
if (keys == null) {
return null;
} else {
for (String k : keys) {
vals.add(stringRedisTemplate.opsForValue().get(k));
}
return vals;
}
}
@Override
// set方法
@Override
// remove方法
public boolean isBlank(String s) {
int len;
if (s != null && (len = s.length()) != 0) {
for(int i = 0; i < len; ++i) {
if (!Character.isWhitespace(s.charAt(i))) {
return false;
}
}
}
return true;
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class RedisTest {
@Autowired
RedisService redisService;
@Test
public void test() {
redisService.set("loli1", "Mana");
redisService.set("loli2", "Alice");
redisService.set("loli3", "Cocoa");
for (String s : redisService.getVals("loli?")) {
System.out.println(s);
}
// Mana
// Alice
// Cocoa
}
}