`
zhousheng29
  • 浏览: 150838 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Redis测试分析(pipeline模式推荐)

阅读更多
测试环境
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.
4
2
分享到:
评论
2 楼 zhousheng29 2012-09-11  
可以做成字节流,如果你需要int,long的话. int 做成4字节, long8字节,可以转换的。
个数限制没有的,我做的有几个亿数据的,能做多少,看你的内存了。
1 楼 lvye351 2012-04-16  
<field, value> value只能是字符串,可通过encoding 设置其他类型么 如long型,甚至复合对象,jedis 好像不行,代码没找到。只能通过其他方式变通吗?自己做转换吗 ?
另外键值对个数限制有设置的,哪个资料里有说明?

相关推荐

    Redis测试Demo

    在"Redis测试Demo"中,我们将深入探讨如何利用Redis进行数据的读写操作,以及其在实际应用中的优势和常见用法。 首先,Redis的核心特性在于它的内存存储方式,这使得它在读写速度上远超传统的磁盘数据库。由于数据...

    redis 读写性能测试代码

    总之,理解Redis的写性能测试涉及多种因素,包括数据类型、操作模式、服务器配置等。通过精心设计的测试用例和有效的性能分析,我们可以评估和优化Redis的写入性能,确保在高并发场景下依然能保持高效稳定的服务。

    redis通过pipeline提升吞吐量的方法

    通过设置`usePipeline`为`true`,启用Pipeline模式。线程池配置(`JedisPoolConfig`)用于管理连接,确保有足够的资源处理并发任务。`DemoTask`类负责执行具体的键写入操作,通过Pipeline与否来对比性能差异。 5. **...

    redis 性能测试

    在Redis测试中,我们关注的主要指标有每秒操作数(OPS)、平均响应时间以及资源消耗(如CPU、内存)。 4. **性能测试方法**:常见的性能测试工具有Apache JMeter、YCSB等,但在这个场景下,我们使用的是自定义的...

    redis 性能测试(读写)

    - Jedis 提供了 `JedisCluster` 和 `JedisSentinelPool` 对于集群和哨兵模式的支持,测试时需考虑分布式环境下的性能。 - 使用 JMeter、Apache Bench 或自定义脚本,模拟大量并发请求,观察写入速度和响应时间。 ...

    tomcat-redis依赖jar包

    - 避免暴露在公网:Redis默认不推荐直接暴露在公网上,建议通过内网或代理服务器访问。 6. **监控与故障排查** - 监控Redis性能:使用Redis自带的监控命令,或者借助第三方工具如Grafana、Prometheus等进行监控。...

    redis工具包

    这些工具不仅简化了Redis的管理流程,还提供了数据可视化等功能,非常适合开发和测试环境使用。 #### 六、Redis插件和扩展介绍 Redis本身已经非常强大,但仍有许多插件和扩展进一步增强了它的功能。例如: - **...

    redis学习笔记。

    这只是 Redis 学习的基础,深入使用还需要掌握更多的高级特性和最佳实践,例如集群搭建、主从复制、Lua 脚本、Pipeline 使用等。随着对 Redis 的了解加深,你可以将其应用到更复杂的系统设计中,优化性能和提高系统...

    如何高效地向Redis插入大量的数据(推荐)

    本文将探讨如何高效地向Redis插入大量数据,重点介绍Redis的管道(Pipeline)模式以及其优势。 首先,我们了解为什么普通客户端直接插入数据效率不高。每个Redis命令发送后,需要等待服务器响应,这中间包含了网络...

    60道关于Redis的常见面试题.pdf

    - **定义**:Pipeline 允许客户端将多个命令打包发送给 Redis 服务器,然后一次性接收所有命令的结果。 - **提高性能**: - 减少了网络往返次数。 - 提高了客户端与服务器间的数据传输效率。 #### 12. 在使用 ...

    Redis基础学习之管道机制详析

    Redis管道(Pipeline)机制是Redis为了优化客户端与服务器之间的通信效率而设计的一种技术。传统的请求-响应模式下,客户端每发送一个命令,都需要等待服务器的响应,这种方式在处理大量连续命令时会导致显著的延迟...

    Redis面试知识点.pdf

    使用`ping`命令测试Redis服务器的响应情况,或者使用客户端工具连接Redis服务器进行测试。 #### 27、怎么理解Redis事务? Redis事务允许用户将一系列命令打包成一个整体,通过`MULTI`命令开始事务,然后执行多个...

    redis的阿里云Liunx包装包和配置文件

    在`redis.conf`中启用集群模式,并设置`cluster-enabled yes`。 2. 初始化集群:使用`redis-trib.rb`脚本初始化集群,分配槽位,连接各节点。 3. 添加节点:后期可以通过`CLUSTER ADDSLOTS`命令动态添加槽位,`...

    Redis学习笔记整理

    Redis支持发布订阅模式,允许开发者创建消息通道(channel)并通过`PUBLISH`命令向通道发送消息。订阅者则通过`SUBSCRIBE`命令订阅特定的通道,当有消息发送到该通道时,订阅者就能接收到消息。这种机制在构建实时消息...

    Redis高并发样例程序

    在样例程序中,可能包含如何配置Redis、编写客户端代码来模拟并发请求、如何测试和分析性能等内容。你可以通过样例学习如何在实际项目中有效地利用Redis处理高并发场景,以及如何调整Redis的配置参数以适应不同的...

    毕业设计+Python基于Scrapy+Redis分布式爬虫设计+源码案例+Python + Scrapy + redis

    1. **任务队列**:通过发布/订阅模式或List数据结构,Scrapy可以将待爬取的URL存入Redis,爬虫工人从中获取任务进行抓取。 2. **中间件通信**:Redis可以用作中间件,传递爬虫状态信息,例如爬取进度、错误信息等。 ...

    java大数据作业_8Redis、Thrift、Hadoop2

    需要注意的是,在生产环境中大量使用`KEYS`命令可能会导致Redis阻塞,建议在测试环境中使用或者采用其他方式如扫描命令`SCAN`来替代。 #### 4. Redis如何将key为a的hash中key为b对应的值加1 使用`HINCRBY`命令可以...

    Redis+模糊匹配+批量上传+Keys

    此时,可以借助`pipeline`或`multi`执行多条`DEL`命令,或者使用`redis-cli`的`--keys`选项结合`glob`或`regex`模式进行批量删除。对于Redis Cluster,由于数据分布在多个节点,删除操作也需要考虑跨节点的情况,...

Global site tag (gtag.js) - Google Analytics