如何在Redis缓存列表中按元素值进行搜索?

时间:2017-11-13 09:14:54

标签: caching search spring-boot redis jedis

我们正在使用redis缓存以及我们存储的数据样本类型

LLPUSH mylist "abc" "xyx" "awe" "wwqw"

现在我想从spring项目中搜索redis,例如我的spring项目类从一些外部客户端接收一个元素“abc”,如何按值搜索redis列表,如下所示

ListOperations<String, Object> listOperations= redisTemplate.opsForList();

listOperations.get(key,"abc") , returns abc

或至少我想确认此元素存在于redis缓存列表中

listOperations.contains(key,"abc")  returns either true or false , based value present in the list or not 

有人可以建议这种类型的客户端lib存在于java端的redis,我们可以在spring boot项目中使用

3 个答案:

答案 0 :(得分:1)

Redis列表实现为链接列表。

  • 因此,您必须使用LRANGE获取列表的所有元素并迭代才能找到特定元素。
  • 如果列表中不包含多个条目且订单不包含 相关的,我们可以使用LREM删除特定元素和if 列表大小存在差异,元素存在。后来了 如果存在,则可以重新插入已删除的元素。

    Long initialSize = redisTemplate.opsForList().size(key);
    redisTemplate.opsForList().remove(key,0, value);
    Long finalSize = redisTemplate.opsForList().size(key);
    if(finalSize - initialSize > 0){
        redisTemplate.opsForList().rightPush(key,value);
        return true;     //Element exists
    }
    return false;    //Does not exist
    

考虑进行操作atomic

您可以从here获取其他spring redis列表操作。

答案 1 :(得分:1)

您可以使用具有sismember(keyForSet,valueToSearch)的Redis Set按值搜索元素,其中O(1)复杂度是有效的,为了与redisTemplate一起使用,您可以使用redisTemplate.opsForSet.isMember(keyForSet,valueToSearch)

  

插入时可以插入列表   jedis.sadd(keyForSet,myList.toArray(new String [myList.size()]));    或者使用redisTemplate redisTemplate.opsForSet.add(keyForSet, myList.toArray(new String[myList.size()]));

答案 2 :(得分:-1)

您可以使用Redisson Redis客户端和基于Redis的List对象轻松完成此操作:

List<String> list = redisson.getList("myList");

list.add("aaa");
list.add("bbb");
list.add("ccc");

// returns true
list.contains("aaa");