这两天有用到srandmember作数据打底

	redisTemplate.randomMembers("key",50);

期望50个,结果返回50个,中间出现重复,去重后只有40多,不满足需求。
查了下redis文档和相关文章。
redis srandmember:

commandSince versiondescription
srandmember key1.0.0随机从有序集合中获取一个元素
srandmember key [count]2.6.0随机从有序集合中获取count个元素, count为正值返回count个不重复元素, count为负值,返回abs(count)个可重复元素

看了下spring 这方法的源码:

	/*
	 * (non-Javadoc)
	 * @see org.springframework.data.redis.core.SetOperations#randomMembers(java.lang.Object, long)
	 */
	@Override
	public List<V> randomMembers(K key, long count) {

		Assert.isTrue(count >= 0,
				"Use a positive number for count. " + "This method is already allowing duplicate elements.");

		byte[] rawKey = rawKey(key);
		List<byte[]> rawValues = execute(connection -> connection.sRandMember(rawKey, -count), true);

		return deserializeValues(rawValues);
	}

好吧,spring封装这个方法是直接奔可重复去的,于是……我改成这样

	redisTemplate.randomMembers("key", -50);

运行一下,good:

java.lang.IllegalArgumentException: Use a positive number for count. This method is already allowing duplicate elements.

怪我不看源码,上面明明写了Assert。

然后再瞅了瞅,原来spring封装的时候是把这个功能按照意义分开的,还有一个方法是: distinctRandomMembers, 改成这样:

	redisTemplate.distinctRandomMembers("key", 50);

就不再返回重复元素了,问题解决。(撒花)

打赏
支付宝 微信
上一篇 下一篇