Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤 :
客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应;
服务端处理命令,并将结果返回给客户端。
Redis管道技术
Redis管道允许技术客户端可以在服务端响应前持续向服务端发送请求,并最终一次性读取所有服务端的响应。
操作如下:
INCR visitor 将键 visitor
的值增加 1;此操作执行三次。
以上首先通过PING命令查看我们的redis服务是否可用,然后设置w3key的值为redis,然后获取w3key的值并使其自增三次。在得到的结果中我们可以看到这些命令一次性向 redis 服务提交,并最终一次性读取所有服务端的响应。
管道技术的优势
管道技术大幅提高了redis服务的性能,Redis管道技术的主要优势是能够减少客户端与Redis服务器之间的通信次数,从而提高数据处理的效率和速度。通过批量发送多个命令而不需要等待每个命令的响应,管道技术可以显著减少网络延迟,提高吞吐量。
Redis分区
Redis分区的优势
Redis分区(或称为Redis分片)主要是为了提升Redis的扩展性和性能,特别是在处理大量数据或高负载时。
通过利用多台计算机内存的和值,允许我们构造更大的数据库。
通过多核和多台计算机,允许我们扩展计算能力;通过多台计算机和网络适配器,允许我们扩展网络带宽。
Redis分区的不足
不支持涉及到多个key的操作,不支持涉及到多个key的事务,例如当两个set映射到不同的redis实例上时,你就不能对这两个set执行交集操作。
使用分区时数据的处理会比较复杂,例如需要处理多个rbd/aof文件,并且要从多个实例和主机中备份持久化文件。
增加或删除容量也比较复杂。redis集群大多数支持在运行时增加、删除节点的透明数据平衡的能力,但是类似于客户端分区、代理等其他系统则不支持这项特性。
分区类型
Redis有两种分区类型。 假设有4个Redis实例 R0,R1,R2,R3,和类似user:1,user:2这样的表示用户的多个key,对既定的key有多种不同方式来选择这个key存放在哪个实例中。也就是说,有不同的系统来映射某个key到某个Redis服务。
范围分区
最简单的分区方式,即映射一定范围的对象到redis实例。例如,可以将键按照字典序分成不同的区间。范围分区适用于具有连续键值的场景,如时间序列数据。
哈希分区
使用哈希函数将键映射到不同的分区。每个键的哈希值决定了它存储在哪个分区中。这是Redis集群模式的默认分区策略,能够均匀地分配数据。用一个hash函数将key转换为一个数字,比如使用crc32 hash函数。对key foobar执行crc32(foobar)会输出类似93024922的整数。对这个整数取模,将其转化为0-3之间的数字,就可以将这个整数映射到4个Redis实例中的一个了。93024922 % 4 = 2,就是说key foobar应该被存到R2实例中。注意:取模操作是取除的余数,通常在多种编程语言中用%操作符实现。