SpringBoot中RedisTemplate的MGET性能测试及解决办法
项⽬中遇到了MGET获取10000+数据时超时的问题,然后到⽹友的测试结果如下(这⾥就不再重发测试代码,测试结果⼀致)
结论
⼀次操作10个key的性能达到⼀次操作1个key的88%
⼀次操作20个key的性能达到⼀次操作1个key的72%
⼀次操作50个key的性能达到⼀次操作1个key的59%
⼀次操作60个key的性能达到⼀次操作1个key的53%
⼀次操作80个key的性能达到⼀次操作1个key的43%
⼀次操作100个key的性能⼤道⼀次操作1个key的41%
⼀次操作200个key的性能只能达到⼀次操作1个key的25%,⼤约是⼀次处理100个key的60%
⼀次操作500个key的性能只能达到⼀次操作1个key的11%,⼤约是⼀次处理100个key的28%
⼀次操作800个key的性能只能达到⼀次操作1个key的7%,⼤约是⼀次处理100个key的17%
当key数⽬在10以内时,mget性能下降趋势⾮常⼩,性能基本上能达到redis实例的极限
当key数⽬在10~100之间时,mget性能下降明显,需要考虑redis性能衰减对系统吞吐的影响
当key数⽬在100以上时,mget性能下降幅度趋缓,此时redis性能已经较差,不建议使⽤在OLTP系统中,或者需要考虑其他⼿段来提升性能。
解决办法及测试结果(上代码看结果)
package cn.hs;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.st.context.SpringBootTest;
import org.RedisCallback;
import org.RedisTemplate;
import st.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.util.HashSet;
import java.util.Set;
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisGetTests {
private static final String TYPE_NAME = TypeName();
@Resource
private RedisTemplate<String, Object> redisTemplate;
@Test
public void contextLoads() {
Set<String> keySet = new HashSet<>();
for (int i = 0; i < 100000; i++) {
String key = TYPE_NAME + ":" + i;
keySet.add(key);
}
long time = System.currentTimeMillis();
multiGet(keySet);
System.out.println("redisTemplate.opsForValue().multiGet \t 耗时:" + (System.currentTimeMillis() - time));
//        排除,太慢了
//        time = System.currentTimeMillis();
//        getData(keySet);
springframework和springboot//        System.out.println("redisTemplate.opsForValue().get \t\t 耗时:" + (System.currentTimeMillis() - time));
// 推荐
time = System.currentTimeMillis();
getDataByPipelined(keySet);
System.out.println("utePipelined \t\t\t 耗时:" + (System.currentTimeMillis() - time));
}
private void multiGet(Set<String> keySet) {
redisTemplate.opsForValue().multiGet(keySet);
}
private void getData(Set<String> keySet) {
for (String key : keySet) {
redisTemplate.opsForValue().get(key);
}
}
private void getDataByPipelined(Set<String> keySet) {
<(Bytes(StandardCharsets.UTF_8));
}
return null;
});
}
}
输出结果
redisTemplate.opsForValue().multiGet      耗时:422
推荐⽅式
private void getDataByPipelined(Set<String> keySet) {
<(Bytes(StandardCharsets.UTF_8));
}
return null;
});
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。