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

问题描述 投票:2回答:2

我们使用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项目中使用

caching search spring-boot redis jedis
2个回答
1
投票

Redis列表实现为链接列表。

  • 因此,您将需要使用LRANGE获取列表的所有元素并迭代以查找特定元素。
  • 如果列表不包含多个条目且顺序不相关,我们可以使用LREM删除特定元素,如果列表大小存在差异,则该元素存在。之后,如果存在,则可以重新插入已删除的元素。 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 list操作。


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()]));

© www.soinside.com 2019 - 2024. All rights reserved.