当前位置: 代码迷 >> 综合 >> Redis:关于 redisTemplate.opsForSet().members(key)获取不了全部数据问题
  详细解决方案

Redis:关于 redisTemplate.opsForSet().members(key)获取不了全部数据问题

热度:91   发布时间:2024-01-09 12:33:32.0

问题描述

今天遇到一个很神奇的问题,我使用redisTemplate.opsForSet().members(key)获取得到的结果,居然只有仅仅的一个。然而,我使用redisTemplate.opsForSet().size(key)得到的结果却比1要大,如我这里的是16.

问题分析

出于好奇,于是我就直接使用 redisTemplate.opsForSet().add(key2, values);来添加一系列的数据,如

 		for (int i = 10; i < 20; i++) {redisService.sAdd(String.class, "a", i + "");}List<String> set = redisService.smembers(String.class, "a");System.out.println(JSONUtil.toJsonStr(set));

然鹅,这里居然得到一个正确的答案!!确实是全部数据都找出来了!!所以可以确定,这个API肯定是没有问题的!!
于是,我决定慢慢的debug进去,这里肯定有我自己所忽略掉的东西!

接着,我在这方法里面,发现的神奇的东西
在这里插入图片描述
就是我得到的rawValues长度明明不是1(而是16),但是结果只有1个。
那么,问题就产生在 Set deserializeValues(Set<byte[]> rawValues)了

问题发现

在这里插入图片描述
所以,现在问题就明朗了,是这里的set把我们的结果给过滤掉了~简单点来说就是,我们的所有object返回的equals结果都是一致的 所以才导致set“帮”我们把结果都过滤掉了。

解决方案

那么 这就简单了,因为我们调用的时候,add进去的是一个object,而我们的object没有重写equals方法,那么我们就重写一下就好了。
例如我的是用id判断是否同一个obj,代码如下

    public boolean equals(Object e) {if (!(e instanceof MyData)) {return false;}return ((MyData) e).getId() == getId();}

运行验证

修改后,重新跑一遍~ 完美,就是这个原因(小松一口气,还以为我写的框架有问题呢~)