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
}
}