转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/141.html
一、请求应答协议和RTT:
Redis是一种典型的基于C/S模型的TCP服务器。在客户端与服务器的通讯过程中,通常都是客户端率先发起请求,服务器在接收到请求后执行相应的任务,最后再将获取的数据或处理结果以应答的方式发送给客户端。在此过程中,客户端都会以阻塞的方式等待服务器返回的结果。见如下命令序列:
代码如下:
Client: INCR X
Server: 1
Client: INCR X
Server: 2
Client: INCR X
Server: 3
Client: INCR X
Server: 4
在每一对请求与应答的过程中,我们都不得不承受网络传输所带来的额外开销。我们通常将这种开销称为RTT(Round Trip Time)。现在我们假设每一次请求与应答的RTT为250毫秒,而我们的服务器可以在一秒内处理100k的数据,可结果则是我们的服务器每秒至多处理4条请求。要想解决这一性能问题,我们该如何进行优化呢?
二、管线(pipelining):
Redis在很早的版本中就已经提供了对命令管线的支持。在给出具体解释之前,我们先将上面的同步应答方式的例子改造为基于命令管线的异步应答方式,这样可以让大家有一个更好的感性认识。
代码如下:
Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X#p#分页标题#e#
Server: 1
Server: 2
Server: 3
Server: 4
从以上示例可以看出,客户端在发送命令之后,不用立刻等待来自服务器的应答,而是可以继续发送后面的命令。在命令发送完毕后,再一次性的读取之前所有命令的应答。这样便节省了同步方式中RTT的开销。
最后需要说明的是,如果Redis服务器发现客户端的请求是基于管线的,那么服务器端在接受到请求并处理之后,会将每条命令的应答数据存入队列,之后再发送到客户端。
三、Benchmark:
以下是来自Redis官网的测试用例和测试结果。需要说明的是,该测试是基于loopback(127.0.0.1)的,因此RTT所占用的时间相对较少,如果是基于实际网络接口,那么管线机制所带来的性能提升就更为显著了。
代码如下:
require 'rubygems'
require 'redis'
def bench(descr)
start = Time.now
yield
puts "#{descr} #{Time.now-start} seconds"
end
def without_pipelining
r = Redis.new
10000.times {
r.ping
}
end
def with_pipelining
r = Redis.new
r.pipelined {
10000.times {
r.ping
}#p#分页标题#e#
}
end
bench("without pipelining") {
without_pipelining
}
bench("with pipelining") {
with_pipelining
}
//without pipelining 1.185238 seconds
//with pipelining 0.250783 seconds
分享到:
相关推荐
Redis 使用教程详解 Redis 是一个高性能的 NoSQL 键值存储数据库,广泛应用于缓存、任务列表、网站访问统计数据、过期处理、应用排行榜、分布式集群架构中的 session 分离等领域。下面是 Redis 的详细使用教程。 ...
《Redis深度历险:核心原理和应用实践》这本书是一本深入了解Redis数据库的宝贵资源,尤其在C++开发环境中具有很高的参考价值。Redis是一款高性能的键值存储系统,广泛应用于缓存、消息队列、计数器等多个场景。下面...
**Redis可视化工具RESP 2022.1.0.0 GUI详解** Redis,全名Remote Dictionary Server,是一款开源、高性能、支持网络、基于键值对的数据存储系统。在开发和运维过程中,为了方便地管理和操作Redis服务器,可视化工具...
《Redis深度历险:核心原理和应用实践》是一本由钱文品老师编著的专业书籍,旨在深入探讨Redis这一流行的数据存储系统的核心机制和实际应用场景。这本书不仅涵盖了Redis的基础知识,还深入到其高级特性和最佳实践,...
redis启动失败 zsh: command not found: redis-server
总结《Redis深度历险:核心原理和应用实践》的xmind图
redis集群安装配置需要用到的命令工具,在ruby环境下使用。欢迎下载使用
搜狐视频(sohu tv)Redis私有云平台 :支持Redis多种架构(Standalone、Sentinel、Cluster)高效管理、有效降低大规模redis运维成本,提升资源管控能力和利用率。平台提供快速搭建/迁移,运维管理,弹性伸缩,统计监控...
在使用redis集群时,发现过期key始终监听不到。网上也没有现成的解决方案。于是想,既然不能监听集群,那我可以建立多个redis连接,分别对每个redis的key过期进行监听。以上做法可能不尽人意,目前也没找到好的解决...
- 配置Redis Cluster需要至少三个独立的节点,并通过`redis-cli --cluster create`命令初始化集群。每个节点都需要运行`redis-server.exe`并配置相应的集群文件。 5. **其他实用工具**: - `redis-check-rdb.exe`...
本书深入浅出地介绍了Redis的5种数据类型,并通过多个实用示例展示了...第三部分对Redis用户经常会遇到的一些问题进行了介绍,讲解了降低Redis内存占用的方法、扩展Redis性能的方法以及使用Lua语言进行脚本编程的方法。
Redis 提供了丰富的命令来操作各种数据类型,并且支持灵活的服务器管理。掌握这些基本命令,能够帮助你更好地利用 Redis 来构建高性能的应用程序。此外,Redis 还提供了丰富的配置选项和扩展功能,如集群、持久化等...
本教程将详细讲解如何在Linux环境下安装Redis 2.6.14版本,并介绍一些基本的Redis命令。 首先,确保你的Linux系统已经安装了必要的编译工具,如GCC和Make。通常,你可以通过以下命令安装: ```bash sudo apt-get ...
redis2.8.6的安装过程和一些错误的解决,
在 `/usr/local/redis` 目录下创建 `bin`、`etc` 和 `db` 三个目录。将Redis的可执行文件移动到 `bin` 目录,配置文件放在 `etc` 目录,数据库文件存储在 `db` 目录。 创建配置文件 `redis.conf`,其中包含如下...
在本资源包中,包含的"redis视频"和"代码"应当是关于Redis的教程和实践示例,这对于学习和理解Redis的操作及应用非常有帮助。 Redis的基本概念: 1. 键值对(Key-Value):Redis的核心存储结构,键是唯一的标识,值...
本教程主要涵盖Redis的各种数据类型及其应用、分布式锁的实现、主从复制、持久化策略、哨兵模式以及如何应对Redis可能出现的雪崩和穿透问题。 1. Redis数据类型: - String:基本类型,支持设置、获取、自增、自减...
Redis 入门学习教程与面试经验总结 Redis 是一种开源的、基于内存的数据结构存储系统,可以用作数据库、消息中间件、缓存等。下面是 Redis 的一些基本概念和技术要点: 1. Redis 的基本数据结构:字符串、列表、...