redis 常见用法之保存
在java项目很多人都喜欢用spring-boot-starter-data-redis下的StringRedisTemplate操作redis,大多项目也用作为缓存,他们最常见的保存key value代码,如下:
stringRedisTemplate.opsForValue().set(key, value);
大家都知道redis上面的代码执行保存是同步的,速度并不是想像中的快。请看以下的测试:
redis测试环境
直连线上真实环境redis数据库
redis当前版本及状态如下图:
1 测试1000条数据更新测试:
同步是花了60.783秒,而使用异步时0.003秒,如下图:
2 测试10000条数据更新测试:
同步是花了663.915秒,而使用异步时0.005秒,如下图:
从上面的测试结果可以看得出,redis同步与异步保存差距是多么的大。某些合适的环境可以建议使用异步保存,也算是提升项目整体性能一个技巧。
测试代码
@Test
public void testRedis() {
long start= System.currentTimeMillis();
System.out.println("test redis -----------begin");
for(int i=0;i<10000;i++){
redisService.set("test_key1","aa"+i);
}
System.out.println("test redis-----------end");
long end= System.currentTimeMillis()-start;
System.out.println("time = "+end);
start= System.currentTimeMillis();
System.out.println("test redis async-----------begin");
for(int i=0;i<1000;i++){
redisService.asyncSet("test_key1","aa"+i);
}
System.out.println("test redis async-----------end");
end= System.currentTimeMillis()-start;
System.out.println("async time = "+end);
}
//同步更新
public void set(String key, String value) {
stringRedisTemplate.opsForValue().set(key, value);
}
//异步更新
public CompletableFuture<Void> asyncSet(String key, String value) {
return CompletableFuture.supplyAsync(() -> {
stringRedisTemplate.execute((RedisCallback<Object>) connection -> {
connection.set(key.getBytes(), value.getBytes());
return null;
});
return null;
});
}