我面临一个非常奇怪的问题:使用 Redis 时,我的写入速度非常糟糕(在理想的情况下,写入速度应该接近 RAM 上的写入速度)。
这是我的基准:
package redisbenchmark;
import redis.clients.jedis.Jedis;
public class RedisBenchmark {
private static final String REDIS_KEY = "anon_id";
private Jedis conn;
private long writeTimeNano=0;
private RandomString stringGenerator;
private String[] fields;
public RedisBenchmark(){
conn = new Jedis("localhost");
stringGenerator = new RandomString(32);
}
public void run(int nbWrites, int nbReads){
writeBenchmark(nbWrites);
}
public void writeBenchmark(int amount){
fields = new String[amount];
for(int i=0; i< amount; i++){
fields[i] = stringGenerator.nextString();
}
long start = System.nanoTime();
for(int i=0; i< amount; i++){
write(fields[i]);
}
writeTimeNano+=System.nanoTime()-start;
double seconds = (double)writeTimeNano / 1000000000.0;
System.out.println("[write]nb:"+amount+"|time:"+seconds+"|speed:"+((amount*33)/(seconds*1024*1024))+" MB/s");
}
public void write(String anonId){
conn.hsetnx(REDIS_KEY, anonId, "1");
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
RedisBenchmark benchmark = new RedisBenchmark();
benchmark.run(100000, 200);
}
}
RandomString
是一个生成随机字符串的类(arg是字符串长度)
以下是一些结果:
[写入]nb:100000|时间:4.408319378|速度:0.713905907055318 MB/s
[写入]nb:100000|时间:4.447246995|速度:0.707656949946542 MB/s
我尝试修改配置文件中的保存到硬盘参数,但没有任何改善。
我有两个想法:
1.这是一个套接字问题,因为客户端和服务器(redis)在同一台机器上
2.连接器实现存在性能问题
UPDATE集合运算的基准结果:
======设置======
0.09 秒内完成 10000 个请求
50 个并行客户端
3字节有效负载
保持存活:1
99.51% 100.00% 每秒 111111.11 个请求
系统规格:
- 乌班图11.04
- 8GB 内存
- 英特尔 i5 处理器
任何建议将不胜感激。
您需要更多地考虑使用该程序真正进行的基准测试。我可以告诉你,这不是 Redis,而是你的系统在两个进程之间运行乒乓球游戏的能力(因为你所有的 hsetnx 调用都是同步的)。
请阅读这一页 http://redis.io/topics/benchmarks在尝试对 Redis 进行基准测试之前,它肯定会对您有所帮助。
您认为 Redis 的速度应该接近 RAM 的写入速度的假设有点天真。 Redis 是一个remote对于 O(1) 操作,大部分开销是由于通信成本造成的。对于同步流量(如您的示例),这也是由于操作系统调度程序的成本造成的。
如果你想按顺序应用很多命令,你需要使用流水线 http://redis.io/topics/pipelining。或者,如果您不关心顺序,则可以同时使用多个连接(这是 redis-benchmark 的默认模式)。或者您可以尝试发送异步命令。在所有情况下,想法都是分摊到 Redis 服务器的往返成本
通过在具有异步流量的多个连接上进行管道化,您将获得 Redis 在这台机器上可以实现的最大吞吐量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)