Redis测试分析(pipeline模式)
来源:互联网 发布:linux lo网卡 编辑:程序博客网 时间:2024/05/20 14:24
测试环境
Redis测试版本:2.2.12
使用Java Jedis客户端进行测试
测试数据量:50万, 超过2亿
速度
1) mset函数插入效率最高,插入Redis的速度达到20万条数据/秒。但是该函数所耗内存较高,对于我们实际应用一表每天2.4亿的数据量来说,需要消耗近32G内存;
2) mset函数中当m值达到200以上时,插入速度接近饱和,因此实际应用中,应设定该值 >= 200,以达到最高的插入效率;
3) set函数除非特定应用场景需求,否则应尽量不要使用,其插入效率为mset函数的1/20;
4) 尽管不同的函数都有string与byte[]两种不同的形式,但是对于Redis来说byte[]的形式也是将每个byte看成是一个字符来进行处理的。在实际应用中,对于较长的整型数据(例如:9824224123),可以将其转换为byte[]的形式,4个byte[]可以存储一个int数据,这样会比采用string的形式存储节省一部分的内存开销;
5) hset函数插入效率与set函数相当;
6) hmset由于在实际应用中,每条数据对应的key不相同,需要维护一个本机的缓存容器Map<key,Map<field, value>>,因此插入速度要比mset函数慢一些;
内存
1) hset和 hmset函数大约可以比set和mset函数节省三分之一的内存;
2) hset和hmset函数对于每个key所存储的<field, value>数目非常敏感。一旦超过限制,插入效率下降十分明显,同样,内存开销也会显著增加。在实际应用中,应尽量保证每个key下面的<field, value>的数目不超过限制(默认值为64)。
Pipeline
redis的pipeline(管道)功能在命令行中没有,但redis是支持pipeline的,而且在各个语言版的client中都有相应的实现。
Redis本身是一个cs模式的tcp server, client可以通过一个socket连续发起多个请求命令。 每个请求命令发出后client通常会阻塞并等待redis服务端处理,redis服务端处理完后将结果返回给client。
这种发送模式中由于网络开销延迟,即算redis server端有很强的处理能力,也由于收到的client消息少,而造成吞吐量小。我们可以修改一种处理模式,
通过pipeline方式将client端命令一起发出,redis server会处理完多条命令后,将结果一起打包返回client,从而节省大量的网络延迟开销。
下面以Java的客户端jedis来测试pipeline的效果。
测试的结果采用pipeline方式,效率几乎与mset一样,每秒插入约15万数据,但内存占用仅为mset的1/3.
Redis测试版本:2.2.12
使用Java Jedis客户端进行测试
测试数据量:50万, 超过2亿
速度
1) mset函数插入效率最高,插入Redis的速度达到20万条数据/秒。但是该函数所耗内存较高,对于我们实际应用一表每天2.4亿的数据量来说,需要消耗近32G内存;
2) mset函数中当m值达到200以上时,插入速度接近饱和,因此实际应用中,应设定该值 >= 200,以达到最高的插入效率;
3) set函数除非特定应用场景需求,否则应尽量不要使用,其插入效率为mset函数的1/20;
4) 尽管不同的函数都有string与byte[]两种不同的形式,但是对于Redis来说byte[]的形式也是将每个byte看成是一个字符来进行处理的。在实际应用中,对于较长的整型数据(例如:9824224123),可以将其转换为byte[]的形式,4个byte[]可以存储一个int数据,这样会比采用string的形式存储节省一部分的内存开销;
5) hset函数插入效率与set函数相当;
6) hmset由于在实际应用中,每条数据对应的key不相同,需要维护一个本机的缓存容器Map<key,Map<field, value>>,因此插入速度要比mset函数慢一些;
内存
1) hset和 hmset函数大约可以比set和mset函数节省三分之一的内存;
2) hset和hmset函数对于每个key所存储的<field, value>数目非常敏感。一旦超过限制,插入效率下降十分明显,同样,内存开销也会显著增加。在实际应用中,应尽量保证每个key下面的<field, value>的数目不超过限制(默认值为64)。
Pipeline
redis的pipeline(管道)功能在命令行中没有,但redis是支持pipeline的,而且在各个语言版的client中都有相应的实现。
Redis本身是一个cs模式的tcp server, client可以通过一个socket连续发起多个请求命令。 每个请求命令发出后client通常会阻塞并等待redis服务端处理,redis服务端处理完后将结果返回给client。
- Client: hset a1 field value
- Server: 1
- Client: hset a2 field value
- Server: 1
- Client: hset a3 field value
- Server: 1
- Client: hset a4 field value
- Server: 1
这种发送模式中由于网络开销延迟,即算redis server端有很强的处理能力,也由于收到的client消息少,而造成吞吐量小。我们可以修改一种处理模式,
- Client: hset a1 field value
- Client: hset a2 field value
- Client: hset a3 field value
- Client: hset a4 field value
- Server: 1
- Server: 1
- Server: 1
- Server: 1
通过pipeline方式将client端命令一起发出,redis server会处理完多条命令后,将结果一起打包返回client,从而节省大量的网络延迟开销。
下面以Java的客户端jedis来测试pipeline的效果。
- Pipeline pipeline = jedis.pipelined();
- long start = System.currentTimeMillis();
- for (int i = 0; i < 10000; i++) {
- pipeline.hset("server", "" + i, "" + i);
- }
- List<Object> results = pipeline.execute();
- long end = System.currentTimeMillis();
- System.out.println("Pipelined SET: " + ((end - start)/1000.0) + " seconds");
测试的结果采用pipeline方式,效率几乎与mset一样,每秒插入约15万数据,但内存占用仅为mset的1/3.
0 0
- Redis测试分析(pipeline模式)
- Redis测试分析(pipeline模式推荐)
- Redis测试分析(pipeline模式推荐)
- Redis测试分析(pipeline模式推荐)
- Redis测试分析(pipeline模式推荐)
- Redis测试分析(pipeline模式推荐)
- redis的pipeline测试分析
- redis中的pipeline模式
- Redis测试_推荐pipeline
- Redis pipeline
- redis pipeline
- redis pipeline
- Redis-pipeline
- pipeline模式
- Pipeline模式
- redis集群客户端JedisCluster优化 - 管道(pipeline)模式支持
- redis集群客户端JedisCluster优化 - 管道(pipeline)模式支持
- redis-cluster官方集群模式下使用pipeline批量操作
- C++ 类的static成员
- CSS有4种定义方式--类+ ID+ 标签+ 伪类
- 音视频开发需要的一些工具总结
- Linear Programming Learning Notes (3) Degeneracy
- windows svn命令行客户端
- Redis测试分析(pipeline模式)
- 棋牌游戏服务器架构: 详细设计(三) 数据库设计
- 第八周上机实践项目-项目三-指向学生类的指针
- iOS: ARC和非ARC下使用Block属性的问题
- PCA方法的应用场景
- jexl表达式应用
- Unity3D Terrain Settings 彻底搞懂 地形详细设置 全实验与解析 (二)base map dist
- 关于产品 和互联网产品
- SQLyog管理Mysql数据库