关于 redis的 set 去重疑问

set 本质是hashmap,去重也就是hashmap的去重,hashcode 和equals方法。

那么问题来了,当存储到redis 中的时候 redis是怎么实现去重的呢

 

用不包含父类的方式来设置区别 

@Entity
@Table(name = "CarBrand")
@Data
//@EqualsAndHashCode(callSuper=true)
@AllArgsConstructor
@NoArgsConstructor
public class CarBrand extends BaseAdminWithoutIdEntity implements Comparable {

    private static final long serialVersionUID = -8981328316599991382L;
    @Column(columnDefinition = "varchar(20)  COMMENT '车厂商名'")
    private String name;
    @Column(columnDefinition = "TINYINT(1) DEFAULT '0' COMMENT '是否热门'")
    private Boolean isHot;

    @Column(columnDefinition = "INT(4) DEFAULT '9999' COMMENT '排序'")
    private Integer sort;

    @Column(columnDefinition = "char(1)  COMMENT '首字母'")
    private String letter;

    @Column(columnDefinition = "varchar(250)  COMMENT '图片地址'")
    private String url;

    public CarBrand(String name, String url, String id) {
        this.name = name;
        this.url = url;
        super.setId(id);
    }

    @Override
    public int compareTo(CarBrand o) {
        int i = this.getSort() - o.getSort();
        return i;
    }
}
CarBrand carBrand1 = new CarBrand();
carBrand1.setName("zym");
carBrand1.setId("13213");
CarBrand carBrand2 = new CarBrand();
carBrand2.setName("zym");
redisTemplate.opsForSet().add("zym",carBrand1);
redisTemplate.opsForSet().add("zym",carBrand2);
System.out.println(redisTemplate.opsForSet().members("zym"));

控制台打印

[CarBrand(name=zym, isHot=null, sort=null, letter=null, url=null)]

也就是说,members返回的东西是已经去重了的,跟set集合内容一样,但是在redis 中却显示了两条数据,如下图

关于 redis的 set 去重疑问_第1张图片

这就说明了数据是在取出来之后去重的了,追看 members方法源码,该方法给出了答案

	static > T deserializeValues(@Nullable Collection rawValues, Class type,
			@Nullable RedisSerializer redisSerializer) {
		// connection in pipeline/multi mode
		if (rawValues == null) {
			return (T) CollectionFactory.createCollection(type, 0);
		}

		Collection values = (List.class.isAssignableFrom(type) ? new ArrayList<>(rawValues.size())
				: new LinkedHashSet<>(rawValues.size()));
		for (byte[] bs : rawValues) {
			values.add(redisSerializer.deserialize(bs));
		}

		return (T) values;
	} 
  

我是不是很无聊。。。

你可能感兴趣的:(java,redis的,set,去重疑问)