天天看點

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