redis模板有查询语言吗?

qyzbxkaa  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(387)

redis模板有查询语言吗?。假设我在redis缓存中有一个这样存储的列表:key value mylist->[1,2,3,4,5]
我想得到列表中符合特定条件的值。我们能用redis模板做这个吗?

hwamh0ep

hwamh0ep1#

您应该使用redis命令sort来填写需求。你可以参考这里。在spring中,使用sortquerybuilderMap此命令。mylist是redis中存储的[1,2,3,4,5]键。
定义模板bean

@Bean(name="myRedisTemplate")
    public RedisTemplate myRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        template.setKeySerializer(stringRedisSerializer);
        template.setValueSerializer(stringRedisSerializer);

        return template;
    }

在服务类中,这个bean是自动连线的

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.query.SortQuery;
import org.springframework.data.redis.core.query.SortQueryBuilder;
import org.springframework.data.redis.connection.SortParameters;

@Service
public class MyService{

       @Autowired
    private RedisTemplate myRedisTemplate;

      public void find(){

        // >=3
        SortQuery<String> sortQuery = SortQueryBuilder.sort("myList").order(SortParameters.Order.ASC).limit(2,-1).build();
        List<String> sortRslt = myRedisTemplate.sort(sortQuery);
        for(String s : sortRslt) {
            System.out.print(s+" ");
        }
        System.out.print("\n");

        // >3
        sortQuery = SortQueryBuilder.sort("myList").order(SortParameters.Order.ASC).limit(3,-1).build();
        sortRslt = myRedisTemplate.sort(sortQuery);
        for(String s : sortRslt) {
            System.out.print(s+" ");
        }
        System.out.print("\n");

        // >2 && < 5
        sortQuery = SortQueryBuilder.sort("myList").order(SortParameters.Order.ASC).limit(2,2).build();
        sortRslt = myRedisTemplate.sort(sortQuery);
        for(String s : sortRslt) {
            System.out.print(s+" ");
        }
        System.out.print("\n");
    }

如果是查询字符串,则应将数据类型从list更改为set。然后使用“sscan”命令和match pattern param来执行此操作。
例如,在名为myset的集合中有{'、'hello'、'follow'、'five'、'beijing'}。你想找到以f开头的字符串。

ScanOptions options = ScanOptions.scanOptions().match("f*").count(1).build();
        try (Cursor<String> cursor = myRedisTemplate.boundSetOps("mySet").scan(options)){
            while (cursor.hasNext()) {
                String value = cursor.next();
                System.out.println("value is " + value);
            }
        }catch(Exception ex){
        }

相关问题