天天看点

【SpringBoot+Redis】模糊查询接口

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