`

redis之管道技术 & 分区

阅读更多
Redis 管道技术
Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:
客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
服务端处理命令,并将结果返回给客户端。
Redis 管道技术
Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。
实例
查看 redis 管道,只需要启动 redis 实例并输入以下命令:
$(echo -en "PING\r\n SET w3ckey redis\r\nGET w3ckey\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379

+PONG
+OK
redis
:1
:2
:3
以上实例中我们通过使用 PING 命令查看redis服务是否可用, 之后我们们设置了 w3ckey 的值为 redis,然后我们获取 w3ckey 的值并使得 visitor 自增 3 次。
在返回的结果中我们可以看到这些命令一次性向 redis 服务提交,并最终一次性读取所有服务端的响应
管道技术的优势
管道技术最显著的优势是提高了 redis 服务的性能。
一些测试数据
在下面的测试中,我们将使用Redis的Ruby客户端,支持管道技术特性,测试管道技术对速度的提升效果。
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
}
}
end
bench("without pipelining") {
without_pipelining
}
bench("with pipelining") {
with_pipelining
}
从处于局域网中的Mac OS X系统上执行上面这个简单脚本的数据表明,开启了管道操作后,往返时延已经被改善得相当低了。
without pipelining 1.185238 seconds
with pipelining 0.250783 seconds
如你所见,开启管道后,我们的速度效率提升了5倍。






Redis 分区

分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集。
分区的优势
通过利用多台计算机内存的和值,允许我们构造更大的数据库。
通过多核和多台计算机,允许我们扩展计算能力;通过多台计算机和网络适配器,允许我们扩展网络带宽。
分区的不足
redis的一些特性在分区方面表现的不是很好:
涉及多个key的操作通常是不被支持的。举例来说,当两个set映射到不同的redis实例上时,你就不能对这两个set执行交集操作。
涉及多个key的redis事务不能使用。
当使用分区时,数据处理较为复杂,比如你需要处理多个rdb/aof文件,并且从多个实例和主机备份持久化文件。
增加或删除容量也比较复杂。redis集群大多数支持在运行时增加、删除节点的透明数据平衡的能力,但是类似于客户端分区、代理等其他系统则不支持这项特性。然而,一种叫做presharding的技术对此是有帮助的。
分区类型
Redis 有两种类型分区。 假设有4个Redis实例 R0,R1,R2,R3,和类似user:1,user:2这样的表示用户的多个key,对既定的key有多种不同方式来选择这个key存放在哪个实例中。也就是说,有不同的系统来映射某个key到某个Redis服务。
范围分区
最简单的分区方式是按范围分区,就是映射一定范围的对象到特定的Redis实例。
比如,ID从0到10000的用户会保存到实例R0,ID从10001到 20000的用户会保存到R1,以此类推。
这种方式是可行的,并且在实际中使用,不足就是要有一个区间范围到实例的映射表。这个表要被管理,同时还需要各 种对象的映射表,通常对Redis来说并非是好的方法。
哈希分区
另外一种分区方法是hash分区。这对任何key都适用,也无需是object_name:这种形式,像下面描述的一样简单:
用一个hash函数将key转换为一个数字,比如使用crc32 hash函数。对key foobar执行crc32(foobar)会输出类似93024922的整数。
对这个整数取模,将其转化为0-3之间的数字,就可以将这个整数映射到4个Redis实例中的一个了。93024922 % 4 = 2,就是说key foobar应该被存到R2实例中。注意:取模操作是取除的余数,通常在多种编程语言中用%操作符实现。

分享到:
评论

相关推荐

    redis && kafka搭建

    在IT行业中,Redis和Kafka是两种非常重要的开源软件,分别作为内存数据存储和消息中间件服务于各种系统架构。本文将详细介绍如何搭建Redis和Kafka环境,并探讨它们各自的核心特性和应用场景。 首先,我们来了解...

    Redis实战_Redis实战中文完整版_Redis快速入门_Redis数据类型及操作_Redis常用

    6. **Redis集群**:当单机Redis无法满足需求时,可以搭建Redis Cluster集群,实现数据分区和负载均衡。集群的搭建、数据分布、故障处理等都是集群部分的重点。 7. **Redis在缓存中的应用**:Redis作为缓存,能有效...

    RedisDesktopManager

    4. **集群搭建**:使用 Redis Cluster 实现数据分区,提高系统的扩展性和容错性。 ### 结语 RedisDesktopManager 作为一款强大的 Redis GUI 工具,极大地简化了 Redis 的日常管理任务。无论是开发者还是运维人员,...

    redis使用中文参考手册

    Redis Cluster是Redis的分布式解决方案,可以将数据分布在多个节点上,提供自动的数据分区和故障恢复。手册将详述如何搭建和管理Redis Cluster,包括槽(Slots)的概念和节点间通信。 七、安全与性能优化 Redis的...

    spring data redis 官方文档

    - **操作 Redis Cluster Connection**:提供了专门的方法来操作集群连接,包括节点发现、数据分区等功能。 - **模板和集群操作**:利用 `RedisTemplate` 类和集群操作方法,可以在集群环境中执行复杂的 CRUD 操作。 ...

    Redis有win和linux版本

    3. **集群**:Redis Cluster是Redis的官方集群解决方案,可实现数据分区和故障转移,适合大规模部署。 4. **内存管理**:由于Redis完全驻留在内存中,因此需要关注内存使用情况,避免内存溢出。 5. **安全**:虽然...

    redis 完整版教程(公司内部请某培训机构的教程)

    - **管道技术(Pipelining)**:批量发送多条命令减少通信开销。 - **分区(Partitioning)**:实现大规模数据的分布式存储。 #### 七、Redis在不同开发环境的应用 - **Java使用Redis**:通过Jedis、Lettuce等...

    Spring Data Redis中文参考文档

    - 支持Redis的管道功能,可以批量执行命令以提高性能。 8. **脚本执行**: - 支持编写和执行Lua脚本以实现复杂逻辑。 9. **支持类**: - 提供了一些辅助类来简化特定任务的操作。 #### 七、响应式Redis支持 1...

    stormbroken#Class-Notes#Redis 连接1

    1. Redis客户端的基本语法 2. 测试客户端的连通情况 3. 连接远程的redis服务 5. 管道技术 6. 分区技术 1. Redis客户端的基本语法

    Kafka+redis全解.pdf

    7. Kafka与Redis的集成:如何将Redis作为Kafka的消费者,或者在Kafka和Redis之间构建数据管道,实现数据的高效流转。 对于Java和大数据开发人员来说,理解和掌握Kafka和Redis是非常有价值的。Kafka可以帮助实现大...

    Redis面试题.pdf

    - **使用管道(Pipeline)技术**:批量发送命令,减少网络开销。 - **启用压缩**:对于大型数据对象启用压缩。 - **优化持久化策略**:合理配置持久化策略,平衡数据安全性和性能。 #### 23. Redis的缓存更新...

    Java面试题redis部分.docx

    缺点是只能使用0号数据库,且不支持管道技术。 - **基于客户端分片**:客户端根据算法计算key归属的节点,易于扩展,但需要修改客户端代码。 - **基于代理分片**:如 Codis、Twemproxy,代理服务器负责数据路由,...

    ### 这是一篇对Redis开发详细介绍的文

    ### Redis开发详细介绍 ...通过深入学习Redis的开发技术,开发者不仅能够构建出高性能、可扩展的应用程序,还能够显著提升自身的专业技能。希望本文能够为读者提供有益的指导,助力大家在Redis开发领域取得更多成就。

    NoSQL Redis and MongoDB - Matteo Nardelli

    - **资源管理**:在资源管理方面,Redis 和 MongoDB 都提供了自动分区、数据备份与恢复等功能,以保证系统的稳定运行。 #### 结论 综上所述,Redis 和 MongoDB 作为两种流行的NoSQL 数据库,在不同的应用场景中...

    基础服务:redis + Elasticsearch + kafka + mysql + mongodb

    Kafka将数据以主题(Topic)的形式保存,并且每个主题都有多个分区(Partition),保证了并行处理能力。Kafka的高吞吐量和持久化机制使得它在大数据传输和日志收集领域非常受欢迎。 **MySQL** MySQL是一种关系型...

    java 大数据 spark flink redis hive hbase kafka 面试题 数据结构 算法 设计模式.zip

    3. **Redis**: Redis是一个高性能的键值存储系统,常用于缓存和消息队列。了解其数据类型(如String、Hash、List、Set、Sorted Set),以及发布/订阅、事务和持久化机制。 4. **Kafka**: Kafka是一个高吞吐量的...

    基于 Springboot + Redis + Kafka 的秒杀系统,乐观锁 + 缓存 + 限流 + 异步

    总结,这个基于 Springboot、Redis 和 Kafka 的秒杀系统,通过集成多种技术手段,实现了高效、稳定的秒杀功能。乐观锁保证了数据一致性,Redis 缓存减轻了数据库压力,Kafka 实现了异步处理和限流,整体设计考虑了高...

    Redis框架Jedis及Redisson对比解析

    Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。 ### 编程模型 Jedis中的方法调用是比较底层的暴露的Redis的API,也即...

Global site tag (gtag.js) - Google Analytics