redis学习笔记之pipeline
redis是一个cs模式的tcp server,使用和http类似的请求响应协议。一个client可以通过一个socket连接发起多个请求命令。每个请求命令发出后client通常 会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client。基本的通信过程如下
Client: INCR X
Server: 1
Client: INCR X
Server: 2
Client: INCR X
Server: 3
Client: INCR X
Server: 4
基 本上四个命令需要8个tcp报文才能完成。由于通信会有网络延迟,假如从client和server之间的包传输时间需要0.125秒。那么上面的四个命 令8个报文至少会需要1秒才能完成。这样即使redis每秒能处理100个命令,而我们的client也只能一秒钟发出四个命令。这显示没有充分利用 redis的处理能力。除了可以利用mget,mset 之类的单条命令处理多个key的命令外
我们还可以利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。通信过程如下
Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X
Server: 1
Server: 2
Server: 3
Server: 4
假 设不会因为tcp 报文过长而被拆分。可能两个tcp报文就能完成四条命令,client可以将四个incr命令放到一个tcp报文一起发送,server则可以将四条命令 的处理结果放到一个tcp报文返回。通过pipeline方式当有大批量的操作时候。我们可以节省很多原来浪费在网络延迟的时间。需要注意到是用 pipeline方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并是不是打 包的命令越多越好。具体多少合适需要根据具体情况测试。下面是个jredis客户端使用pipeline的测试
package jredisStudy;
import org.jredis.JRedis;
import org.jredis.connector.ConnectionSpec;
import org.jredis.ri.alphazero.JRedisClient;
import org.jredis.ri.alphazero.JRedisPipelineService;
import org.jredis.ri.alphazero.connection.DefaultConnectionSpec;
public class PipeLineTest {
public static void main(String[] args) {
long start = System.currentTimeMillis();
usePipeline();
long end = System.currentTimeMillis();
System.out.println(end-start);
start = System.currentTimeMillis();
withoutPipeline();
end = System.currentTimeMillis();
System.out.println(end-start);
}
private static void withoutPipeline()
{
try {
JRedis jredis = new JRedisClient("192.168.56.55",6379);
for(int i =0 ; i < 100000 ; i++)
{
jredis.incr("test2");
}
jredis.quit();
} catch (Exception e) {
}
}
private static void usePipeline() {
try {
ConnectionSpec spec = DefaultConnectionSpec.newSpec("192.168.56.55", 6379, 0, null);
JRedis jredis = new JRedisPipelineService(spec);
for(int i =0 ; i < 100000 ; i++)
{
jredis.incr("test2");
}
jredis.quit();
} catch (Exception e) {
}
}
}
输出
103408 //使用了pipeline
104598 //没有使用
测试结果不是很明显,这应该是跟我的测试环境有关。我是在自己win连接虚拟机的linux。网络延迟比较小。所以pipeline
优势不明显。如果网络延迟小的话,最好还是不用pipeline。除了增加复杂外,带来的性能提升不明显。
分享到:
相关推荐
一、 redis 环境搭建 2 二、 redis学习笔记之...五、 redis学习笔记之pipeline 20 六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记之主从复制 30 九、 redis学习笔记之虚拟内存 31
redis学习笔记整理 ...五、 redis学习笔记之pipeline 20 六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记之主从复制 30 九、 redis学习笔记之虚拟内存 31
Redis学习笔记 Redis是一个开源的基于键值对(Key-Value)NoSQL数据库,使用ANSI C语言编写、支持网络、基于内存但支持持久化。性能优秀,并提供多种语言的API。Redis可以被称为KV数据库,键值对数据库,内部存储...
这只是 Redis 学习的基础,深入使用还需要掌握更多的高级特性和最佳实践,例如集群搭建、主从复制、Lua 脚本、Pipeline 使用等。随着对 Redis 的了解加深,你可以将其应用到更复杂的系统设计中,优化性能和提高系统...
Redis 是一个高性能的键值数据库,它以数据结构服务器著称,支持多种数据类型,如字符串、列表、集合、...此外,Redis 还有许多高级特性,如 Lua 脚本、Geo 空间索引和 HyperLogLog 等,可以根据实际需求进一步学习。
4.pipeline 14 五.测试服务器 16 六.密码验证服务器 16 七.Log 16 八.DB数 17 九. Redis原理 17 1.数据结构 17 2.存储结构和存储格式 19 3.性能 20 4.网络IO模型 20 5.内存管理方面 20 6.数据一致性问题 20 7....
Pipeline 技术提高了客户端并发效率。由于其代码简洁,不依赖外部数据库,且采用单线程模型,Redis 在开发和使用上都非常简便。 为了提高可用性和扩展性,Redis 实现了主从复制,主服务器的数据可以实时同步到从...
Pipeline 提高了批量操作的效率,通过预发送多条命令,减少网络往返次数;发布订阅(Publish/Subscribe)功能实现了消息通信,使得不同客户端之间可以异步传递信息。 持久化方面,Redis 提供了 RDB(快照)和 AOF...
Redis 是一款高性能的键值数据库,...在学习 Redis 时,了解其数据类型、操作命令、持久化机制以及复制和发布订阅等功能是至关重要的。通过不断实践和探索,可以深入掌握 Redis 的精髓,并将其有效地应用到实际项目中。
在Redis的中级篇学习中,我们将深入探讨其核心特性、数据类型、持久化机制、集群搭建以及性能优化策略。 1. **核心特性**: - Redis支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set...
在学习Redis时,除了阅读文档和笔记,还可以参考官方文档、社区论坛、在线课程等资源,加深理解和掌握实际操作技能。同时,实践是检验理论的最好方式,可以通过搭建Redis环境,动手操作,解决实际问题来提升技能水平...
《狂神说Redis》是一份深入讲解Redis数据库的教程,主要源自B站上的一系列视频课程。Redis,全称为Remote Dictionary Server,是一...通过视频和配套的PDF笔记,你可以更深入地学习和掌握这个强大的内存数据存储系统。
笔记.zip包含了学习Redis6.2.1过程中整理的详细笔记,这些笔记涵盖了Redis的基本概念、数据类型(如字符串、哈希、列表、集合、有序集合)、持久化机制(RDB和AOF)、事务、复制、Sentinel哨兵系统、Cluster集群以及...
本笔记主要探讨 Redis 的基本命令,帮助 .NET 开发者更好地理解和使用 Redis。 1. **安装与启动** Redis 可在多种操作系统上运行,包括 Windows 和 Linux。在 Linux 上通常通过源码编译安装,Windows 用户可以下载...
本学习笔记旨在深入理解 Redis 的核心概念、特性和使用方法,并结合Java客户端进行实践操作。 一、Redis基本概念 1. 数据类型:Redis 支持五种主要的数据类型:字符串(String)、哈希(Hash)、列表(List)、集合(Set)...
具体事务和监听请参考文章:redis学习笔记之事务 暂时找到三种实现方式: 1. 通过jedis.setnx(key,value)实现 import java.util.Random; import org.apache.commons.pool.impl.GenericObjectPool.Config; import ...