当前位置:网站首页>Redis管道技术/分区
Redis管道技术/分区
2022-07-31 05:09:00 【黎燃(主号)】
Redis管道技术
Redis是一种基于客户机-服务器模型和请求/响应协议的TCP服务。这意味着请求通常将遵循以下步骤:
客户端向服务器发送查询请求,并侦听套接字返回,通常处于阻塞模式,等待服务器响应。
服务器处理该命令并将结果返回给客户端。
Redis管道技术允许客户端在服务器没有响应时继续向服务器发送请求,最后一次读取所有服务器的响应。
实例
要查看redis管道,只需启动redis实例并输入以下命令:
$(echo -en "PING\r\n SET runoobkey redis\r\nGET runoobkey\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379
+PONG
+OK
redis
:1
:2
:3
在上面的示例中,我们使用ping命令检查redis服务是否可用。然后我们将runoobkey的值设置为redis,然后我们得到runoobkey的值,并使访问者自动增加三倍。
在返回的结果中,我们可以看到这些命令一次提交到redis服务,最后一次读取所有服务器的响应
管道技术最显著的优势是提高redis服务的性能。
一些测试数据
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
}
在接下来的测试中,我们将使用redis的Ruby客户端来支持流水线技术的特性,并测试流水线技术的提速效果。
在局域网中的Mac OS X系统上执行的上述简单脚本的数据表明,在开启管道操作后,往返延迟已显著改善。
Redis
分区是将数据划分为多个redis实例的过程,因此每个实例只保存密钥的子集。
分区的优势
通过使用多台计算机的内存总和,我们可以构建一个更大的数据库。
通过多核和多台计算机,我们可以扩展我们的计算能力;通过多台计算机和网络适配器,我们可以扩展网络带宽。
分区不足
redis的一些功能在分区方面表现不佳:
通常不支持涉及多个键的操作。例如,当两个集合映射到不同的redis实例时,您无法对这两个集合执行交集操作。
不能使用涉及多个密钥的Redis事务。
使用分区时,数据处理更加复杂。例如,您需要处理多个rdb/aof文件,并备份来自多个实例和主机的持久文件。
添加或删除容量也很复杂。大多数redis集群支持在运行时添加和删除节点的透明数据平衡,但其他系统(如客户端分区和代理)不支持此功能。然而,一种叫做预硬化的技术是有帮助的。
分区类型
Redis有两种类型的分区。假设有四个redis实例R0、R1、R2、R3和多个键代表用户,例如user:1和user:2。对于给定的键,有许多不同的方法来选择该键存储在哪个实例中。换句话说,有不同的系统将密钥映射到redis服务。
范围分区
最简单的分区方法是按范围,即将特定范围内的对象映射到特定的redis实例。
例如,ID为0到10000的用户将保存到实例R0,ID为10001到20000的用户将保存到R1,依此类推。
该方法是可行的,可以在实践中使用。缺点是有一个从区间范围到实例的映射表。此表需要管理。同时,它还需要各种对象的映射表,这通常不是redis的好方法。
哈希分区
另一种分区方法是哈希分区。这适用于任何键,并且不需要是对象名称:该形式与以下描述一样简单:
使用哈希函数将密钥转换为数字,例如,使用CRC32哈希函数。在键foobar上执行CRC32(foobar)将输出一个类似于93024922的整数。
取这个整数的模并将其转换为0到3之间的数字,然后这个整数可以映射到四个redis实例之一。93024922%4=2,这意味着键foobar应该保存在R2实例中。注:模运算是除法的余数,在许多编程语言中通常由%运算符实现。
边栏推荐
- 数据库上机实验2 单表查询和嵌套查询
- matlab simulink欠驱动水面船舶航迹自抗扰控制研究
- 【JS面试题】面试官:“[1,2,3].map(parseInt)“ 输出结果是什么?答上来就算你通过面试
- 为什么要用Flink,怎么入门使用Flink?
- 【C语言趣味小游戏——猜数字】
- ES source code API call link source code analysis
- Minio upload file ssl certificate is not trusted
- Flink sink ES 写入 ES(带密码)
- 剑指offer基础版 ---- 第27天
- Unity resources management series: Unity framework how to resource management
猜你喜欢
随机推荐
数据库上机实验6 数据库完整性
分布式事务——分布式事务简介、分布式事务框架 Seata(AT模式、Tcc模式、Tcc Vs AT)、分布式事务—MQ
Pytorch教程Introduction中的神经网络实现示例
C语言如何分辨大小端
数据库上机实验1 数据库定义语言
Proteus 8 Professional安装教程
如何将项目部署到服务器上(全套教程)
With MVC, why DDD?
限流的原理
工作流编排引擎-Temporal
剑指offer基础版 --- 第21天
剑指offer专项突击版 --- 第 4 天
关于LocalDateTime的全局返回时间带“T“的时间格式处理
Object Detection Study Notes
tf.keras.utils.get_file()
On-line monitoring system for urban waterlogging and water accumulation in bridges and tunnels
【一起学Rust】Rust的Hello Rust详细解析
ES source code API call link source code analysis
Temporal线上部署
Sword Point Offer Special Assault Edition ---- Day 2









